Edited at

Jenkinsのジョブをソースコードとしてバージョン管理したい

More than 1 year has passed since last update.

調べると過去の先人達の記事が幾つか出てきますが、私のしたい事とはちょっとずつ違っていたので、あれこれやってみた事をまとめてみました。


やりたいこと


  • Jenkinsのジョブ設定 (とPipelineコード) のみをバージョン管理したい


    • $JENKINS_HOME/jobs/{job-name}/config.xml



  • それ以外はバージョン管理しない


    • ジョブ履歴

    • ジョブワークスペース

    • 認証情報

    • ユーザー情報

    • etc...



  • Jenkinsの動作環境の構築手順もコード化したい


出来たもの

動くものがここ↓にあります。


動作環境:

→ Linux系OS, docker: 17.09.0-ce, docker-compose: 1.16.1



うごかしかた

githubからコードをcloneします。

$ git clone https://github.com/megmogmog1965/version-controlled-jenkins

コンテナを起動します。 (ビルドも勝手にされます)

$ cd /path/to/version-controlled-jenkins/

$ docker-compose up -d

ブラウザでアクセスします。


ホストマシンの ./jenkins_home/secrets/initialAdminPassword に Administrator password があります


起動時点で既にジョブ "Build docker image" があります。


  • jenkins-jobs.png

中身は Jenkins Pipeline ジョブです。docker/labs.git をcloneしてImageをビルドします。

node {

stage('Clone git repository') {
git url: 'https://github.com/docker/labs.git', branch: params['branch']
}
stage('Build docker image') {
sh "cd beginner/flask-app/ && docker build -t ${params.image_name}:${params.image_tag} ."
}
}

もちろん新規に追加することもできます。


  • new-job.png

追加したジョブ設定は git add . でバージョン管理対象にできます。その他の設定・データの類は無視されます。

$ git add .

$ git status

On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:

new file: jenkins_home/jobs/new_job/config.xml


しくみ



  • Dockerfile / docker-compose.yml でJenkins動作環境をコード化します


  • $JENKINS_HOME をgitでバージョン管理します。但し .gitignore$JENKINS_HOME/jobs/{job-name}/config.xml 以外を全て管理対象から外します

.

├── .gitignore
├── Dockerfile
├── docker-compose.yml
└── jenkins_home
└── jobs
└── {ジョブ名}
└── config.xml


Dockerfile

Jenkins公式のImage を元にカスタマイズして作ります。

ジョブが必要とする環境 (dockerコマンドとか, java, mvn, npm, etc...) の構築はここでソースコード化します。

FROM jenkins:2.60.3-alpine

# using root.
USER root

# setup local environment.
RUN apk upgrade --update && \
apk add --no-cache --update docker curl


docker-compose.yml

コンテナの立ち上げ方をソースコード化します。


  • ホストマシンの ./jenkins_home ディレクトリをコンテナの $JENKINS_HOME にマウントします。Jenkinsのデータはホストマシン上で永続化されます

  • ホストマシンの ./jenkins_home はジョブ設定 config.xml だけがgitバージョン管理されます

version: '3.1'

services:
jenkins:
build: .
ports:
- "8080:8080"
- "50000:50000"
volumes:
- ./jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock


/var/run/docker.sock:/var/run/docker.sock をマウントしているのは、Jenkinsジョブがdockerコマンドを使える様に、docker in docker の為です。これのせいでWindowsで動かないので、なくてもいいです。



.gitignore

ホストマシンの ./jenkins_home ディレクトリへのgit管理対象の除外設定です。

ジョブ設定 $JENKINS_HOME/jobs/{job-name}/config.xml のみがバージョン管理対象になります。

# manage: "jenkins_home/jobs/{job-name}/config.xml"

!jenkins_home/
jenkins_home/*
!jenkins_home/jobs/
jenkins_home/jobs/*
!jenkins_home/jobs/*/
jenkins_home/jobs/*/*
!jenkins_home/jobs/*/config.xml