as Code の徹底による 安心安全な Jenkins 環境構築

223 Views

October 21, 25

スライド概要

2025/10/10に開催されたイベント「Game Developers Meeting Vol.64」の登壇スライドとなります。
イベント概要: https://gdm64.peatix.com/view

profile-image

DeNA が社会の技術向上に貢献するため、業務で得た知見を積極的に外部に発信する、DeNA 公式のアカウントです。DeNA エンジニアの登壇資料をお届けします。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

as Code の徹底による 安心安全な Jenkins 環境構築 2025/10/10 Game Developers Meeting Vol.64 © DeNA Co., Ltd. 1

2.

登壇者プロフィール 白柳 隆澄 株式会社ディー・エヌ・エー ゲームサービス事業本部開発運営統括部第一技術部 テクノロジー推進第三グループ グループリーダー 2007年からゲーム業界でエンジニア 2017年DeNA入社 2019年頃からSREを自称 「ゲーム開発者のための SRE」 として開発をいかに楽にしていくか 毎日考えています © DeNA Co., Ltd. 2

3.

目次 1 はじめに 2 CI/CD 環境の管理体制について 3 環境構築を as Code 4 Jenkins を as Code 5 安心安全な環境 6 まとめ © DeNA Co., Ltd. 3

4.

はじめに ● 本資料は過去の登壇内容をベースに加筆修正をした マイナーバージョン的な資料です ● すでに過去登壇を聞いた方には同じ話をしますが ご了承ください © DeNA Co., Ltd. 4

5.

はじめに ● 本資料は過去登壇資料からの差分を記載しています ● 過去の情報は下記よりご確認ください ○ モバイルゲーム開発におけるJenkins 〜クラウド時代のJenkins構築と管理テクニック〜 (CEDEC2020) ○ ゲーム開発のJenkins整備から 横断SREチームが誕生するまで (DeNA TechCon 2023) © DeNA Co., Ltd. 5

6.

CI/CD 環境の管理体制について © DeNA Co., Ltd. 6

7.

チームの紹介 ● SWET (SoftWare Engineer in Test) ○ DeNA 全事業部の横断組織 ○ テストを主体 ○ テスト自動化からCI/CD構築支援まで横断活動 ● ゲーム開発者のための SRE (Site Reliability Engineer) ○ ゲームサービス事業本部の横断組織 ○ 自動化を主体 ○ 開発者向けサービスの1つとして CI/CD の運用・改善 © DeNA Co., Ltd. 7

8.

よりゲーム開発に近い CI/CD 運用の分業体制へ ● 過去にはゲームサービス事業本部の Jenkins 運用業務を SWET メインで行っていた時期があった ● SWET メンバーも限られているため、プロジェクトによっては チームのエンジニアが片手間に運用していた ● CI/CD とゲーム開発のそれぞれで技術・知識の差があり、 ガラパゴスな Jenkins が各所に誕生してしまっていた © DeNA Co., Ltd. 8

9.

SWET から SRE チームへ ● SWET の CI/CD の知識を継承し ゲーム開発経験者の SRE が ゲーム開発者とともに開発をしながら CI/CD の運用をする体制へ ● TechCon 2023 はその体制変化中の発表だった ○ ゲーム開発のJenkins整備から横断SREチームが誕生するまで (DeNA TechCon 2023) © DeNA Co., Ltd. 9

10.

環境構築を as Code © DeNA Co., Ltd. 10

11.

Terraform によるインフラ構築 ● インフラ管理を as Code ○ CEDEC2020 の発表内容から大きな変更はなし ○ SWET から SRE に継承 Google Cloud Jenkins Controller © DeNA Co., Ltd. Linux Agent 11

12.

macOS マシンの調達 ● MacStadium でクラウド macOS 環境を調達 ● オフィス内マシンはリブーターで電源管理 ● リモートですべて管理できるようになった! © DeNA Co., Ltd. オフィス内 MacStadium macOS Agent macOS Agent 12

13.

Ansible による環境構築 ● マシンのセットアップは Ansible で as Code ○ CEDEC2020 のころから Ansible は使っていた ○ 当時よりパワーアップした部分を紹介 © DeNA Co., Ltd. オフィス内 MacStadium macOS Agent macOS Agent Google Cloud Jenkins Controller Linux Agent 13

14.

Ansible による環境構築 ● Ansible Galaxy 化 ○ プロジェクト固有ロール以外を Galaxy 化 ○ 複数プロジェクトでロールが再利用可能になった ● Playbook の OS 差分を削減 ○ Galaxy role で OS 差分を隠蔽 ○ OS ごとに複数あった Playbook を統一 ■ 共通 vars 管理リポジトリなど工夫していたが、1リポジトリで管理 できるようになったことで更新作業が1箇所で済むようになった © DeNA Co., Ltd. 14

15.

