概要
表題通りCI/CDツールの一つJenkinsサーバーをDockerを使って起動できたので、記事にします。
基本公式の手順にをなぞっているだけです。
先見の方の知見も大いに活用させていただきました。
解釈間違ってたらご容赦ください。
GitHub Project
公式リンク
Jenkins Docker Support
Jenkins Docker Hub
動作環境構築
動作確認環境
Operating System: Ubuntu 20.04.5 LTS
Kernel: Linux 5.4.0-137-generic
Architecture: x86-64
手順
Dockerfileを作成
FROM jenkins/jenkins
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"
docker-compose.ymlを作成
version: '3.9'
services:
docker:
image: docker:dind
privileged: true
networks:
- jenkins
environment:
DOCKER_TLS_CERTDIR: /certs
volumes:
- ./jenkins-docker-certs:/certs/client
- ./jenkins-home:/var/jenkins_home
expose:
- "2376"
jenkins-blueocean:
build: .
depends_on:
- docker
networks:
- jenkins
environment:
DOCKER_HOST: "tcp://docker:2376"
DOCKER_CERT_PATH: /certs/client
DOCKER_TLS_VERIFY: 1
expose:
- "8888"
- "50000"
ports:
- "8888:8080"
- "50000:50000"
volumes:
- ./jenkins-docker-certs:/certs/client:ro
- ./jenkins-home:/var/jenkins_home
networks:
jenkins:
driver: bridge
公式のDockerHubのイメージをpull
docker pull jenkins/jenkins
BuleOceanプラグインをイメージにビルド
docker build -t jenkins/jenkins .
DockerNetworkを作成
docker network create jenkins
docker-composeでjenkinsのdockerプロセスを起動
docker-compose -f docker-compose.yml up -d
dockerイメージからバインドしているディレクトリの所有者を現在のユーザーに変更
sudo chown -R ${USER}:${USER} jenkins-*
以上でjenkinsのサーバーがDockerで起動します
ブラウザでjenkinsのウェブページを表示できます。
http://<ホストPCのIP>:8888
docker-composeを起動したディレクトリ内に初期パスワードが記載されているファイルが作成されるので、内容をコピーしてログイン後、表示される初期化手順に従います。
./jenkins-home/secrets/initialAdminPassword
Jenkinsのpipeline実行
深堀すると他にもいろいろありそうですが、とりあえずリポジトリ内のjenkinsfileに動作ルールを記述すれば動くと思います。
agentがpipelineを実行時にホストとなる環境です。
pipeline {
agent {
docker {
image 'python:3.6' ※1
args '-u root:sudo'
}
}
stages {
stage('Build') {
steps {
sh '''
echo "building"
uname
cat /etc/*release
apt-get update && apt-get install sudo ※2
cd app
ls
sudo pip install -r requirements.txt
'''
}
}
stage('Test') {
parallel { ※3
stage('App') {
steps {
sh '''
cd app
ls
python3 ./app.py
'''
}
}
stage('HelloWorld') {
steps {
sh '''
cd app
ls
python3 ./helloworld.py
'''
}
}
}
}
stage('Deploy') {
steps {
sh 'echo "Deploy"'
}
}
}
}
※1 pythonを動かしたいのでpythonがインストールされているイメージを使用します。
※2 基本的に公式のDockerイメージはデフォルトではsudoが使用できないので、buildのスクリプトでインストール動作を記述しています。
※3 メインの実行処理ですが、並列処理の記述もできます。
以上
あとがき
sudoって標準で使えるものかと思っていたので、sudoが使用できないところでちょっとつまりました。
とりあえず動かしただけですが、
あとは、環境に応じて処理を増やしてくことになるかと思います。
詳しいことはまだわからないので、なんか知見たまったら追記します。
たぶん、、、