ようへいの日々精進XP

よかろうもん

2019 年 11 月 30 日 (土)

ジョギング

  • 博多天神周りで 50 分程
  • 懸垂 x 8
  • 今日も RINCON で走ったけど, 蹴り出しの際にどうしても左足の小指の付け根付近にズキッとした痛みが...なぜだ...

岳宴祭 (がくえんさい)

会社の社員参加型, 社員の家族までも参加型のイベントが田川のいいかねパレットで開催された.

palette.jp.net

DJ 体験, バンド体験, ドローン体験, バーベキュー等でとても楽しめた. 準備にとても大変だったと思う. 大変お疲れ様でした.

2019 年 11 月 29 日 (金)

ジョギング

  • 博多, 天神ぐるっと 10 キロ, 48 分くらい
  • RINCON で走った!

初 #rincon で朝ランしてきた。10 キロを 48 分くらい。後ろから押されているような感覚でグイグイ走れたけど、ちょっと靴擦れが出来たりして慣れが必要な感じだった。ちなみに、アンバランスなソックスはカラオケスナック #くの一 で 91 点の景品。

ギョーム

  • なんか色々やったけど, 夕方からの WordPress 業が辛すぎて, それしか記憶に残っていない
  • WordPress が悪いわけではなくて, 多分, 色々と運用設計の詰めが甘かったと猛省している

あと, Terraform 業と CircleCI 業, AWS CDK をやる時間は取れなかった.

夕飯

  • だいぶん遅く帰宅したけど, あったかご飯を用意してくれている奥さんに感謝
  • 奥さん得意の手羽中, おいしゅうございました

2019 年 11 月 28 日 (木)

ジョギング

  • 寝坊
  • 雨も降っていたので甘えた
  • 体調イマイチ

ギョーム

  • WordPress Day だった
  • Aurora の運用を頑張っていこうという気持ちになったし, PostgreSQL 力を高めたい気持ちになった

夕飯

  • タラのソテーをポン酢を少し垂らしてたべたら美味しかった (「たら」が三回くらい出てきた)
  • 奥さんのナムルが美味しくてどんぶり一杯食べた

2019 年 11 月 27 日 (水)

ジョギング

  • 深夜作業だったのでおやすみ

ギョーム

  • 深夜作業
  • 深夜作業は無事に終わったけど...終わりは始まりなのでこれからも頑張っていきたいところ

くったくた

深夜作業明けはクタクタになる. 夕飯は二夜連続の鍋で満足.

2019 年 11 月 26 日 (火)

ジョギング

  • 博多, 天神周りで 49 分, 10 キロくらい
  • 右足をかばっているのか左足に強い張り
  • 踏んだり蹴ったり感... 慎重に...

ギョーム

  • わーわーわーわーワードプレスで死にかけた
  • 今夜は今年最後の深夜麺手, 頑張ろう

リンコン

  • ホカオネリンコンが届いたとの連絡があった
  • 明日の帰り道にでも取りに行きたい

夕飯

  • 久しぶりの鍋, 困ったときの鍋

2019 年 11 月 25 日 (月)

ジョギング

  • おやすみ
  • 寝坊したというのもあり, 右足の痛みも気になったので
  • 帰宅してから簡単な筋トレ, (腕立て x 50 + 腹筋 x 30) x 2

ギョーム

  • 昨日のアラートについて確認と調査
  • メンテナンスの手順整理等
  • WordPress の WP_HOME と WP_SITEURL について, 理解に乏しかったので調査して社内キベラに書いた (ブログにも書いた)
  • PostgreSQL のサーバーパラメータについて調査, PostgreSQLソースコードを読んでみたりした
  • ヤマップのインフラ構成図を整理し始めた

夕飯

  • 手羽中のソテー, 焼き方が上手いのふっくらと仕上がって美味しい

WordPress 完全に理解した (1) 〜 定数 WP_HOME と WP_SITEURL について 〜

tl;dr