Ansible による環境構築 ● UnityHub CLI 対応 ● ツールインストールの ほとんどが自動化済み ○ ただし Xcode だけ半手動 © DeNA Co., Ltd. # unity versions install_unity_versions: - version: 6000.0.34f1 changeset: 5ab2d9ed9190 - version: 2022.3.58f1 changeset: ed7f6eacb62e - version: 2022.3.56f1 changeset: dd0c98481d00 - version: 2022.3.22f1 changeset: 887be4894c44 unity_clean: true 15

16.

手順通りにやれば誰でも Jenkins 構築可能に ● 実行作業(apply/playbook)をスクリプトで単純作業化 ● Terraform/Ansible の知識がなくとも誰でも構築可能 ○ 運用業務の一部をプロジェクト側エンジニアに任せることで SRE チームが専門性を発揮できる時間を増やすことができた ○ プロジェクト側もプロジェクト都合でビルドマシン追加や、 ビルドに必要なツールインストールなどがやりやすくなった © DeNA Co., Ltd. 16

17.

Jenkins を as Code © DeNA Co., Ltd. 17

18.

コード化されたジョブおよび設定 ● Jenkins Configuration as Code (JCasC) ○ Jenkins の設定を as Code ● JobDSL ○ Jenkins のジョブ設定を as Code ● Jenkinsfile ○ Jenkins のジョブを as Code ● Jenkins Shared Libraries ○ Jenkins ジョブの共通処理を as Code © DeNA Co., Ltd. 18

19.

Jenkins Configuration as Code (JCasC) Jenkins の設定を as Code ● 現在の設定をダンプ可能 ○ 0 から設定を書くのは大変 ○ ダンプしたものをベースに整形して管理 ● クレデンシャルはそのままだと復元不可 ○ クレデンシャルを設定した環境の master.key と hudson.util.Secret が必要 © DeNA Co., Ltd. 19

20.

Jenkins Configuration as Code (JCasC) ● 設定ファイルは YAML フォーマット ○ 複数ファイルに分割可能、ディレクトリ指定で読み込み ○ 設定内容が大量にあるため分割管理がオススメ ■ ダンプファイルもそのまま管理(WebUI との差分比較用) ■ ダンプから必要な設定だけ分割して管理(ロード用) ● Ansible の変数で可変部分を管理 ○ Ansible のテンプレートエンジンで変数から設定を埋め込み ○ プロジェクト固有の設定を単純化 © DeNA Co., Ltd. 20

21.
[beta]
Jenkins Configuration as Code (JCasC)
jenkins:
authorizationStrategy:
roleBased:
roles:
global:
- assignments:
{% filter indent(10,True) %}{{ admin_role_users | to_nice_yaml }}{% endfilter %}
name: "admin"
pattern: ".*"
permissions:
- "Job/Move"
- "Job/Build"
- "Job/Delete"
© DeNA Co., Ltd.

21

22.

Jenkins Configuration as Code (JCasC) ● 設定ファイルの読み込み方法 ○ WebUI から手動 ○ 起動時 ■ CASC_JENKINS_CONFIG 環境変数 ■ -Dcasc.jenkins.config=$JENKINS_HOME/jcasc/ ● 起動時読み込みはせず、手動読み込みで運用 ○ プラグイン更新時に読み込み失敗で起動できないことがあった ○ 一時的な設定や as Code されていない設定が消えることがあった © DeNA Co., Ltd. 22

23.

