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_rsaとid_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_rsaはtravis 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.yml、id_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すれば自動的にブログがビルドされます。
参考
- 過去ポスト
- Nikola公式の記事
コメント
Comments powered by Disqus