🔄

GitHub×JenkinsなCI環境の構築

2023/01/22に公開

ゴール

  • GitリポジトリホスティングサービスにGitHub、CIサービスにJenkinsを使いCI環境を構築する
  • ブランチにpushにフックして、自動でテスト、ビルドが走る
  • それらの結果がGitHubのPRのchecksとしてフィードバックされる
  • (要するに、CircleCIやGitHub Actionsみたいなことができる)

経緯

GitHubとJenkinsを連携させ上記の条件を満たすCI環境を構築しようとしたところ、なかなか良い日本語の記事が見当たらなかったため。

GitHubの設定

前述したゴールを達成するため、今回はGitHub Appsを使う。
GitHub Appsで新しいAppを作成したうえで、そのApp経由でGitHubとJenkinsの連携を行う。

  1. GitHubで、Settings > Developer settings > GitHub Apps からGitHub Appsのページに進む。


  2. New GitHub App から新しいGitHub Appのページに進む。
  3. 以下のように埋めてAppを作成する。
    1. GitHub App name: よしなに。他のAppと同じ名前を使えないので、prefixかsuffixに自分のアカウント名を入れると良さそう。
    2. Homepage URL: よしなに。
    3. Webhook URL: ${your_jenkins_url}/github-webhook/
      末尾の/を忘れると動かないので注意
    4. logo: お好きに。Jenkinsのロゴにしとくと分かりやすいかも。
    5. Private keys: Generate a private keyしておく。この鍵は後のJenkinsの設定で使うのでなくさないように。
    6. Repository permissions: この辺はJenkinsをどのように使いたいかで変わってくる。例えば、コメントを付けたりしたければ、いくつかの設定をRead & writeにする必要がある。後で変更可能なので、あまり深く考える必要はなさそう。
      とりあえず以下のように設定した。
      • Administratino: Read-only
      • Checks: Read & write
      • Contents: Read-only
      • Metadata: Read-only
      • Pull requests: Read-only
      • Webhooks: Read & write
      • Commit statuses: Read & write
    7. Subscribe to events: どのGitHubイベント時にCIが発火するか指定できる。ひとまずPushだけチェックしておく。
  4. App作成後、Edit > Install Appから、自分のアカウントに作成したAppをインストールする。

以降、自分のアカウント化にある全てのリポジトリのpushイベントに対して、JenkinsへのWebhookが有効になる。

Jenkinsの設定

  1. GitHub Branch Source pluginをインストールする。
  2. Jenkins上で、作成したGitHub Appの設定をする。
    1. Manage Jenkins > Manage CredentialsからCredentialの設定画面に飛ぶ。
    2. New credentialsGitHub Appを選択し、以下のように埋める。
    • ID: よしなに。App名とかにしておくと良さそう。
    • 説明: よしなに。
    • App ID: GitHub Appの設定画面に書いてるApp IDを持ってくる。
    • Key: GitHub App作成時に生成したprivate keyに以下の変換を施してから登録する。
      openssl pkcs8 -topk8 -inform PEM -outform PEM -in key-in-your-downloads-folder.pem -out converted-github-app.pem -nocrypt
      
  3. 新規ジョブ作成からMultibranch Pipelineでジョブを作成する。

    Multibranch PipelineとはGitリポジトリのブランチごとにPipelineを実行するジョブのこと。今回のような、各ブランチでテストを実行したい場合はこのジョブを選ぶことになる。逆に言うと、フリースタイルジョブやパイプラインジョブでは単一のブランチのみでの実行を前提としているため、CIでテストを回したいみたいなユースケースには向かない。
  4. 設定画面が表示されるので、Branch SourcesGitHubを選択する。GitHub Credentialsに3. で作成したCredentialを選択し、そこ以外はよしなに埋める。

以上でJenkinsの設定は終了。

仕上げ

Gitリポジトリのルート直下にJenkinsfileを置いてpushすればCIが回るはず。成功するとChecksとして表示される。

参考

ここに全部書いてあります。
https://docs.cloudbees.com/docs/cloudbees-ci/latest/cloud-admin-guide/github-app-auth

Discussion