はじめに
GitHub Actions のジョブ内で生成したシークレットと判定されるものは共有することができません。
上記のように、 outputs
に指定したシークレットが自動で共有からスキップされていることがわかります。
以下の図のように、はじめにアクセストークンを発行し、 matrix で動かすジョブで生成したアクセストークンを共有して使用することを前提とします。
結論
単純な回答としては、 outputs で共有する前に暗号化して使用する前に復号することで使用することができます。
また暗号化・復号できるということは漏洩した際のリスクもあるのでアクセストークン等であれば使用後は直ちに取り消しを行ったり安全措置を行うなどの検討が必要になります。
具体例
暗号化・復号のステップとして以下を使用しました。
以下は、上記のアクションを使用した例です。
name: Sample on: [push] jobs: generate-access-token: runs-on: ubuntu-latest outputs: access_token: ${{ steps.encrypt-secret.outputs.out }} steps: - name: Generate access token id: generate-access-token run: | token = generate_access_token echo "token=${token}" >> "${GITHUB_OUTPUT}" - uses: cloudposse/github-action-secret-outputs@main id: encrypt-secret with: in: ${{ steps.generate-access-token.outputs.token }} on: encode secret: ${{ secrets.PASSPHRASE }} use-access-token: runs-on: ubuntu-latest needs: - generate-access-token strategy: matrix: python-version: ["3.10", "3.11"] steps: - uses: cloudposse/github-action-secret-outputs@main id: decrypt-secret with: in: ${{ needs.generate-access-token.outputs.access_token }} on: decode secret: ${{ secrets.PASSPHRASE }} - name: Use access_token env: TOKEN: ${{ steps.decrypt-secret.outputs.out }} run: echo "Token: ${TOKEN}" revoke: runs-on: ubuntu-latest needs: - generate-access-token - use-access-token if: always() steps: - uses: cloudposse/github-action-secret-outputs@main id: decrypt-secret with: in: ${{ needs.generate-access-token.outputs.access_token }} on: decode secret: ${{ secrets.PASSPHRASE }} - name: Revoke access_token env: TOKEN: ${{ steps.decrypt-secret.outputs.out }} run: revoke_access_token "${TOKEN}"
説明
generate-access-token
ステップでアクセストークンを何らかの方法を使用して取得するcloudposse/github-action-secret-outputs
を使用して暗号化を行うリポジトリ等のシークレットに PASSPHRASE
を追加済み
generate-access-token
ジョブの outputs として 2. の出力を指定するuse-access-token
ジョブはgenerate-access-token
の完了を必要とするように設定するcloudposse/github-action-secret-outputs
を使用してgenerate-access-token
ジョブの出力から復号を行う- 使用
revoke
ジョブで 5. と同様に復号を行い最後に何らかの方法でアクセストークンの取り消しを行う
最後に
確かに以下のように、使うたびにアクセストークン等のシークレットを発行するのでもいいが、アクセストークンを発行するためにもレートリミットがあったりする場合は今回のように前のジョブで予め発行して共有することもあると思うので備忘録としてこの記事を書いた。
というもの、最近は個人でも GitHub Personal Access Token を使用することも極力やめ GitHub App のアクセストークンを発行し使用することを心がけているからです。
GitHub App のアクセストークンを発行するものは以下の CLI を作っているので使用することにしています。(シークレットに秘密鍵を書き込んだりしないといけないが...)
また、 @shogo82148 さんが提供している以下のアクションを使用すると、自分で GitHub App を管理しなくてもアクセストークンを取得することができるようになる。
ただ、 GitHub Actions 限定のものなので他の CI 上で動かしたいというときは別の手段を取る必要があります。