WordPress を運用していて, 個人的な調べによると, 最もやらかすのは WordPress アドレスとサイトアドレスの設定をミスってしまい, せっかく頑張って構築した WordPress サイトにアクセス出来なることではないでしょうか. 多分にもれず, 私も何度となくやらかしました.

やらかすたんびにググっていたので, 実際のその解決方法をメモっておきます.

解決方法

解決方法は複数あるようですが, 一番, お手軽な解決方法は, wp-config.php をイジって定数 WP_HOMEWP_SITEURL を定義することだと思います.

define('WP_HOME','https://oreno-wordpress.com');
define('WP_SITEURL','https://oreno-wordpress.com');

/* That's all, stop editing! Happy blogging. */

wp-config.php の 90 行目くらいに書いておくと良さそうです.

サーバーにログインして, vim が入っていなければインストール, vim で wp-config.php を修正しましょう.

せっかくなので WordPressソースコードを読んでみる

そもそも WP_HOME とか WP_SITEURL について

wpdocs.osdn.jp

上記のドキュメントを参考にさせて頂きました.

定数 詳細
WP_HOME サイトアドレスを定義する. wp_options テーブル の home の値よりも優先される. WordPress をインストールした URL
WP_SITEURL WordPress アドレスを定義する. wp_options テーブルの siteurl の値よりも優先される. WordPress にクライアントユーザーがアクセスする URL

定数の名前と定義の意味が逆のような気がして紛らわしいです...

ちなみに, wp_options テーブルのテーブル定義は以下の通りとなっていて, WordPress の稼働に必要なデータが格納されています.

mysql> DESC wp_options;
+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| option_id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| option_name  | varchar(191)        | NO   | UNI |         |                |
| option_value | longtext            | NO   |     | NULL    |                |
| autoload     | varchar(20)         | NO   |     | yes     |                |
+--------------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

さらに, 以下は手元の環境にて Docker で起動した WordPress の wp_options テーブルの中身の一部抜粋です.

mysql> SELECT option_name,option_value FROM wp_options WHERE option_name = 'home';
+-------------+-----------------------+
| option_name | option_value          |
+-------------+-----------------------+
| home        | http://localhost:8080 |
+-------------+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT option_name,option_value FROM wp_options WHERE option_name = 'siteurl';
+-------------+-----------------------+
| option_name | option_value          |
+-------------+-----------------------+
| siteurl     | http://localhost:8080 |
+-------------+-----------------------+
1 row in set (0.00 sec)

これらの値を定数 WP_HOME とか WP_SITEURL は上書きする挙動になっているということですな.

ソースコード

話題となっている WP_HOMEWP_SITEURL を呼んでいる関数はいくつかありますが, 以下のコードを読んでみたいと思います.

github.com

WP_HOMEWP_SITEURL は以下のように呼ばれています.

/**
 * Retrieve the WordPress home page URL.
 *
 * If the constant named 'WP_HOME' exists, then it will be used and returned
 * by the function. This can be used to counter the redirection on your local
 * development environment.
 *
 * @since 2.2.0
 * @access private
 *
 * @see WP_HOME
 *
 * @param string $url URL for the home location.
 * @return string Homepage location.
 */
function _config_wp_home( $url = '' ) {
    if ( defined( 'WP_HOME' ) ) {
        return untrailingslashit( WP_HOME );
    }
    return $url;
}

/**
 * Retrieve the WordPress site URL.
 *
 * If the constant named 'WP_SITEURL' is defined, then the value in that
 * constant will always be returned. This can be used for debugging a site
 * on your localhost while not having to change the database to your URL.
 *
 * @since 2.2.0
 * @access private
 *
 * @see WP_SITEURL
 *
 * @param string $url URL to set the WordPress site location.
 * @return string The WordPress Site URL.
 */
function _config_wp_siteurl( $url = '' ) {
    if ( defined( 'WP_SITEURL' ) ) {
        return untrailingslashit( WP_SITEURL );
    }
    return $url;
}

