aobako.net
GitHub Actions でプライベートリポジトリの Python パッケージを使ってみる
November 07, 2020
通常、GitHub で管理されている Python パッケージは次のようにインストールすることができる。
$ pipenv install git+ssh://git@github.com/syuni/test-private-b.git#egg=private-b
このとき、プライベートなリポジトリの場合は認証が必要になるので、SSH を使用する場合は別途認証用のキーペアを作成し、GitHub のアカウントに登録しているだろう (HTTPS の場合は PAT あたりになると思うが、自分はいつも SSH でやっている)。
これと同様のことを GitHub Actions 上でやろうとしたときに少々悩んだので一度整理しておく。
前提、およびやりたいこと
- リポジトリAとリポジトリBがあり、Aの Python プログラムはBの Python パッケージを参照しているとする (リポジトリBはプライベートである)。
- リポジトリAは Docker コンテナによるコンテナライズされたアプリケーションである。
- GitHub Actions によって、イメージを自動ビルドする CI を構築したい。
問題となるところ
- プライベートリポジトリのパッケージをインストールするために、SSH の鍵が必要で、これを GitHub Actions —> Docker Build にそれぞれ連携する必要がある。
アプローチ
基本的に CircleCI でやっていた方法と似ている。CircleCI の場合は SSH 鍵を登録する機能が存在するが、GitHub Actions には無いので、Secret 経由で秘密鍵のフレーズを連携し、自分で鍵を SSH-Agent に登録する感じになる。
準備
まず、鍵ペアが無い場合は予め作成しておく必要がある。鍵をデプロイキーとするか、ユーザーキーとするかは用途次第だが、今回はユーザーキーであるものとする。
キーペアを作成と公開鍵の登録が完了したら、続いてリポジトリAへ秘密鍵を登録する。登録はリポジトリ -> Settings -> Secrets から実施できる。ここで。 SSH_KEY
という名前で登録した場合、アクション内では ${{ secrets.SSH_KEY }}
とすることで参照できる。
GitHub Actions ワークフロー
概ね次のような内容でうまく動作する。
name: build
on: push
jobs:
build:
name: Build docker image with SSH key
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup SSH key
env:
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
SSH_KEY: ${{ secrets.SSH_KEY }}
run: |
mkdir -p ~/.ssh
ssh-keyscan github.com >> ~/.ssh/known_hosts
ssh-agent -a $SSH_AUTH_SOCK > /dev/null
ssh-add - <<< "${SSH_KEY}"
- name: Build docker image
env:
DOCKER_BUILDKIT: 1
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
run: docker build --ssh default -t actions-test:latest .
- name: Run image
run: docker run actions-test:latest
ここで重要なのが 2 つ目のステップで、秘密鍵を登録 & Docker ビルドコンテナに鍵を渡すために ssh-agent
を起動すること。Docker は --ssh
オプションを使用することで、安全に秘密鍵を渡すことができる。