GitHubのSecretsを活用して、GitHub Actionsで安全に機密情報を扱う

## はじめに
GitHub repositoryにyamlファイルを書くことで、Commit時やPR反映時等色々な場面で利用できるGitHub Actions。
そんなGitHub Actionsに処理を書いていると、外部サービスと連携するためにアクセストークンのような機密情報を保持したくなります。
この記事では、その機密情報の扱うためのSecretsの使い方について記載します。

## GitHub repositoryのSecrets

使い方は簡単で、GitHub内のsecretを設定したいリポジトリのページを開き、下記Settingsから設定を行います。

![](https://help.github.com/assets/images/help/repository/repo-actions-settings.png)

例えばSecretSettingという設定を追加した場合は、以下のように `secrets.SecretSetting` を変数に代入することで、run内に書いたスクリプトでsecretが扱えるようになります。

```yaml
    - name: Access to secret
      env:
        SECRET_SETTING: ${{ secrets.SecretSetting }}
      run: |
　　　　　##access to $SECRET_SETTING if this script is bash
```

詳細は[公式ページ](https://help.github.com/ja/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets)を参照ください。

**注意**
上記Settingsを扱えるのは、リポジトリのオーナーのみです。

### GitHub APIを利用してより汎用的に

上記の方法でも事足りるのですが、Secretsの設定はリポジトリごとにしかできず、さらにその権限はリポジトリのオーナーごととなっています。
大量にリポジトリがある場合は骨の折れるので、APIを利用して設定を行います。

APIを利用する方法の一つとして、[token](https://github.com/settings/tokens/new)を発行する方法があります。Private repositoryを使う場合は`repo Full control of private repositories`が必要です。

tokenが取得できたらあとはAPIを叩くだけ。
APIの仕様は[こちら](https://github.com/developer-kikikaikai/github-secret)。Updateする際はpublic keyを取得した上で[LibSodium](https://libsodium.gitbook.io/doc/bindings_for_other_languages)を利用してkeyを暗号化するのが特徴です。

ざっくりシーケンスは[こんな感じ](http://www.plantuml.com/plantuml/uml/hL5RQ-9067ttLtmC-x3B6d9Pb-ey52-85zigDO7Qbp0c7tKqbp2PYLh9VsycBOBGGg4-VeSpvpAdcqicf8gZnY3Yc4WmRc74vLYjUui9K1WDNJ05PcbkqdIVe32flamMI9uckPbZ853cPgRM4G-C7HxXzmPPY098JybDAlWhqrGAQsIYWk7NQJHnnrxVT-UpuKD9_ZJEXjhz8mU5fMHIvU1O5indJJYHIjpd8Q50RETVYpH18_fqbYzjljhs3eTuujmLtbCstUvMulxWFIw2jlWRzc_SwR4ewcVb5qqNtlUQqeJ527ikDvz50e9988wPnD0lMAIGK3WZK2CbNF-BR1W8P9N53sUiorqltmc0Q4L2eLQk9WlUS_fCrijPTiUmsePjkNQB_kzGntdMmweil60vbc7PbwooqSKaL77q1W00)

![sequence](http://www.plantuml.com/plantuml/png/hL5RQ-9067ttLtmC-x3B6d9Pb-ey52-85zigDO7Qbp0c7tKqbp2PYLh9VsycBOBGGg4-VeSpvpAdcqicf8gZnY3Yc4WmRc74vLYjUui9K1WDNJ05PcbkqdIVe32flamMI9uckPbZ853cPgRM4G-C7HxXzmPPY098JybDAlWhqrGAQsIYWk7NQJHnnrxVT-UpuKD9_ZJEXjhz8mU5fMHIvU1O5indJJYHIjpd8Q50RETVYpH18_fqbYzjljhs3eTuujmLtbCstUvMulxWFIw2jlWRzc_SwR4ewcVb5qqNtlUQqeJ527ikDvz50e9988wPnD0lMAIGK3WZK2CbNF-BR1W8P9N53sUiorqltmc0Q4L2eLQk9WlUS_fCrijPTiUmsePjkNQB_kzGntdMmweil60vbc7PbwooqSKaL77q1W00.png)

また、GitHub APIを利用するための[golangライブラリ](https://github.com/google/go-github)が公開されていますので、プログラムで利用することも楽ちん。
上記を紹介した記事[Github Actions Secrets API を使って Go で Secrets を更新する](https://qiita.com/kazz187/items/aa9885bb968722ac9b1d)を参考に、golangでのサンプルコマンドを作成しています。

[github-secret](https://github.com/developer-kikikaikai/github-secret)

## 参考
公式ページ
[GitHub ヘルプ: 暗号化されたシークレットの作成と保存](https://help.github.com/ja/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets)
[GitHub Developer: REST API v3 Secrets](https://developer.github.com/v3/actions/secrets/)
[Libsodium documentation](https://libsodium.gitbook.io/doc/bindings_for_other_languages)

その他参考
[Github Actions Secrets API を使って Go で Secrets を更新する](https://qiita.com/kazz187/items/aa9885bb968722ac9b1d0)
[GitHub APIの仕組みを知り、APIでrepositoryを作成しよう](https://qiita.com/developer-kikikaikai/items/5f4f0e2ea274326d7157)