それぞれ, _config_wp_home_config_wp_siteurl という関数内で WP_HOMEWP_SITEURL が定義されているかどうかをチェックしていることがわかります. もし定義されている場合には, 定数の値を読み取って, ご丁寧に文字列の最後の / を取り除いて値を返すように実装されていました.

以上

WordPress アドレスサイトアドレス, WP_HOME, WP_SITEURL がうまく整理出来ていませんが, メモとさせて頂きます.

2019 年 11 月 24 日 (日)

ジョギング

  • 博多天神をぐるっと 49 分, 10 キロ程
  • 右足の踵周りの痛みにビクビクしながら... 早く良くならないかな...
  • 午後から博多体育館で 60 分のエアロバイク, (懸垂 x 5 + 腹筋 x 30) x 3
  • ちょっと体を動かし過ぎた感じ

クイーンズ駅伝

www.jaaf.or.jp

www.tbs.co.jp

JP日本郵政グループの 1 区を走った廣中選手の走りがルーキーとは思えない堂々と走りで度肝を抜かれた. うまく育ててもらえればすごい選手になるんじゃないかと思った.

夕飯

  • 博多体育館から帰ってきてシャワーを浴びてビールを呑んだら猛烈に眠くなって 2 時間くらい寝てしまって気付いたら夕飯が出来ていた
  • チキンのソテー, ジューシーで美味しかった

CircleCI の setup_remote_docker を設定した時に留意すべきこと 〜 追記 〜

tl;dr

前のブログの続き.

inokara.hateblo.jp

上の記事を書いている時にはてっきり setup_remote_docker を設定した時には Docker in Docker を実現していたのかと思っていたけど, なんだか setup_remote_docker という名前で Docker in Docker は違うよなーとモヤモヤしていたのでも少し深堀りしたのでメモ.

あー, リモートの Docker を利用しているんだな

以下のような .circleci/config.yml を書いて調べた.

version: 2
jobs:
  build:
    docker:
      - image: docker:19.03.5-git
    steps:
      - checkout
      - setup_remote_docker
      - run:
          name: Test
          command: |
            echo '--- ホストのグローバル IP アドレスを確認 ----------------------------'
            apk add curl
            curl httpbin.org/ip
            echo '--- env で環境変数を確認 --------------------------------------------'
            env
            echo '--- docker ps が実行出来るか確認 ------------------------------------'
            docker ps

実行結果は以下のようになった.

f:id:inokara:20191124235911p:plain

お, 新しい UI になっている. それは置いといて...

--- ホストのグローバル IP アドレスを確認 ----------------------------
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
(1/1) Installing curl (7.66.0-r0)
  0%                                             % ############################################Executing busybox-1.30.1-r2.trigger
OK: 33 MiB in 27 packages
{
  "origin": "54.234.128.201, 54.234.128.201"
}
--- env で環境変数を確認 --------------------------------------------
... 省略
DOCKER_VERSION=19.03.5
DOCKER_TLS_CERTDIR=/certs
DOCKER_HOST=tcp://35.237.215.99:2376
CIRCLE_PROJECT_USERNAME=inokappa
... 省略
--- docker ps が実行出来るか確認 ------------------------------------
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

あー, DOCKER_HOST で全く異なるホストの Docker が指定されているんですな.

以上

メモでした. なんでも試してみると良いですな.

CircleCI の setup_remote_docker を設定した時に留意すべきこと

tl;dr

今更かもしれないけど, 実際に手を動かしてみて初めて遭遇したのでメモっておく.

何が起きたか

github.com

amiCtrl のインテグレーションテスト的なテストを docker-compose でやりたくて docker-compose.yml を書いた. もちろん, ローカルマシン (macOS 上の Docker マシン) ではテストは動いたんだけど CircleCI 上で実行した場合にはどうしても動かない... と調べていたら, ドキュメントに以下のように書かれていた.

circleci.com

but volume mounting and port forwarding do not work the same way in this setup.

