Github Actionsでprivate repoからpod installしたかった話

（追記）Basic認証で簡単ぞと言うアドバイスをいただいて更新しました！ありがとうございます！

## 経緯

もともとXcodeプロジェクトのプルリクをトリガーに、`Danger`によるプルリクのチェックをしていました。
が、`Swagger`で作成したAPIクライアントのプライベートリポジトリが`Podfile`に追加されたことで、`pod install`が失敗するようになってしまった、という経緯です。

## AccessTokenによる認証で解決
SSH鍵を設定して行う方法（[結論](#結論)〜以降のセクション）でも目的を果たすことができましたが、アドバイスをいただき、`Personal Access Token`によるBasic認証でスマートに行うことができました！

### トークン発行
発行は https://github.com/settings/tokens こちらから行えます（Settings > Developer settings > Personal access tokens）

適当なメモを残し、`repo`にチェックを入れます
<img width="890" alt="スクリーンショット 2020-04-19 16.04.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270319/3f68047a-f7f7-ba50-3eda-35f6ab14d002.png">

これだけでした。あとは生成した後に表示されるトークンをメモしておきましょう。
*同じトークンは二度とGithub上で表示することはできません！*（再生成になります）

### PodfileのURLに書き換える
もとURLが、
`https://github.com/dazy1030/TestRepository.git`
でトークンが、
`abc123`
だった場合Basic認証を使用したURLは、
`https://abc123:x-oauth-basic:github.com/dazy1030/TestRepository.git`
となります。
一度ローカルの環境でcloneできるか試しておくと良いと思います。

これだけで`pod install`成功しました！

### SSHのときの欠点
以下の点からBasic認証の方が良いなと感じました。

* 設定までの作業が多い
* 該当リポジトリにSSH登録したユーザーと同じ権限でしか振る舞えない
* ローカル環境ではhttpsで`pod install`していた場合、sshに変更した際にプロジェクトに参画しているユーザーみんなにssh設定を行ってもらわなければならない（もともとしておけって話ではあるが）

# 以下SSHによる方法

## 結論
ワークフローのyamlはこんな感じになりました（無駄とかaction古くね？ってのあると思います。アドバイスお願いします…）

```workflow.yml
name: Danger

on: [pull_request]

jobs:
  build:
    runs-on: macos-latest

    steps:
    - uses: actions/checkout@v1
    
    - name: Setup SSH
      env:
        SSH_PRIVATE_KEY: ${{ secrets.ACTIONS_SSH_PRIVATE_KEY }}
      run: |
        mkdir -p ~/.ssh
        ssh-keyscan github.com > ~/.ssh/known_hosts
        echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa

    - name: Setup ruby
      uses: actions/setup-ruby@v1
      with:
        ruby-version: '2.6'

    - name: Cache bundle
      uses: actions/cache@v1
      with:
        path: vendor/bundle
        key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-gem-

    - name: Bundle install
      run: |
        gem install bundler
        bundle config path vendor/bundle
        bundle install --jobs 4 --retry 3

    - name: Cache CocoaPods
      uses: actions/cache@v1
      with:
        path: Pods
        key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-pods-

    - name: Pod install
      run: bundle exec pod install

    - name: Run danger
      run: bundle exec danger
```

フローをざっくり言うと、
1. チェックアウト
2. SSHできるように設定
3. `Gemfile`から`bundle install`
4. （CococaPodsのキャッシュ）
5. `Podfile`から`bundle exec pod install`
6. `bundle exec danger`

今回手を加えたのは2.の部分だけでした。

## SSHの設定
### ssh-keyを作成
まず、actionを実行するマシンのssh-keyを作成します。
本当は実行するマシン内で作成して〜ってのが正規手順っぽくて良いのですが、実行環境の保存やら初回実行時やら考えるのが面倒だったので、外の環境で作成しました。

### 秘密鍵をactionの実行マシンに配置する
actions内で作成した秘密鍵を持たせるために、`Secrets`に環境変数として登録します
`https://github.com/{ユーザー名}/{レポジトリ名}/settings/secrets`
で登録できます。
登録後は、action内で（ACTIONS_PRIVATE_KEYと名付けたとします）

```yaml
env: 
  PRIVATE_KEY: {{ secrets.ACTIONS_PRIVATE_KEY }}
```
のように呼び出すことができます。
そうしたら、`~/.ssh/id_rsa`においてやるだけです。

`ssh-keyscan github.com > ~/.ssh/known_hosts`
はyes/no聞かれた時に失敗しちゃわないかな…<font color="Lavender">と思い付けたのでちゃんと役目があるか確認できてません</font>

### Githubアカウントに公開鍵を登録
SSHでアクセスできるように公開鍵の方をアカウントに紐づけておきます。
https://github.com/settings/keys
ここから登録できます。
これでSSHでgithubにアクセスできるようになりました。
（今回は、個人のアカウントではなくプロジェクトのアカウント的なのが存在したので、そのアカウントに紐付けましたが個人でやるときは微妙かもしれませんね…）

最後に忘れずに`Podfile`のリポジトリのアドレスを`ssh://~`に直して完了です。

## かんそー
Github Actionsはまだまだ進化の途中って感じなので確立した運用にはまだかかりそうだなーと思いました。