Open5

GitHub Actionsの知見、ハマりどころメモ

よだかよだか

$GITHUB_ENVを設定したstepではenv.経由では参照できない

多分フローがわかってれば当たり前なんだけど、これ気づかなかったな

      steps:
          - uses: actions/checkout@v2
          - name: Set Env
            run: |
                BRANCH_NAME=${GITHUB_REF##*/}
                echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
                # 以下実行時には`echo ""`となって参照できない
                echo "${{ env.BRANCH_NAME }}"

あるstepで設定した$GITHUB_ENVは、その後のstepで毎回envに詰められるようだ
イメージとしてはこう

          - name: Next Step
             env:
               BRANCH_NAME: ブランチ名

なのでecho "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENVしたstepではenv.BRANCH_NAME経由では参照できない。

よだかよだか

環境ごとに異なる機密情報について

GitHubにEnvironmentsという機能があり、環境を定義してそれぞれの環境変数を定義できるようだが、publicリポジトリでしかまだ使えないっぽい。
どうしようかな。

よだかよだか

問題

  1. Laravelの.envを環境で切り替えたい
  2. github secretsに環境変数を環境の数だけ登録していくのは現実的ではない
  3. かといって、github secretsは構造化データはつかえないのでymlなどを一つの変数として登録することはできない

解決方法

良さげな方法を見つけた。
こちらの記事を参考にさせてもらった。
https://soypocket.com/it/github-actions-json-secrets/

方法としては

  1. laravelの.envをbase64にエンコード
  2. それをgithubのsecretsに登録
  3. github actions上でデコードして.envとして生成

こんな感じ
これによって問題の2,3がクリアされる
残りは問題1のみ

よだかよだか

Laravelの.envをデプロイ環境で切り替えたい

これをするためにはデプロイ環境によって動的にgithub secretsを読み込む必要がある。

方法

  1. あらかじめそれぞれの.envをsecretsに環境変数として登録しておく
    STAGING_LARAVEL_ENV=base64エンコード後のステージング用.env
    PRODUCTION_LARAVEL_ENV=base64エンコード後の本番用.env

  2. github actions上で切り替える
    ステージングへのデプロイだったらsecrets.STAGING_LARAVEL_ENV
    本番へのデプロイだったらsecrets.PRODUCTION_LARAVEL_ENV
    を実現するコードがこれ

secrets[format('{0}_LARAVEL_ENV', env.ENV_NAME)]

secretsのプロパティにブラケットで動的にアクセス出来る衝撃もさる事ながら、format関数を入れることで環境名を展開できるようになるという。
https://docs.github.com/ja/actions/learn-github-actions/expressions#format

ちなみにこの方法はここで見つけたが、翻訳ミラーサイトで、本リンクが見つからない、、
https://www.fixes.pub/program/505726.html

よだかよだか

そもそも

  • よく考えたらworkflow上でLaravelの.envが必要なことはない
  • Laravelの.envはサーバーでのみ展開されれば良いはず

なのでやり方を変えた。

AWS Secrets Managerに変更

  • Github のsecretと違い、構造化データを格納できる
    これでbase64化する必要がなくなる
  • AWSのWEBのコンソールからも見れるし編集もできるので楽
  • Github secretsは見れない

やり方は
AWS Secrets Managerに変数を登録
EC2にロールをアタッチして、EC2で読み込むだけ