PHPで開発をして結構経つがビルド・デプロイといったCI/CD環境が整っていなく
後々不便になるのでjenkinsを触る事にしたので、構築等にメモ
Jenkinsを選んだ理由
2026年現時点だとGitHub ActionsやAWSのアーキテクチャで簡単に構築できるものが沢山あるが
社内都合によりGitHubやGitLabが使えないという点と1から学習するにはjenkinsがいいかなと思ったのが理由。
実行環境
今回は以下の実行環境にて構築した
- windows 10
- Docker Desktop
- jenkinsイメージ(v2.541.2)
まずDockerの環境は以下のように構築
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
project
│
├─jenkins
│ ├─build-image
│ │ Dockerfile
│ │
│ ├─jenkins-libs
│ │ └─jenkins-ci-library
│ │ └─vars
│ │ phpCiPipline.groovy
│ ├─workspace
│ │
│ ├─entrypoint.sh
│ │
│ └─Dockerfile
└─docker-compose.yml
|
docker-compose.yml
docker-composeは以下のように設定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
services:
jenkins:
build:
context: ./jenkins
privileged: true
ports:
- "8081:8080"
- "50000:50000"
volumes:
- jenkins_home:/var/jenkins_home
- ./jenkins/workspace:/var/jenkins_home/workspace
- ./jenkins/jenkins-libs:/opt/jenkins-libs
- /var/run/docker.sock:/var/run/docker.sock
environment:
- JAVA_OPTS=-Dhudson.plugins.git.GitSCM.ALLOW_LOCAL_CHECKOUT=true
- TZ=Asia/Tokyo
- LANG=ja_JP.UTF-8
volumes:
jenkins_home:
|
内容の説明
今回はテストも兼ねてjenkinsのworkspaceを指定のディレクトリにマウントする
1
2
|
# volumes
- ./jenkins/workspace:/var/jenkins_home/workspace
|
jenkinsのパイプラインをテンプレート化する為のディレクトリもマウントする。
またテンプレートは本来gitでサーバーに上げる必要があるが今回はローカルで完結させる為ローカルアクセスの許可設定を入れる
1
2
3
4
5
|
# volumes
- ./jenkins/jenkins-libs:/opt/jenkins-libs
# environment
- JAVA_OPTS=-Dhudson.plugins.git.GitSCM.ALLOW_LOCAL_CHECKOUT=true
|
今回ビルド環境にはDockerを使うためdockerもマウントする
1
2
|
# volumes
- /var/run/docker.sock:/var/run/docker.sock
|
Jenkins用Dockerfile
jenkins用のDcokerfileは以下のように記述
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
FROM jenkins/jenkins:lts
USER root
# 必要パッケージ
RUN apt-get update && apt-get install -y \
git \
unzip \
curl \
php \
php-cli \
php-mbstring \
php-xml \
php-curl \
php-zip \
php-xdebug \
php-gd \
sudo \
&& rm -rf /var/lib/apt/lists/*
# Composer
RUN curl -sS https://getcomposer.org/installer | php \
&& mv composer.phar /usr/local/bin/composer
# Docker
RUN curl -fsSL https://get.docker.com -o get-docker.sh \
&& sh get-docker.sh \
&& rm get-docker.sh
# Docker Group
RUN usermod -aG docker jenkins
# Allow jenkins to use sudo without password
RUN echo "jenkins ALL=(ALL) NOPASSWD: /bin/chmod" >> /etc/sudoers
# Entrypoint
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
USER jenkins
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
|
内容の説明
jenkins内でPHPのデプロイ等を行いたいのでPHPで必要なライブラリとcomposerを入れておく
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 必要パッケージ
RUN apt-get update && apt-get install -y \
git \
unzip \
curl \
php \
php-cli \
php-mbstring \
php-xml \
php-curl \
php-zip \
php-xdebug \
php-gd \
sudo \
&& rm -rf /var/lib/apt/lists/*
# Composer
RUN curl -sS https://getcomposer.org/installer | php \
&& mv composer.phar /usr/local/bin/composer
|
jenkinsのビルドはコンテナを使って実行したいのでDockerをインストールする
1
2
3
4
|
# Docker
RUN curl -fsSL https://get.docker.com -o get-docker.sh \
&& sh get-docker.sh \
&& rm get-docker.sh
|
jenkinsユーザーでもDockerを実行できるようにグループに追加する
1
|
RUN usermod -aG docker jenkins
|
ここで自分の環境の問題なのかDocker Desktopを使っているからかjenkinsユーザーをDockerグループに追加してもDockerがパーミッションエラーになってしまう為Entrypointを使ってパーミッションを666に変更。
1
2
3
|
# Entrypoint
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
|
※一応ローカルの検証目的で行ってるので本番運用する際は要注意
entrypoint.sh
jenkinsユーザーをDockerグループに入れただけだとエラーになるのでコンテナ起動時にパーミッションを変更するスクリプトを入れておく。
1
2
3
4
|
# entrypoint.sh
#!/bin/bash
sudo chmod 666 /var/run/docker.sock 2>/dev/null || true
exec /usr/local/bin/jenkins.sh "$@"
|
ビルド&起動
後はDockerコマンドを利用してビルド&コンテナを起動する
1
|
docker-compose up -d --build
|
コンテナを起動したら一度コンテナにログインしてdockerがjenkinsユーザーで起動するか要確認
1
2
3
4
5
6
7
8
|
#ターミナル側
docker-compose exec -it <jenkinsコンテナ> /bin/bash
#dockerコンテナ内側
#ユーザーがjenkinsになってるのを確認
docker ps
#/var/run/docker.sock パーミッションエラーのメッセージが出なければ成功
|
次に初期設定時に必要なパスワードをコンテナ内から取得する
1
2
3
4
5
|
#ターミナル側
docker-compose exec -it <jenkinsコンテナ> /bin/bash
#dokcerコンテナ内
cat /var/jenkins_home/secrets/initialAdminPassword
|
「localhost:8081」にアクセスするとjenkinsの初期設定画面が表示されるので先程取得したパスワードを入力する。
初期化が始まりアカウントを作成したら構築完了