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