GitHub にプッシュする

CircleCI 上のリポジトリでは、最初から以下のようなリモート設定がされているようです。

origin  git@github.com:user/repo.git (fetch)
origin  git@github.com:user/repo.git (push)

さてこの方法には以下のような方法があります。

  1. GitHub Personal Access Token を使う (2020-01 追記)
  2. ssh を使う

GitHub Personal Access Token

こっちのほうが楽かもしれない。

準備

まず、GitHub で Personal Access Token を取得します。もし対象のリポジトリがプライベートならrepoにチェック、パブリックならpublic_repoにだけチェックを入れトークンを生成します。

step で push する

git pushを実行するには、 git ユーザーのメールと名前は最低限設定する必要があるのでそれらを設定します。またoriginは上記の通りgit@...となっているのでhttps:スキーマの方にユーザー情報を付け加えたやつに変更します。変更するコマンドは以下です。

git remote set-url origin <新URL>

その後はこのoriginに向かってgit pushするだけです。

steps:
  - ...
  - run:
      name: git push
      command: |
        git config --global user.email "$GIT_AUTHOR_EMAIL"
        git config --global user.name "$GIT_AUTHOR_NAME"
        git remote set-url origin https://$GIT_AUTHOR_NAME:$GITHUB_PERSONAL_ACCESS_TOKEN@github.com/<org>/<repo>.git
        git push origin master:****

ssh

github.com に ssh できるようにする

対象のプロジェクトの設定の

  1. SSH Permissions
  2. Add SSH Key

から以下のように「Hostname」にはgithub.comを設定し、「Private Key」には自分がいつも使っている秘密鍵の内容をコピペして追加します。

Image from Gyazo

一覧画面のそのホストの行にフィンガープリントが一緒に置いてあるはずなのでそれをコピーしておきます。

Image from Gyazo

.circleci/config.yaml の編集

ssh時に鍵認証できる必要があるので.ssh/configを編集する必要があります。これにはstepsadd_ssh_keysを設定しておきます。以下のような感じです。

jobs:
  - checkout
  - add_ssh_keys:
      fingerprints:
        - '**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**'

この'**:**:...の部分に先ほどコピーしたフィンガープリントを置きます。これでここを実行した時に~/.ssh/configに以下のような設定が追加されます。

Host github.com
  IdentitiesOnly yes
  IdentityFile /home/circleci/.ssh/id_rsa_********************************

step で push する

git pushを実行するには、 git ユーザーのメールと名前は最低限設定する必要があるのでそれらを設定した上でgit pushします。

steps:
  - ...
  - run:
      name: git push
      command: |
        git config --global user.email "$GIT_AUTHOR_EMAIL"
        git config --global user.name "$GIT_AUTHOR_NAME"
        # add とかするならここで
        export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
        git push origin master:****