Mirrativ Tech Blog

株式会社ミラティブの開発者(バックエンド,iOS,Android,Unity,機械学習,インフラ, etc.)によるブログです

GitHub Actionsのセルフホストランナーを使ってJenkinsをサクッと叩けるようにする

7月からミラティブにUnityエンジニアとして入社した森田です。 弊社ではUnityのCIとしてJenkinsを利用していますが、GitHub Actionsのセルフホストランナーと連携させることで、JenkinsはそのままでGitHubのWeb画面からジョブを実行できるようにしてみたので、書いておきます。

課題

弊社ではアプリのUnity部分とアセットバンドルのビルドにJenkinsを利用しています。

tech.mirrativ.stream

JenkinsはUnityエンジニアに貸与されているMac miniにそれぞれにインストールして運用をしていたため、CIビルドするためにはその都度Mac miniを所持しているエンジニアに頼む必要があり、煩わしさを生んでいたのが課題でした。そのため「いつでも誰でもCIビルドを行えるようにする」という状況が望まれていました。

実装

この課題を解決するにあたり、リモートからJenkinsのジョブを実行できるようにしなければいけませんが、JenkinsがインストールされているMac miniを外部アクセスできるようするにはかなり手間がかかるうえに、セキュリティホールになり得るため、今回はGitHub Actionsのセルフホストランナーを簡易的なプロキシとして利用するという手法を取りました。

GitHub Actionsのセルフホストランナーの設定

まずはGitHub ActionsのセルフホストランナーとしてJenkinsがインストールされているマシンを登録しますが、公式の手順が非常に丁寧だったため難なく登録することができました。セルフホストランナーを登録する画面で指示されるコマンドを入力していけばすぐ終わります。

https://docs.github.com/ja/actions/hosting-your-own-runners/about-self-hosted-runners

Runnerの登録画面

JenkinsのAPIトークンを発行する

Jenkins右上のユーザー名をクリックすることで行ける設定画面からAPIトークンも発行しておきます。このAPIトークンは後でGitHubのSecretsに登録するのでメモしておいてください。

JenkinsのAPIトークンを発行

workflowファイルの作成

workflowファイルに実行するジョブを定義していきます…と言っても今回はcurlでJenkinsのジョブをキックするだけなので書くのは少しだけです。Jenkinsのジョブで使うパラメーターを手動入力できるように、inputsに定義します。inputsに定義した変数は${{ inputs.hoge }}で参照することができます。

Jenkinsのジョブは${JenkinsのURL}/job/${ジョブ名}/buildにベーシック認証でユーザー名とAPIトークンをつけてPOSTリクエストを送れば起動します。またジョブにパラメーターを渡す場合は、あらかじめJenkinsのジョブ設定でパラメーター変数を定義した後、${JenkinsのURL}/job/${ジョブ名}/buildWithParameterにして、クエリパラメーターとして付けてください。&をエスケープしないとパラメーター渡せないので注意。

name: Framework Build

on:
  workflow_dispatch:
    inputs:
      jenkins-job-name:
        description: 'Jenkinsで実行するジョブ名'
        required: true
        default: 'framework-build-ios-android'
env:
  JENKINS_URL: 'http://localhost:8080'

jobs:
  FrameworkBuild:
    runs-on: [main-builder]
    steps:
      - name: Kick
        run: |
          curl -X POST -L --user ${{ secrets.JENKINS_USER }}:${{ secrets.JENKINS_TOKEN }} \
          ${{ env.JENKINS_URL }}/job/${{ inputs.jenkins-job-name }}/buildWithParameters\
          ?BRANCH_NAME=${{ github.ref_name }}
        shell: bash

結果

たったこれだけの設定でしたが、Mac miniを貸与されていない人でもGitHubのWeb画面からアプリやアセットバンドルのCIビルドが行えるようになり、作業が円滑になりました。またポーリングして定期的にビルドしていたアセットバンドルも、GitHub上のイベントをトリガーにビルドできるようになりました。

残った課題

ただCIサーバーとして運用するMac mini2台を別々のエンジニアが所持しているため、Jenkinsでマスター・スレーブ構成にするのではなく、実行するマシンごとにworkflowファイルを作成してCI実行時に手動で選択しています。またSecretsにマシンごとにユーザー名とAPIトークンを登録しなければいけないため、まだまだ改善できる余地があります。

今までは人数も多くなかったので厳密に運用しなくても何とかなった部分もありましたが、人数が多くなればなるほどCI/CDが作業全体に与える影響は大きくなりますし、その整備は必須です。ユーザーの方々に問題なく素早く届けられるよう、今後も改善を続けていきます。

We are hiring!

CI/CDもですが、プロダクトもまだまだ改善できるところがたくさんあります。ミラティブでは一緒に作ってくれるUnityエンジニアを募集しているので、お気軽にお声がけください! www.mirrativ.co.jp speakerdeck.com