3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JenkinsをDockerで起動した話

Last updated at Posted at 2023-02-07

概要

表題通り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が使用できないところでちょっとつまりました。

とりあえず動かしただけですが、
あとは、環境に応じて処理を増やしてくことになるかと思います。
詳しいことはまだわからないので、なんか知見たまったら追記します。
たぶん、、、

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?