GitLabCIの結果をGitHubにコミットする
hugoで生成したHTMLをコミットしたかったのでやってみた。
SSHのキーペアを作成する
既存のものは使い回したくないんで、新規に作成する。
$ ssh-keygen -f id_rsa_gl2gh
作った鍵は以下のように使用する。
GitHubでのDeploy keyの設定
コミットしたいリポジトリの設定から、作成した公開鍵をDeploy keyに追加する。 追加したあと、SSHで接続の確認をする。
$ ssh -i id_rsa_gl2gh git@github.com PTY allocation request failed on channel 0 Hi kawaken/kawaken.me! You've successfully authenticated, but GitHub does not provide shell access. Connection to github.com closed.
普段使っている鍵と違い、ユーザ名と特定のリポジトリ名が表示されている。
GitLabCIのVariableの設定
GitLabCIでは実行中の環境変数を外部から設定できるようになっている。プロジェクトのSettings -> CI/CD
のVariableの設定に、Key/Valueの組み合わせを登録する。
Key名をSSH_PRIVATE_KEY
にして、秘密鍵を登録する。
UI上は短い一行の値しか入力できないように見えるが、複数行の内容でも問題なく設定できる。
GitLab CIの設定
Using SSH keys with GitLab CI/CD | GitLab におおまかな手順は載っているが、ちょっと修正が必要になる。
自分は以下のような設定になった。
before_script: # SSH用のディレクトリ作成 - mkdir -p ~/.ssh - chmod 700 ~/.ssh # github.comのSSH host keysを保存する - apt-get update -y && apt-get install openssh-client -y - ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts # ssh-agentの設定 - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null # git のユーザ情報設定 - git config --global user.email "user@example.com" - git config --global user.name "Kentaro Kawano" to_github: stage: build script: - rm -fr public - git clone git@github.com:kawaken/kawaken.me.git public - hugo - cd public - export MESSAGE="update $(date +'%F %T')" - git add -A . - git status - git commit -m "${MESSAGE}" - git push origin master only: - master
更新対象のリポジトリをhugoの出力ディレクトリとし、変更をすべてコミット&プッシュするようにした。
git status
を途中で実行しているのは、何が対象となったかをGitLabのJobのログに残したいため。