CircleCIからGitHubへのPushする時のToken周りのこと

CircleCIなどCI環境で何かしらのスクリプトを実行し、GitHubのrepositoryにpushしたい/pullしたい時のCircleCI/GitHubの設定周りについてのメモ。

何も設定せずにgit push など書き込み系のコマンドを実行するとThe key you are authenticating with has been marked as read only. のエラーで失敗する。

GitHub API のtokenが用意できる場合は

  git push -f "https://${GITHUB_TOKEN}@github.com/owner/repository.git" HEAD:branch

のコマンドを使えば無事pushは成功する。 今回 releases-hub-gradle-plugin を使う時、plugin内で git push を実行しているところにAPI tokenを使った形で実装されていないため、CircleCIとGitHub側にSSH keyを登録する必要があった。

GitHub and Bitbucket Integration - CircleCI

手順はこちらに書いてある通りだが補足してメモしておくと

ssh keyを作成する

ssh keyを作成する(手元の環境で実行するでOK)

ssh-keygen -m PEM -t rsa -C "your_email@example.com"

GithubでDeploy Keyを設定

PushしたいGitHub RepositoryのSetting -> Deploy Keyから Add Deploy Key さきほど作成したssh keyの公開鍵(id_rsa.pub)を使ってDeploy Keyを作成。(Allow Write Accessにcheckをいれて作成する)

CircleCIでAdd SSH Key

CircleCI側のrepository settingのページで SSH Permissions から Add SSH Key Hostnameに github.com を入力し 秘密鍵(id_rsa)を入力する。

config.ymlでadd_ssh_keys

CircleCI/GitHubで公開鍵/秘密鍵を作成した後共にFingerprintが出力されるので、.circleci/config.yml に設定する。

update_library_version:
    <<: *android_env
    steps:
      - add_ssh_keys:
          fingerprints:
            - "a8:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX"
      - checkout
      - *extend_path
      - run: ./gradlew upgradeDependencies -PgitHubWriteToken=$GITHUB_TOKEN

今回 upgradeDependencies の中で git push する必要があったのでそのjobに add_ssh_keys を設定した。