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リポジトリでしかまだ使えないっぽい。
どうしようかな。
問題
- Laravelの.envを環境で切り替えたい
- github secretsに環境変数を環境の数だけ登録していくのは現実的ではない
- かといって、github secretsは構造化データはつかえないのでymlなどを一つの変数として登録することはできない
解決方法
良さげな方法を見つけた。
こちらの記事を参考にさせてもらった。
方法としては
- laravelの.envをbase64にエンコード
- それをgithubのsecretsに登録
- github actions上でデコードして.envとして生成
こんな感じ
これによって問題の2,3がクリアされる
残りは問題1のみ
Laravelの.envをデプロイ環境で切り替えたい
これをするためにはデプロイ環境によって動的にgithub secretsを読み込む必要がある。
方法
-
あらかじめそれぞれの.envをsecretsに環境変数として登録しておく
STAGING_LARAVEL_ENV=base64エンコード後のステージング用.env
PRODUCTION_LARAVEL_ENV=base64エンコード後の本番用.env -
github actions上で切り替える
ステージングへのデプロイだったらsecrets.STAGING_LARAVEL_ENV
本番へのデプロイだったらsecrets.PRODUCTION_LARAVEL_ENV
を実現するコードがこれ
secrets[format('{0}_LARAVEL_ENV', env.ENV_NAME)]
secretsのプロパティにブラケットで動的にアクセス出来る衝撃もさる事ながら、format関数を入れることで環境名を展開できるようになるという。
ちなみにこの方法はここで見つけたが、翻訳ミラーサイトで、本リンクが見つからない、、
そもそも
- よく考えたらworkflow上でLaravelの.envが必要なことはない
- Laravelの.envはサーバーでのみ展開されれば良いはず
なのでやり方を変えた。
AWS Secrets Managerに変更
- Github のsecretと違い、構造化データを格納できる
これでbase64化する必要がなくなる - AWSのWEBのコンソールからも見れるし編集もできるので楽
- Github secretsは見れない
やり方は
AWS Secrets Managerに変数を登録
EC2にロールをアタッチして、EC2で読み込むだけ