ほう...ローカルマシンのボリュームをマウントすることが出来ないとのこと. これは, 全く意識していなかったけど, 留意が必要.

ちなみに, 以下は .circleci/config.yml を掲載.

version: 2
jobs:
  build:
    docker:
      - image: circleci/golang:1.9.7
    steps:
      - checkout
      - setup_remote_docker
      - run:
          name: Install docker-compose
          command: |
            curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` > ~/docker-compose
            chmod +x ~/docker-compose
            sudo mv ~/docker-compose /usr/local/bin/docker-compose
      - run: 
          name: Run Test Environment
          command: |
            docker-compose up -d
      - run:
          name: Run Install Dependencies
          command: |
            docker-compose exec amictrl_circleci make ensure
      - run:
          name: Run Test
          command: |
            docker-compose exec amictrl_circleci make test

ということで

ローカルマシンのボリュームをマウントしてソースコードやテストコードを Docker コンテナ上で操作出来るようにしたかったんだけど, CircleCi 上ではローカルマシンのボリュームをコンテナにマウントすることが出来ないので, コンテナをビルドする際にソースコードを含めるようにした.

FROM golang:alpine
RUN apk update && apk add git make bash gcc libc-dev python py2-pip jq dep && pip install awscli
RUN mkdir /root/.aws && mkdir /go/src/amiCtrl
ADD ./ /go/src/amiCtrl/
RUN printf "[dummy_profile]\n\
aws_access_key_id = AKxxxxxxxxxxxxxxxxxx\n\
aws_secret_access_key = zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\n\
region = ap-northeast-1" >> /root/.aws/credentials

苦肉の策ではあるけど, 以下のようにローカルマシン上でも CircleCI 上でも意図した通りに動いてくれている.

以下はローカルマシンで実行結果.

$ docker-compose exec -T amictrl_local make test
=== RUN   TestVersionFlag
--- PASS: TestVersionFlag (2.21s)
=== RUN   TestStdoutList
--- PASS: TestStdoutList (3.62s)
=== RUN   TestStdoutCreate
--- PASS: TestStdoutCreate (2.99s)
=== RUN   TestStdoutCreateError
--- PASS: TestStdoutCreateError (2.93s)
=== RUN   TestStdoutDelete
--- PASS: TestStdoutDelete (3.91s)
=== RUN   TestStdoutDeleteError
--- PASS: TestStdoutDeleteError (3.59s)
=== RUN   TestStdoutDeleteNo
--- PASS: TestStdoutDeleteNo (3.70s)
=== RUN   TestStdoutState
--- PASS: TestStdoutState (5.08s)
=== RUN   TestStdoutJson
--- PASS: TestStdoutJson (4.88s)
PASS
ok      amiCtrl 32.913s

以下は CircleCI 上の実行結果.

f:id:inokara:20191124002300p:plain

そもそも, setup_remote_docker とは

circleci.com

上記のドキュメントではなんだか小難しく書かれているが, ビルド用の Docker コンテナ内で更に docker コマンドを利用出来るようにしたもの. Docker in Docker, Docker のマトリョーシカということだと思っている.

以下, setup_remote_docker 有り, 無しの違い.

version: 2
jobs:
  build:
    docker:
      - image: docker:19.03.5-git
    steps:
      - checkout
      - run:
          name: Test
          command: |
            docker info

setup_remote_docker を付与していない場合には, 下図のようにビルドは失敗する.

f:id:inokara:20191124082706p:plain

setup_remote_docker を付与している場合.

version: 2
jobs:
  build:
    docker:
      - image: docker:19.03.5-git
    steps:
      - checkout
      - setup_remote_docker
      - run:
          name: Test
          command: |
            docker info

下図のように docker info の結果がちゃんと返ってくる.

f:id:inokara:20191124082946p:plain

なーんだ, 普通の Docker じゃないかーと思って油断していると, 今回のようにホスト (こやつも Docker コンテナ) のボリュームをマウント出来ないという制約があるので注意が必要というお話.

以上

現場からの報告でした.