Travis CIによるNikolaブログ構築の自動化

Travis CIによるNikolaブログ構築の自動化

Nikolaでブログを構築するための方法は過去の記事(1, 2, 3)に書いていますが、手元でのビルドのためにpythonやnikolaがインストールされたPCが必要になるため、ブログ記事を書くための環境が限定されてしまうという問題がありました。 そこで、この記事ではNikola公式の記事を参考に、Travis CIを用いることでsrcブランチにブログ記事をコミットするだけでTravis CI側で自動的にブログを構築し、masterブランチにプッシュしてくれる仕組みを構築する過程を紹介します。 なお、以下の作業はすべてsrcブランチ上で行います。

conf.pyの編集

まず、nikola github_deployコマンド実行時に、デプロイと同時にsrcブランチもコミットするかどうかを制御するためのオプションをFalseに設定します。

GITHUB_COMMIT_SOURCE = False

これはTravis CIではソースブランチへのコミットをトリガーにnikola build && nikola github_deployを実行するため、nikola github_deployによってsrcブランチがコミットされると再度それがトリガーとなって無限ループに陥ってしまうことを防ぐためです。

.travis.ymlの作成

nikolaブログのルートディレクトリ(conf.pyが置いてあるディレクトリ)に以下のような.travis.ymlファイルを作成します。 これはNikola公式の記事に記載のtravis.ymlを改変したものになります。

※2019/4/8追記, travis CIでのビルドに失敗する対策のissueの内容を反映

language: python
cache: apt
sudo: false
addons:
  apt:
    packages:
    - language-pack-ja-base
    - language-pack-ja
branches:
  only:
  - src
python:
- 3.6
before_install:
- git config --global user.name 'USERNAME'
- git config --global user.email 'travis@invalid'
- git config --global push.default 'simple'
- pip install --upgrade pip wheel
- echo -e 'Host github.com\n    StrictHostKeyChecking no' >> ~/.ssh/config
- eval "$(ssh-agent -s)"
- chmod 600 id_rsa
- ssh-add id_rsa
- git remote rm origin
- git remote add origin git@github.com:USERNAME/REPO.git
- git fetch origin master
- git branch master FETCH_HEAD
install:
- pip install 'ghp-import2'
- pip install 'webassets'
- pip install -U --upgrade-strategy=eager 'Nikola[extras]'
script:
- nikola build && nikola github_deploy -m 'Nikola auto deploy [ci skip]'
notifications:
  email:
    on_success: change
    on_failure: always

ここで、

- git config --global user.name 'USERNAME'
- git config --global user.email 'travis@invalid'

の行は適切なユーザー名、メールアドレスに、

- git remote add origin git@github.com:USERNAME/REPO.git

の行は適切なユーザー名およびリポジトリ名に変更する必要があります。

SSH鍵の生成

まず、.gitignoreファイルにid_rsaid_rsa.pubを無視する設定を追記した上でSSH鍵を生成します。

$ echo id_rsa >> .gitignore
$ echo id_rsa.pub >> .gitignore
$ ssh-keygen -C TravisCI -f id_rsa -N ''

上記を実行すると秘密鍵id_rsaおよび公開鍵id_rsa.pubが作成されます。 念のため、.gitignoreの無視設定が合っているかを確認するためにgit statusを実行してもaddされる対象となっていないことを確認しておきましょう。 なおssh-keygen-Cはコメント、-fは鍵名、-Nはパスフレーズの指定(ここでは空文字なので指定なし)です。

公開鍵のgithubリポジトリへの登録

生成した公開鍵はgithubリポジトリに登録しておく必要があります。 リポジトリページ -> Settings -> Deploy Keys -> Add deploy key からTitleをTravis CIとし、Keyにidrsa.pubの中身をコピペして登録しましょう。 また、Allow write accessはチェックしておく必要があります。 これらの作業を忘れるとTravis CIの自動ビルド時にアクセスエラーが発生します。

travis encrypt-fileコマンドによる秘密鍵の暗号化

生成した秘密鍵id_rsatravis encrypt-fileによってid_rsa.encに共通鍵による暗号化を施した上でリポジトリに追加します。 この暗号化されたid_rsa.encはTravis CIでの自動ビルド時に共通鍵によって復号化され、Travis CIのgithubへのアクセスに使用されます。

この作業を実行するためにはtravisコマンドが必要となりますが、これはrubyのgemとして配布されているため、インストールされていない場合は下記にようにgemでインストールする必要があります。

$ gem install --user-install travis

なおtravisコマンドがインストールされる場所にPATHが通っていない場合はPATHに追加するか、下記一連のコマンドをフルパスで実行する必要があります。

travisコマンドが実行可能になったら、更に下記を実行します。

$ travis login
$ travis enable
$ travis encrypt-file id_rsa --add

travis loginを実行するとgithubアカウントのユーザ名、パスワードを求められるため入力してください。 この上でtravis enableを実行すると自動ビルドを有効化するリポジトリが正しいか確認されるため、正しければyesと入力しましょう。 更にtravis encrypt-file id_rsa --addを実行すると、秘密鍵id_rsaが暗号化されてid_rsa.encが生成されます。 このid_rsa.enc.gitignoreに追加されていないため、git addによってgitの管理下に置かれることになります。 なお引数の--addを付けておくと、.travis.ymlファイルにid_rsa.encの復号化を行うための下記のようなopensslのコマンドを追加してくれます。

before_install:
- openssl aes-256-cbc -K $encrypted_XXXXXX_key -iv $encrypted_XXXXXX_iv
  -in id_rsa.enc -out id_rsa -d

-Kは共通鍵、-ivは初期ベクトルの指定であり、指定されている値はTravis CI側で環境変数として設定されています。 (ブラウザからTravis CIの設定を見ると確認することができます)

srcブランチへの各種ファイルのadd, commitおよびgithubへのpush

以上の作業によりconf.py.gitignore.travis.ymlid_rsa.encの4つのファイルが編集・生成されているため、これをsrcブランチにaddした上でcommitし、更にremoteとなっているgithubにpushします。

$ git add .
$ git commit -am "Automate builds with Travis CI"
$ git push origin src

これによりTravis CIの自動ビルドが実行されるはずなので、あとはブラウザからTravis CIのページを確認し、ビルドが通っているかを確認するのが良いでしょう。

上記設定以降の記事の追加方法

上記までで設定した方法によってsrcブランチが変更される度にTravis CIがnikola buildおよびnikola github_deployを行ってくれるようになったため、postsディレクトリ以下に新規記事を追加したら、あとはこの新規記事をsrcブランチにgit add posts/XX.mdのようにgit addした上でgit commitして、更にgithubにgit push origin srcすれば自動的にブログがビルドされます。

参考

コメント

Comments powered by Disqus