May the Neural Networks be with you

ニューラルネットワークと共にあらんことを

GitHub Actionsで最新のmecab-ipadic-neologd辞書を持つdocker imageをDocker Hubにpushする

こんにちは@shunk031です。草津温泉からこの記事を書いています。温泉は良いぞ。

この記事は彌冨研 Advent Calendar 2019 17日目の記事です。

f:id:shunk031:20191217000530p:plain
クジラ(docker)の上に乗るタコ(Octcat)とめかぶ(MeCab

私のレポジトリshunk031/mecab-neologd-py3では、最新のmecab-ipadic-neologdを持つpython3用のdocker imageをTravisCIを使って定期的にビルドし、Docker Hubにpushしています。 今回はGitHub Actions公開に伴い、TravisCIからの乗り換えを行います。

github.com

以下、2019年12月現在の情報です。

GitHub Actionsを有効にする

まずはGitHub Actionsを有効にします。 こちらから指示に従ってGitHub Actionsにアクセスできるようにします。

Sign up for the beta をクリックして進みます。

f:id:shunk031:20191113082526p:plain
Features • GitHub Actions https://github.com/features/actions

自身のユーザーアカウントが選択されている状態で Register for GitHub Actions Beta をクリックします。

f:id:shunk031:20191122163716p:plain
GitHub Actionsに登録します

はい、完了です。早いですね。では対象のレポジトリで Actions タブが現れていることを確認します。

f:id:shunk031:20191122163558p:plain
これでGitHub Actionsにアクセスできるようになりました。

Actions タブが追加されています。今後はこのタブから設定を追加していきます。

f:id:shunk031:20191113082403p:plain
shunk031/mecab-neologd-py3: My dockernized mecab-ipadic-neologd with mecab-python3 https://github.com/shunk031/mecab-neologd-py3

GitHub Actionsでdocker imageをビルドする

GitHub Actionsでdocker imageをビルドするワークフローを定義します。 Actions タブを選択すると、レポジトリの内容から自動的にマッチするワークフローがサジェストされています。今回は以下の Docker image ワークフローをベースに、docker imageをビルドするワークフローを定義します。

f:id:shunk031:20191122163840p:plain
Actionsタブが追加されています。

以下が完成したワークフローです。GitHub Actionsのワークフローはyaml形式で記述します。

name: Docker Image CI

on:
  push:
  schedule:
    - cron: "0 0 * * 2,5"

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@master
      
    - name: Sign in Docker Hub
      run: docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_PASSWORD }}
      
    - name: Build and push Docker image
      run: |
        docker build -t shunk031/mecab-neologd-py3 .
        export TAG=`date +%Y.%m.%d`
        docker tag shunk031/mecab-neologd-py3 shunk031/mecab-neologd-py3:$TAG
        docker push shunk031/mecab-neologd-py3:$TAG
        docker tag shunk031/mecab-neologd-py3 shunk031/mecab-neologd-py3:latest
        docker push shunk031/mecab-neologd-py3:latest

steps にワークフローの各ステップを記述します。今回Docker Hubにdocker imageをpushするにあたり、Docker HubへのログインDocker imageのbuildとpush にステップを分けて実行させました。

Docker Hubへのログイン

Sign in Docker Hub と名前をつけたステップに、Docker Hubへのログイン処理を記述しました。ログインするにあたり、Docker Hubの usernamepassword が必要になるため、Secrets 画面にて DOCKER_HUB_USERNAMEDOEKCER_HUB_PASSWORD を設定しました。これらの変数は表からは直接見えないように暗号化されます。

f:id:shunk031:20191216231609p:plain
Secrets

このようにSecretsで設定した変数はyamlファイル内で ${{ secrets.DOCKER_HUB_USERNAME }} のように参照することが可能です。

Docker imageのbuildとpush

Build and push Docker image と名前をつけたステップに、docker imageのビルド等の処理を記述しました。

私の場合、最新の辞書を持ったimageがlatestになるよう、またビルドした日付をタグに付与しています。日々新語や道語に対応し変化する辞書の任意の時点でのimageを取得したいというモチベーションです。

cronを用いた定期的なbuildとpush

mecab-ipadic-neologdは月曜と木曜に更新されます*1。したがって、その翌日の火曜と金曜に新しい辞書を取り込んだdocker imageのビルドを schedulecron 機能で自動ビルドを実現します。

設定方法はlinuxのcronと同様のフォーマットで記述します。私はcronのフォーマットをいつもググって確認しているのですが、以下のようにポップアップで実行される時間が表示されるのでとても便利です。

f:id:shunk031:20191216234529p:plain
実行される時間が表示される。便利。

(おまけ) READMEにバッジを付ける

ここまででGitHub Actionsで最新のmecab-ipadic-neologd辞書を持つdocker imageをDocker Hubにpushできるようにしました。おまけとしてワークフローが正しく実行されるかひと目で確認できるバッジをREADMEに追加します。

f:id:shunk031:20191122210401p:plain
完成

READMEにバッジを貼る際に必要なURLは https://github.com/(username)/(repository)/workflows/(workflow_name)/badge.svg で取得可能です。 workflow_name は ワークフローを記述するyaml の先頭にある name です。

READMEにバッジをつけるととてもそれっぽくなるので好きです。

おわりに

GitHub Actionsで最新のmecab-ipadic-neologd辞書を持つdocker imageをDocker Hubにpushするまでの工程を確認しました。GitHubがネイティブに提供するCI/CD環境はあたりまえですがGitHubと親和性が高く、これが無料*2で使えるというのは素晴らしいです。

Acknowledgement

mecab-ipadic-neologdにはいつもお世話になっております。作者の Toshinori Sato (@overlast)さま、ありがとうございます!