JobDSL Jenkins のジョブ設定を as Code ● Groovy で記述可能 ● 既存ジョブからコード化可能 © DeNA Co., Ltd. pipelineJob("Task_CleanDisk") { description("ディスク定期掃除 ") properties { pipelineTriggers { triggers { cron { spec("H 5 * * 1-5") } … scriptPath("./Clean.jenkinsfile") 23

24.

JobDSL ● どのような Job DSL API があるかヘルプで確認可能 ○ https://jenkinsci.github.io/job-dsl-plugin/# ○ Jenkins インスタンス上のページで見ると インストール済みプラグインの API も確認可能 ● 慣れてくるとコードからジョブ書いたほうが早くなる © DeNA Co., Ltd. 24

25.

JobDSL(テンプレート利用) ● テンプレートとして利用可能 ● ジョブを生成するジョブを書ける ○ パラメータ違いなどのジョブ生成を簡略化 ■ コピペで作成しがちだったが パラメータ書いてジョブ実行するだけで生成可能 ■ 複数ジョブがあってもまとめて生成可能 ○ 複数バージョン並行開発、運用フェーズでのジョブ管理で重宝 © DeNA Co., Ltd. 25

26.

JobDSL(テンプレート利用) 呼び出し側ジョブ job("Seed_CronBuild") { 可変な要素をパラメータで parameters { textParam("DSL_CRON", "H H(0-5) * * *", "Cron 設定" ) booleanParam("IGNORE_EXISTING", true , "ジョブを上書きしたい場合は false にする") ... steps { jobDsl { DSL からジョブを生成 targets("dsl/Template.groovy") ignoreExisting("\$IGNORE_EXISTING".toBoolean()) // 上書き禁止 } } © DeNA Co., Ltd. 26

27.

JobDSL(テンプレート利用) テンプレートジョブ pipelineJob("Pipeline_${DSL_BUILD_TYPE}Build_Cron") { properties { pipelineTriggers { triggers { cron { spec("${DSL_CRON}") } } } ${} でパラメータを参照 } parameters { stringParam("BUILD_TARGETS", "${DSL_BUILD_TARGETS}", "ビルドするターゲットリスト (, 区切り)") © DeNA Co., Ltd. 27

28.

JobDSL + JCasC ● JCasC で JobDSL の設定が可能になる ○ JCasC を読み込むとジョブが出来上がる ● JCasC にはジョブ生成ジョブのみ記載 ○ ジョブはプロジェクト固有なためジョブ生成ジョブを汎用化 ■ 対象のジョブ管理リポジトリをテンプレート変数で管理 ○ プロジェクト側のジョブ管理リポジトリの DSL を使って ジョブを生成する2段階の構成 © DeNA Co., Ltd. 28

29.
[beta]
JobDSL + JCasC + Ansible
jobs:
- script: >
job('Seed_JobDSL') {
description("Jenkins のジョブDSLからジョブを更新するジョブ ")
parameters {
textParam("DSL_SCRIPT_PATH", "jobs/**/*.groovy", "パス")
}
scm { git { remote { url '{{ jenkins_job_seed_repo }}' } } }
steps { jobDsl {
targets "\$DSL_SCRIPT_PATH"
リポジトリ指定を変数化
}}
}

© DeNA Co., Ltd.

29

30.

Jenkinsfile Jenkins のジョブを as Code ● Jenkins で実行する具体的な処理を記述 © DeNA Co., Ltd. 30

31.

Jenkins Shared Libraries Jenkins ジョブの共通処理を as Code ● Jenkins Shared Libraries で共通化 ○ Jenkins Shared Librariesの活用事例の紹介 - DeNA Testing Blog ○ 社内共通利用サービスとの連携処理 ● プラグインよりも Libraries を活用 ○ Pipeline 非対応プラグインへの対応可能 ○ プラグインメンテナンスは大変 © DeNA Co., Ltd. 31

32.

as Code リポジトリ構成 ● jenkins-terraform ● jenkins-job-dsl ○ terraform ○ JobDSL ● jenkins-controller-playbook ○ ansible ○ JCasC ○ Jenkinsfile ● 各種開発リポジトリ ○ Jenkinsfile ● jenkins-agent-playbook ○ ansible © DeNA Co., Ltd. 32

33.

安心安全な環境 © DeNA Co., Ltd. 33

34.

適切な権限管理 ● 誤った操作ができないように権限管理 ○ 閲覧者 ○ ジョブ実行者 ○ ジョブ開発者 ○ 管理者 ● as Code を保つためにジョブ開発者を制限 ○ プルリクエストで管理者がレビュー © DeNA Co., Ltd. 34

35.

安心安全な検証環境 ● VM を利用した Sandbox 環境 ○ Ansible のテスト環境を流用 ○ Controller/Agent 両方対応 ● 本番相当の仮想環境が構築可能 ○ CEDEC2020 のときはマシン環境構築まで ○ as Code により Jenkins 設定やジョブも含めて 本番相当な環境を構築可能になった © DeNA Co., Ltd. 35

36.

安心安全な検証環境 ● 動作検証が安全かつ簡単にできる ○ Jenkins バージョン/プラグインバージョンの更新検証にかかる 負担が大幅に減少 ■ Sandbox Controller でアップグレード ■ Sandbox Agent もしくはローカルPCを接続してジョブ実行検証 ○ ジョブ開発も Sandbox 環境で動作検証可能 © DeNA Co., Ltd. 36

37.

まとめ © DeNA Co., Ltd. 37

38.

as Code 徹底の結果 ● 圧倒的な安心感を得た ○ 壊れても大丈夫な再現性の高さ ○ 壊しても大丈夫な Sandbox 環境 ● 資産を流用できる ○ 毎プロジェクト組み直ししていたのが改善 ● ジョブ管理負担も軽減 ○ ジョブの新規作成もコードから簡単に作成 ○ JobDSL で柔軟なジョブ作成が可能になった © DeNA Co., Ltd. 38

39.

残念なお知らせ ● GitHub Actions が主体に切り替わったことで Jenkins 関連のメンテナンスがあまりされなくなった ○ Terraform/Ansible など資産の流用はできている ○ プラグイン頼りではなく Shared Libraries にしたのは良かった ■ 壊れづらい ○ 一番困ったのは VM 検証環境のメンテナンスができてないこと © DeNA Co., Ltd. ■ 「なにもしないと壊れる」世界がある ■ Sandbox 環境のスクリーンショットを載せたかったが断念… 39

40.

まとめ ● メンテナンスしっかりしていきましょう! © DeNA Co., Ltd. 40

41.

© DeNA Co., Ltd. 41