ようへいの日々精進XP

よかろうもん

2020 年 12 月 23 日 (水)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

レアジョブ

*FEEDBACK*

Good job.

*RANGE*
You understood the words well in our lesson.

*ACCURACY*
(1)
You said: What time wake up this morning?

Correct: What time *did you* wake up this morning?

(2)
You said: I like action movie.

Correct: I like action *movies* .

*FLUENCY*
Pauses: normal

ディスカッションで、ちゃんと喋れるようになりたいと思ってチャレンジするんだけど、今日も駄目だった。。。

夕飯

GitHub Actions の自己ホストランナーを手元の MacBook Pro 上の Docker Desktop で試す

この記事は

YAMAP エンジニア Advent Calendar 2020 の 22 日目になる予定です。

qiita.com

頑張るぞ。

tl;dr

いよいよブログに書けそうなネタが尽きてきたので、試してみた色強めのネタを書かせて頂きます。

かねてより気になっていた、Github Actions の自己ホストランナーを手元の MacBook Pro 上の Docker Desktop を利用して試してみました。

docs.github.com

自己ホストランナー

self-hosted runners

自己ホストランナーは self-hosted runners が直訳されている感じですが、以降は self-hosted runners と書かせて頂きます。

self-hosted runners は、GitHub が提供する Runner を使う代わりに自前のクラウド環境のサーバーやオンプレサーバー、Docker コンテナ等を Runner として利用する機能です。

self-hosted runners を利用することで、Github Actions の課金が発生しなくなるのはメリットだと思います。Runner のホストを管理するコストが発生しますが、カスタマイズした Runner 環境を用意出来たり、閉じた環境で Runner を構築することで、よりセキュアな CI/CD 環境を構築出来るようになると思います。

セットアップ

基本的なセットアップは、下図の通り、self-hosted runners を利用したい Github リポジトリの Actions > Self-hosted runners > Add runner をクリックして開始します。

f:id:inokara:20201223002632p:plain

以下のようにエージェントのダウンロードとインストール、リポジトリとの連携までのステップが記載されたページが表示されます。

f:id:inokara:20201223002657p:plain

おお、めっちゃ簡単。

Download の部分を Docker コンテナイメージに封じ込めて、Configure の部分は、コンテナを起動した後、手動でコマンドを実行するようにしたいと思います。(後ほど記載します)

self-hosted runners 環境を Docker で作る

コンテナの起動

こちらの記事を参考にさせて頂いて、Dockerfile を用意しました。

Docker on Docker でコンテナイメージをビルドしたり、AWS CLI を使った処理を実行したいので、Docker をインストールしたり、AWS CLI をインストールしたりしています。

FROM ubuntu:bionic

ENV DEBIAN_FRONTEND noninteractive

RUN apt update && apt install language-pack-ja sudo curl apt-transport-https awscli \
    ca-certificates \
    gnupg-agent \
    software-properties-common --yes
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
RUN apt-key fingerprint 0EBFCD88
RUN add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
RUN apt update && apt-get install docker-ce docker-ce-cli containerd.io --yes

ENV TZ Asia/Tokyo
ENV LANG ja_JP.UTF-8

RUN useradd runner -m && echo runner:secret | chpasswd

USER runner
WORKDIR /home/runner

RUN mkdir actions-runner && cd actions-runner
RUN curl -O -L https://github.com/actions/runner/releases/download/v2.275.1/actions-runner-linux-x64-2.275.1.tar.gz
RUN tar xzf ./actions-runner-linux-x64-2.275.1.tar.gz

USER root

RUN ./bin/installdependencies.sh
RUN gpasswd -a runner sudo && gpasswd -a runner docker

一応、docker-compose.yml でコンテナを起動出来るようにしています。

version: '3.7'

services:
  self-host:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    tty: true

以下のようにコンテナを起動します。

$ docker-compose build
$ docker-compose up -d

そして、Docker on Docker を実現する為、以下のコマンドを実行します。

$ docker-compose exec self-host sh -c 'chgrp docker /var/run/docker.sock'

Runner のセットアップ

以下のように実行して、Github リポジトリとの連携を設定します。

