Windows環境にDockerでJenkinsを構築した時のメモ

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の初期設定画面が表示されるので先程取得したパスワードを入力する。

初期化が始まりアカウントを作成したら構築完了

Hugo で構築されています。
テーマ StackJimmy によって設計されています。