調べると過去の先人達の記事が幾つか出てきますが、私のしたい事とはちょっとずつ違っていたので、あれこれやってみた事をまとめてみました。
やりたいこと
- 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 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} ."
}
}
もちろん新規に追加することもできます。
追加したジョブ設定は 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