docker-compose exec --user runner self-host sh -c 'cd $WORKDIR && ./config.sh --url https://github.com/${ORG_NAME}/${REPO_NAME} --token ${TOKEN}'

実行すると、以下のように、いくつかの質問に答える必要があります。

--------------------------------------------------------------------------------
|        ____ _ _   _   _       _          _        _   _                      |
|       / ___(_) |_| | | |_   _| |__      / \   ___| |_(_) ___  _ __  ___      |
|      | |  _| | __| |_| | | | | '_ \    / _ \ / __| __| |/ _ \| '_ \/ __|     |
|      | |_| | | |_|  _  | |_| | |_) |  / ___ \ (__| |_| | (_) | | | \__ \     |
|       \____|_|\__|_| |_|\__,_|_.__/  /_/   \_\___|\__|_|\___/|_| |_|___/     |
|                                                                              |
|                       Self-hosted runner registration                        |
|                                                                              |
--------------------------------------------------------------------------------

# Authentication


√ Connected to GitHub

# Runner Registration

Enter the name of runner: [press Enter for a0c4fc82adb6] docker-self-host

This runner will have the following labels: 'self-hosted', 'Linux', 'X64'
Enter any additional labels (ex. label-1,label-2): [press Enter to skip]

√ Runner successfully added
√ Runner connection is good

# Runner settings

Enter name of work folder: [press Enter for _work]

√ Settings Saved.

リポジトリ側の設定をみると、以下のように連携した Runner が追加されていました。

f:id:inokara:20201223002856p:plain

self-hosted runners の起動

後は以下のように実行して Runner を起動します。

$ docker-compose exec --user runner self-host sh -c 'cd $WORKDIR && ./run.sh'

以下のように出力されます。

√ Connected to GitHub

2020-12-22 15:04:29Z: Listening for Jobs

リポジトリ側の設定をみると、以下のように連携した Runner の状態が Idle 状態になりました。

f:id:inokara:20201223002916p:plain

Runner を使ったジョブの実行

Actions YAML

以下のような Actions YAML (この呼び方が正しいか不明) を書きました。

name: sandbox

on:
  push:
    branches:
      - 'master'
      - 'main'

jobs:
  sandbox:
    runs-on: self-hosted
    env: 
      S3_TARGET_BUCKET: ${{ secrets.S3_TARGET_BUCKET }}

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          role-to-assume: ${{ secrets.AWS_ASSUME_ROLE_ARN }}
          aws-region: ap-northeast-1
          role-duration-seconds: 900

      - name: Test1
        run: |
          cat /etc/lsb-release

      - name: Test2
        run: |
          docker build -t test1 .

      - name: Test3
        run: |
          aws --version

肝は runs-on: self-hosted です。というか、これだけで変えられるのは簡単ですね。

実行結果

リポジトリに push してしばらくすると、以下のように Runner のログが出力されました。

2020-12-22 15:10:26Z: Running job: sandbox
2020-12-22 15:10:42Z: Job sandbox completed with result: Succeeded

リポジトリの Actions ジョブの結果も以下のように正常に終了していました。

f:id:inokara:20201223002934p:plain

良い感じですね!

以上

GitHub Actions の自己ホストランナーを手元の MacBook Pro 上の Docker Desktop で試してみました。思ったよりも簡単で驚いています。

引き続き、深堀りしていこうかなと思います。

参考

docs.github.com

nju33.com

techblog.exawizards.com

2020 年 12 月 22 日 (🔥)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

  • 補強 (なんちゃって体幹レーニング 3 セット、30 分エアロバイク (負荷 8)) + (30 秒ダッシュ漕ぎ x 5 Rest: 30 秒)
  • エアロバイクの負荷が物足りない感じになってきた

レアジョブ

続・いつも先生がお休みを理由に自分もお休みの法則。

夕飯

2020 年 12 月 21 日 (月)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

レアジョブ

いつも先生がお休みを理由に自分もお休みの法則。

夕飯

おごちそうさまでした。

2020 年 12 月 20 日 (日)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

レアジョブ

先生が苦笑いするほどグダグダのフィードバック。

*FEEDBACK*

Good job.

*RANGE*
(1)
anywhere - any place

*ACCURACY*
(1)
You said: I watching movies and listening music and reading books.

Correct: I watch movies, listen to music, and read books.

(2)
You said: Do you usually do on the weekend?

Correct: What do you usually do on the weekend?

*FLUENCY*
Pauses: sometimes
Fillers: "ah..." sometimes

夕飯

ECS クラスタをコマンドラインである程度操作出来る ecm というツールについて紹介させて下さい

この記事は

YAMAP エンジニア Advent Calendar 2020 の 21 日目になる予定です。

qiita.com

頑張るぞ。

tl;dr

YAMAP では、アプリケーションの多くを ECS で運用しています。

ECS クラスタ自体は、構築してしまうと、殆ど手がかからないのが魅力の一つですが、唯一、メンテナンスが必要なのが AMI のバージョンアップです。(Fargate であれば、この限りではありません)

クラスタ一覧の取得を自分の好みの情報で出力させたいという思いもあり、AMI メンテナンス作業を出来るだけ手軽に行う為、ちょっとしたコマンドラインツールを作って利用しているので紹介させて下さい。

課題

ECS クラスタを運用管理する際に、個人的に解決したいと思っていたのは、以下のような課題です。

  • クラスタ一覧表示に ecs-agent のバージョンも出力させたい
  • クラスタ一覧表示は、Fargate と EC2 Backend が混在しているので、フィルタしたい
  • そもそも、マネジメントコンソールにアクセスするのが面倒くさいので、コマンドラインで完結出来ないか
  • コマンドラインで操作出来れば、自動化もしやすいのではないか

これらの課題を解決する為、コマンドラインツールを作ってみました。

それが、ecm です。

ecm

リポジトリ

以下の通りです。

github.com

ライセンスは MIT ライセンスです。

インストールは、取り急ぎ、こちら からパスが通ったディレクトリに放り込めば OK です。

ecm で出来ること

ecm では、先述の個人的な課題を解決する為、以下のような操作が行えるように頑張りました。

  • ECS クラスタの一覧表示
    • Launch Type
    • Container Instance 数
    • Running Task 数
    • Pending Task 数
    • Status
    • クラスタ内の Agent Version の状態 (※ Launch Type が EC2 の場合)
  • ECS クラスタ内のコンテナインスタンスのドレイニング
    • Agent Version を指定した一括ドレイニング
    • コンテナインスタンスを指定した個別ドレイニング

ecm で出来ないこと

以下については、別のツールで管理しているので、ecm には実装していません。

ということで、以降、ecm の使い方について簡単に紹介させて頂きます。

使い方

AWS クレデンシャルを設定

ecmdirenv を利用することを前提で実装されています。

# .envrc
export AWS_PROFILE=YOUR_PROFILE_NAME
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_REGION=ap-northeast-1

設定したら、以下のように設定を有効化します。

$ direnv allow

ヘルプ

  • 実行例
$ ecm --help
  • 出力例

f:id:inokara:20201220183322p:plain

クラスタ一覧取得

  • 実行例
$ ecm
  • 出力例

f:id:inokara:20201220183340p:plain

-type オプションで Launch Type を指定出来ます。

  • 実行例
$ ecm -type=[EC2|FARGATE]
  • 出力例

f:id:inokara:20201220183632p:plain

複数の Agent Version が同一クラスタ内で稼働している場合、AGENT VERSIONS には Mixed Version と表示されます。

クラスタインスタンス一覧取得

  • 実行例
$ ecm -cluster=sample-cluster
  • 出力例

f:id:inokara:20201220183459p:plain

クラスタインスタンスのドレイニング

  • 実行例
# ${AGENT VERSION} ではない、Agent Version が動いているコンテナインスタンスをまとめて draining する
$ ecm -cluster=${CLUSTER NAME} -drain-all -agent-version=${AGENT VERSION}

例えば、最新の Agent Version が、1.47.0 で、1.47.0 以外の Agent Version が動いているインスタンスをすべて drain したい場合には、以下のように実行します。

$ ecm -cluster=sample-cluster -drain-all -agent-version=1.47.0
  • 実行例
# drain したい ${CONTAINER INSTNACE} を指定する
$ ecm -cluser=${CLUSTER NAME} -drain -instance=${CONTAINER INSTNACE}

尚、全てのクラスタインスタンスを一気にドレイニングする場合、一旦、AutoScaling でクラスタ内のインスタンスを増やしてからドレイニングする必要があります。尚、AutoScaling グループ内のインスタンス台数を操作する際には、これまた拙作の asg というツールを使うことで、マネジメントコンソールをポチポチしなくても、コマンドラインから実行出来ます。

github.com

以上

以上、簡単にオレオレツール ecm について紹介させて頂きました。ecm を利用することで、当初、ポチポチ作業で 2 〜 3 時間掛かっていた ECS の AMI 更新作業が 1 時間程度まで短縮することが出来ました。

奥さんの ThinkPad E14 Gen2 をこっそりと自分仕様にしてみた

この記事は

YAMAP エンジニア Advent Calendar 2020 の 18 日目になる予定です。

qiita.com

頑張るぞ。

tl;dr

奥さんが、毎晩のご飯のお品書きを毛筆で書くようになって、その作品を掲載するホームページを作ったりし始めた流れで、奥さん専用のパソコンを手配しました。

www.hiromi-oshinagaki.com

手配したパソコンは ThinkPad E14 Gen2 という最近発売されたレノボのラップトップです。この奥さん専用のラップトップに、初期セットアップのサポートと称して自分用の Windows アカウントを作成して、自分仕様にセットアップしたのでメモしておきます。

ThinkPad E14 Gen2

インテル or AMD

ThinkPad E14 Gen2 は、第11世代 (Tiger Lake) インテルプロセッサを搭載した ThinkPad の中で最も廉価版である E シリーズの最新バージョンとのことです。詳細なハードウェアに関する特徴については、他の記事を参照頂ければと思います。

www.lenovo.com

ThinkPad E14 Gen2 でインターネットを検索すると、本機の情報よりも AMD のプロセッサを搭載したモデルのレビュー記事をよく見かけますが、このモデルは最近リリースされた為か、あまりレビュー記事を見つけることが出来ませんでした。

川原家最強モデル

今回、我が家にやってきた ThinkPad E14 Gen2 (以後、ThinkPad と記載) は、将来的に奥さんが PhotoshopIllustrator などの Adobe 製品を利用する可能性があることを想定して、CPU やメモリについては妥協せずに搭載することにしました。

ざっくりと以下のようなスペックです。

外部 GPUNVIDIA GeForce MX450 (2GB GDDR6) を追加しなかったのが、今になって少し後悔していますが、テンコ盛りで川原家の最強スペックとなりました。

納期

発注当初は、納期が 4 ~ 6 週間ほどかかるとのことで、11 月の下旬に発注して、最悪は年明けかなと考えていたら、先日 (発注して 4 週間くらい) 到着しました。

そして、自分仕様に

奥さん用のセットアップはソコソコに

開封後、早速、奥さんのアカウントを設定し、必要なソフトウェアをセットアップ。約 1 時間程度で完了。現状、まだ利用するソフトウェアも少ないことから、本当に簡単に終了。

そして、自分仕様に

自分仕様のゴール

自分仕様のゴールとして、以下のようなセットアップを行いたいと思います。

  • WSL2 を導入
  • VSCode を導入して、WSL2 と連携させる
  • Docker Desktop を導入して、WSL2 と連携させる
  • その他、細かい設定

とりあえず、業務でも利用出来そうな環境を作るべく、奥さんの目を盗みつつ、セットアップしていきたいと思います (実際に業務で使うことはありません)

自分用のアカウントを作成

まずは、自分用のアカウントを作成。とりあえず、ローカルアカウントで作成しました。

WSL2 の導入

以下の記事を参考にさせて頂いて、WSL2 を導入しました。

qiita.com

上記の記事通りにセットアップすることで、特にハマることなく WSL2 を導入することが出来ました。

VSCode を導入にして WSL2 と連携させる

連携させるという文言が、慣れていない感を醸し出していると思いますが、以下の記事を参考にさせて頂いて、こちらも簡単に WSL2 と VSCode を連携させることが出来ました。

qiita.com

引き続き、Docker Desktop との連携についても、上記の記事を参考にさせて頂いて、特にハマることなく連携させることが出来ました。

とっても簡単でビビりました。

VSCode 上から、WSL2 上の Docker を操作している図です。

f:id:inokara:20201220005330p:plain

まだまだ色々と混乱しているところがありますが、とにかく感動してしまいました。

そして、個人的に究極のカスタマイズを

CapsLock キーを ctrl キーに変更出来る Ctrl2cap をインストールしました。

ということで

この記事は、こっそりと自分仕様にカスタマイズした ThinkPad E14 Gen2 でしたためています。

久しぶりに Windows を触ってみましたが、Windows 7 と比べても十二分に macOS 上に構築するのと同等のモダンな開発環境を構築できることにとても驚きました (但し、これはあくまでも自分の感覚ですし、自分が求める開発環境というのはたかが知れています) 。

そして、ThinkPad E14 Gen2 の質感の高さに脱毛、もとい、脱帽でした。自分の ThinkPad E シリーズに対する期待を良い意味で裏切ってくれたと思います。本当に自分用にもう一台欲しくなってきました。

2020 年 12 月 19 日 (土)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

  • 補強 (なんちゃって体幹レーニング 3 セット、30 分エアロバイク (負荷 8)) + (30 秒ダッシュ漕ぎ x 5 Rest: 30 秒)
  • 何だかんだ言ってキツカッタ。。。

レアジョブ

  • お休み

夕飯

  • タコしゃぶとアジのお刺身、とてもおいしゅうございました

父とペアプロ

お疲れ様でした。

WordPress や WordPress プラグインのバージョンアップに出来るだけ追従していく運用の一例

この記事は

YAMAP エンジニア Advent Calendar 2020 の 18 日目になる予定です。

qiita.com

頑張るぞ。

tl;dr

WordPress で構築されたサイトをいくつか管理していますが、WordPressWordPress のバージョン更新に追従できておらず、気付いたら、セキュリティパッチの適用等の作業が後回しになってしまう状況になっておりました。

このような状況を解消すべく、シェルスクリプトと CircleCI のスケジュールジョブを利用して、バージョンアップに追従していく仕組みを作ったので、紹介させて頂きたいと思います。

課題

複数の WordPress 環境を自前で運用するにあたり、以下のような課題を抱えておりました。

WordPress 本体やプラグインのバージョンアップにどうやって追従していくか

WordPress 環境を構築する度に、「どうしようかなあ」と思いつつ、手つかずのままで今日に至ります。

こうしてみた

幸い

WordPress 環境は Docker (AWS の ECS 上で) で運用される為、WordPress のバージョンやプラグイン、Web サーバーの設定等の WordPress 環境の構成は Dockerfile に記述されていました。

以下、Dockerfile のサンプルです。

Dockerfile

FROM wordpress:5.6.0

... 略 ...

# 依存するコマンドをインストール
RUN apt-get update
RUN apt-get -y install wget unzip

# プラグインファイルの一時ダウンロード先へ移動
WORKDIR /tmp/wp-plugins

# プラグインファイルをダウンロード
RUN wget https://downloads.wordpress.org/plugin/all-in-one-seo-pack.3.7.1.zip
RUN wget https://downloads.wordpress.org/plugin/jetpack.9.2.1.zip
...

更に ECS 環境へのデプロイは git push をトリガーとして CircleCI を利用して行われるように実装されていました。CircleCI 上で CI/CD が管理されていることにより、CircleCI に用意されている各種機能、特に今回は、定期実行 (ワークフローのスケジュール実行) を利用して定期的に WordPress のバージョンやプラグインのバージョンの更新をチェックすることが出来ました。

WordPressプラグインの最新バージョン情報を取得する

WordPress 本体や、プラグインの最新バージョンの情報は WordPress.org が提供する REST API を利用して取得出来ます。jq 等を絡めて実行されることを想定しています。

# WordPress 本体の最新バージョンを取得する
$ curl -s https://api.wordpress.org/core/version-check/1.7/ | jq -r '.offers|first|.version'

# プラグインの最新バージョン情報を取得する
$ curl -s https://api.wordpress.org/plugins/info/1.0/${PLUGIN_NAME}.json | jq -r .version

以下、実行例です。

$ curl -s https://api.wordpress.org/core/version-check/1.7/ | jq -r '.offers|first|.version'
5.6

$ curl -s https://api.wordpress.org/plugins/info/1.0/jetpack.json | jq -r .version
9.2.1

稼働しているバージョンと比較する

こちらのブログ記事を参考にさせて頂き、REST API を利用して、最新のバージョンを取得出来ることが判りました。後は、既に稼働している WordPressプラグインのバージョンを取得して、最新のバージョンとの比較を行う必要があります。

先述の通り、既に稼働している WordPress 環境は Dockerfile 記述されている為、grepawk 等を駆使して Dockerfile から稼働中のバージョン情報を取得出るので、以下のようなシェルスクリプトを書いて、最新のバージョンと稼働中のバージョンを比較します。

ver-check

#!/bin/bash

SLACK_USERNAME="${CIRCLE_PROJECT_REPONAME:-WordPress Version Check}"

rm -f /tmp/version_checked && touch /tmp/version_checked

WP_CURRENT_VERSION=$(cat ${DOCKER_FILE_PATH} | grep "FROM wordpress:" | awk -F: '{print $NF}' | grep -o -E "([0-9]+\.){1}[0-9]?")
PLUGINS=$(cat ../docker/Dockerfile | grep download | awk -F/ '{print $NF}')

WP_LATEST_VERSION=$(curl -s https://api.wordpress.org/core/version-check/1.7/ |jq -r '.offers|first|.version')
diff -u -i <(echo $WP_CURRENT_VERSION) <(echo $WP_LATEST_VERSION)
if [ "$?" != "0" ];then
  printf "WordPress $WP_CURRENT_VERSION $WP_LATEST_VERSION\n" >> /tmp/version_checked
fi

for plugin in ${PLUGINS}
do
  name=$(echo $plugin | awk -F. '{print $1}')
  current_version=$(echo $plugin | grep -o -E "(\.[0-9]+|\.[0-9]+\.){1}[0-9]+(\.[0-9]+)?" | sed 's/.//')
  latest_version=$(curl -s https://api.wordpress.org/plugins/info/1.0/"${name}".json | jq -r .version)
  # printf "$name $current_version $latest_version\n"
  diff -u -i <(echo $current_version) <(echo $latest_version)
  if [ "$?" != "0" ];then
    printf "$name $current_version -> $latest_version\n" >> /tmp/version_checked
  fi
done

SIZE=$(wc -c < /tmp/version_checked)
if [ $SIZE -gt 0 ];then
  echo "There are differences between some of the versions."
  cat /tmp/version_checked
  JSON_MESSAGE="{ \"icon_emoji\": \":wordpress:\", \"username\": \"${SLACK_USERNAME}\", \"text\": \"There are differences between some of the versions.\n\`\`\`$(cat /tmp/version_checked)\`\`\`\" }"
  curl -s -X POST -H "Content-Type: application/json" \
    "${SLACK_WEBHOOK_URL}" \
    -d "${JSON_MESSAGE}" > /dev/null
else
  echo "All versions are up to date."
fi

だいぶん、雑に書いてしまっているので、色々とツッコミどころはあります。ご容赦下さい :bow:

以下、スクリプトを実行したら、WordPress 本体とプラグインに差分が発生した (稼働中のバージョンよりも新しいバージョンが提供されていた) 状況です。

$ ./ver-check
--- /dev/fd/63  2020-12-18 16:44:28.000000000 +0900
+++ /dev/fd/62  2020-12-18 16:44:28.000000000 +0900
@@ -1 +1 @@
-5.3
+5.6
--- /dev/fd/63  2020-12-18 16:44:33.000000000 +0900
+++ /dev/fd/62  2020-12-18 16:44:33.000000000 +0900
@@ -1 +1 @@
-9.2.0
+9.2.1
There are differences between some of the versions.
WordPress 5.3 -> 5.6
jetpack 9.2.0 -> 9.2.1

そして、以下のように Slack に通知が飛んできます。

f:id:inokara:20201218235350p:plain

そして、自動化へ。。。

差分チェックは一日に一回実行します。実行する基盤として、冒頭に記載した通り、CircleCI のワークフローのスケジュール実行を利用します。

以下のように .circleci/config.yml を設定しました。

.circleci/config.yml

version: 2.1
... 略 ...
jobs:
  vercheck:
    executor: default
    steps:
      - checkout
      - install_dependencies
      - run:
          name: Check WordPress, Plugins Versions
          command: |
            cd bin && ./ver-check 
... 略 ...
workflows:
  version: 2

  ver-check:
    triggers:
      - schedule:
          cron: "0 0 * * *"
          filters:
            branches:
              only:
                - master
    jobs:
      - vercheck

午前 9 時に実行されるように設定しています。

CircleCI の回し者ではありませんが、YAML をシュッと書いて、簡単に定期処理を設定出来るのは良いですね!

苦労したところ

唯一、苦労したのが、プラグインバージョン文字列のパースです。

当初、以下のようなバージョン文字列しか想定していませんでした。

plugin-name.{x}.{y}.{z}.zip

この文字列から、x.y.z のみを取り出したい場合、取り出し方は色々とパターンがあると思いますが、当初は、正規表現を使って、以下のように書きました。

grep -o -E "([0-9]+\.){1}[0-9]+(\.[0-9]+)?"

以下、実行例です。

$ echo 'plugin-name.1.2.3.zip' | grep -o -E "([0-9]+\.){1}[0-9]+(\.[0-9]+)?"
1.2.3

とーころが、プラグインのバージョン番号が、先述のような規則に則っていないプラグインがありました。

plugin-name.YYYYMMDD.zip

おいおい、更に、以下のようにプラグイン名の末尾に数字が含まれているプラグインもありました。

plugin-name-7.{x}.{y}.{z}.zip

これらのパターンだと、先述の正規表現パターンにはマッチしません。。。orz ということで、最終的に以下のように対応しました。

$ echo 'plugin-name.12345678.zip' | grep -o -E "(\.[0-9]+|\.[0-9]+\.){1}[0-9]+(\.[0-9]+)?"
.12345678

$ echo 'plugin-name-7.1.2.3.zip' | grep -o -E "(\.[0-9]+|\.[0-9]+\.){1}[0-9]+(\.[0-9]+)?"
.1.2.3

ただ、これでは不十分で、先頭の .sed 's/.//' で削除する処理を追加しています。

何を隠そう、このあたりの処理について、自分は特に不得意で試行錯誤の結果となります。もっと、こうやったらシンプルだよなどのありましたら助言を頂けると嬉しいです。

通知が届いた後のフロー

ということで、この仕込んだバージョンチェックの通知が届いたら、以下のように対応するようにしています。

  1. バージョンアップ対象のリリースノートを確認して、バージョンアップの内容を確認
  2. Dockerfile を修正し、開発環境にデプロイ
  3. 開発環境で動作確認
  4. 開発環境での動作確認で問題なければ、本番環境にリリース

このようなフローが取れるのは、以下のような仕込みが既に入っていたことが大きいと考えています。

  • Docker 化されていること
  • Github と CircleCI でデプロイ出来るようになっていること

先人の努力に本当に感謝です。

以上

最近、ギョームでやったこととして、WordPress 運用をちょっと工夫してみた内容について書いてみました。この施策により、手数 (てかず) 自体は減ってはいませんが、古いバージョンのアプリケーションが動き続けるという好ましくない状況を放置するということは無くなったと思います。

参考

codex.wordpress.org

2020 年 12 月 18 日 (金)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

  • 補強 (なんちゃって体幹レーニング 3 セット、30 分エアロバイク (負荷 8)) + (30 秒ダッシュ漕ぎ x 5 Rest: 30 秒)
  • 30 秒ダッシュ漕ぎ、最近、なんとなく慣れてきた感がある

レアジョブ

前回の復習で同じ Lesson を受講して、以下のフィードバックを頂いた。

*FEEDBACK*

Great job.

*RANGE*
--

*ACCURACY*
(1)
You said: I want _to_ that.

Better: I want that.

(2)
You said: Once year.

Correct: Once *a* year.

*FLUENCY*
Pauses: sometimes

引き続き、中一レベル。

夕飯