こんにちは。 株式会社アカツキゲームス クライアントエンジニアの、軍曹 (@maupukuncarbon) です。
この度、私たちのチームでインターンの方を受け入れました。ありがたいことに、参加レポートを書いてくれたので、私の方から代理投稿させていただきます。
上記の通り、この記事は代理投稿となります。 投稿者と執筆者は異なるのでご承知ください。
2023/09/04~2023/09/22の3週間、株式会社アカツキゲームスのインターンシップに参加させていただきました。 今回はインターンシップで取り組んだことを備忘録としてまとめていきます。
自己紹介
趣味でC++でライブラリ開発をしたり、Unityでゲームを作っています。 普段関わっているプロジェクトよりも大規模な開発に取り組めるこのインターンに興味を持って参加させていただく形になりました。
取り組んだこと
クライアントエンジニアとしてモバイルゲームのタイトルに携わらせていただきました。 私が主に担当したのはCI改善と既存のバグ修正です。 今回はその中の1つのタスクについて話していきます。
GitHub Actionsのコードの共通化
メンターさんにCIに興味があるとお話ししたところ、CI関連のタスクをもらえるように調整してもらいました。
GitHub Actionsの知識をつけたいという動機から CIのワークフローの共通処理を単体Action化する
というタスクをいただきました。
Composite Actionを使ってみる
まず、Composite Actionで共通化を試みます。
secretsを間接参照する
ビルド環境ごとにsecretsのアクセスを分けようと考えました。 GitHub Actionsではexpressionのネストはできないため、次のような書き方ができません。
${{ secrets.foo-${{ inputs.bar }} }}
代わりにformatを使います。
${{ secrets[format('foo-{0}', inputs.bar)] }}
問題発生
Actionを書き上げたところ、Actionからsecretsに直接参照できないことに気づきました。
対策案①Reusable workflow
同じ Organization 内のReusable workflowを呼び出す場合は、inherit
キーワードを使ってシークレットを暗黙的に渡すことができます。
secrets: inherit
しかし、Reusable workflowはjob単位での呼び出しになり、やりたかったことが実現できなかったため断念しました。
対策案②inputsで渡す
少し手間になりますが、必要なsecretsをinputsで渡します。
action.yml
name: 'sample action' inputs: foo: required: true runs: using: "composite" steps: - run: echo ${{ inputs.foo }} shell: bash
※ run
句では shell
の設定が必須です
sample-workflow.yml
name: sample workflow jobs: composite_test: runs-on: ubuntu-latest steps: - uses: {org}/{repo}/.github/actions/{name}@{tag or branch} with: foo: ${{ secrets.foo }}
secretsをComposite Actionのinputsとして渡してもセキュリティ上の問題はないようです。
act
実際にGitHub Actionsを使ってテストするのは大変だったので、actを使ってローカルで試すようにしました。
act -W .github/workflows/sample-workflow.yml
感想
ゲーム会社の就業型インターンは初めてではなかったのですが、ここまで規模が大きくて長期間運営されているプロジェクトに携わるのは初めてだったので楽しかったです。
運営期間が長いこともあって、仕様やコードの依存関係が複雑化していたりと、長期開発ならではの課題も体験できました。
また、作成したPRに対しても丁寧なレビューをいただきました。チーム開発での生産性の観点から細かい改善点を指摘してもらい、コードの技術的な側面だけでなく、プロジェクトを円滑に進めるためのコミュニケーションについても学ぶことができました。
皆様、本当にありがとうございました!