1、概念

Jenkins 是一个独立的、开源的自动化服务器,可用于自动化与软件构建、测试、交付或部署相关的各种任务。Jenkins 可以通过原生系统软件包、Docker 进行安装,甚至可以通过任何安装了 Java 运行时环境 (JRE) 的机器独立运行。

2、安装

2.1、docker 安装 Jenkins

注意哦~~我本机 windows 安装了 vpn,可以挂载 vpn 全局模式下载国外镜像。

1、官方文档

可以参考官方文档安装:https://jenkins.ac.cn/doc/book/installing/docker/

2、简洁安装方式

主要下载 docker:dind、jenkins,其中,docker:dind 给 jenkins 提供 docker 能力。

编写 jenkins-compose.yamljenkins.dockerfile ,其中,Jenkins.dockerfile 中依赖jenkins/jenkins:2.564-jdk21 镜像创建自定义拥有 docker 能力的 jenkins 镜像(官方提供的 jenkins 镜像没有docker 能力);jenkins-compose.yaml 用于编排安装运行上述 docker:dind 和自定义的 jenkins 镜像。

执行脚本:docker-compose -f D:\work\env\docker\jenkins\jenkins-compose.yaml up -d

jenkins-compose.yaml
version: '1.0'

services:
  jenkins-docker:
    # 1. 启动 docker in docker ,给 jenkins 提供 docker 能力
    image: docker:dind
    container_name: jt-docker-dind
    restart: always
    privileged: true # 给 docker 容器最高权限,可以执行 docker 命令,否则在容器中无法启动 docker
    volumes:
      - D:\work\env\docker\jenkins\certs:/certs/client
      - D:\work\env\docker\jenkins\data:/var/jenkins_home
    networks:
      - jt_jenkins_network
    ports:
      - 2376:2376
    environment:
      - DOCKER_TLS_CERTDIR=/certs  #开启 Docker TLS 安全认证,证书放在 /certs

  jenkins:
  # 构建 jenkins 容器,使用本地 dockerfile 构建的 jenkins 镜像
    build:
      context: .
      dockerfile: jenkins.dockerfile
    container_name: jt-jenkins
    # 在容器启动时,如果容器启动失败,则重启容器
    restart: on-failure
    volumes:
      - D:\work\env\docker\jenkins\data:/var/jenkins_home
      - D:\work\env\docker\jenkins\certs:/certs/client:ro  # ro = 只读
    networks:
      - jt_jenkins_network
    ports:
      - 8080:8080
      - 50000:50000
   # 设置 jenkins 容器的环境变量,使得 jenkins 容器可以访问 docker 容器
    environment:
      # 设置 jenkins 容器可以访问 docker 容器的地址
      - DOCKER_HOST=tcp://jenkins-docker:2376
      # 设置 jenkins 容器可以访问 docker 容器的证书路径
      - DOCKER_CERT_PATH=/certs/client 
      # 设置 jenkins 容器可以访问 docker 容器的 TLS 认证
      - DOCKER_TLS_VERIFY=1
    depends_on:
      - jenkins-docker
    

networks:
  jt_jenkins_network:
    driver: bridge
jenkins.dockerfile
# 基于 jenkins 官方镜像构建
FROM jenkins/jenkins:2.564-jdk21
# 切换到 root 用户
USER root
# 更新 apt 源,安装 lsb-release,lsb-release 是 Linux 上用来查看发行版标识信息的工具
RUN apt-get update && apt-get install -y lsb-release
# 添加 Docker 官方 GPG 密钥,有了这个密钥,才能从 Docker 官方源下载安装 Docker CE CLI
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
  https://download.docker.com/linux/debian/gpg
# 添加 Docker 官方源,这个源是 Docker 官方提供的,包含了 Docker CE CLI 的安装包
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
# 更新 apt 源,安装 Docker CE CLI
RUN apt-get update && apt-get install -y docker-ce-cli
# 切换到 jenkins 用户
USER jenkins
# 安装 Jenkins 插件,blueocean 是 Jenkins 的蓝海项目,docker-workflow 是 Jenkins 的 Docker 工作流插件,json-path-api 是 Jenkins 的 JSON 路径 API 插件
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow json-path-api"

3、jenkins 初始化设置

jenkins 容器启动后,访问 http://localhost:8080/ 控制台。

安装设置流程
image-zmlC.png
image-Nhxl.png

进入 jt-jenkins 容器,执行:cat /var/jenkins_home/secrets/initialAdminPassword 得到密码

image-Hleb.png
image-FBAB.png

注意哦~~安装时要开全局模式 vpn,否则这些插件下不下来

image-eYFm.png
image-hTvA.png

登录失败

初始 jenkins 如果没有配置好,存在刷新后没有用户名密码,登录会失败。

解决办法(docker 安装 jenkins):

1、以 root 身份进入 docker 中的 jenkins 命令行

docker exec -u 0 -it jt-jenkins /bin/bash

2、首先下载 vim

apt-get update && apt-get install -y vim

3、编辑 vim /var/jenkins_home/config.xml 文件

注释如下内容,重启 docker :1. exit 2. docker restart jt-jenkins

<?xml version='1.1' encoding='UTF-8'?>
<hudson>
  <disabledAdministrativeMonitors/>
  <version>2.564</version>
  <numExecutors>2</numExecutors>
  <mode>NORMAL</mode>
<!--     注释如下配置,jenkins 可无密码直接登录
  <useSecurity>true</useSecurity>
  <authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">
    <denyAnonymousReadAccess>false</denyAnonymousReadAccess>
  </authorizationStrategy>
  <securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
    <disableSignup>false</disableSignup>
    <enableCaptcha>false</enableCaptcha>
  </securityRealm>
-->
  <disableRememberMe>false</disableRememberMe>
  <projectNamingStrategy class="jenkins.model.ProjectNamingStrategy$DefaultProjectNamingStrategy"/>
  <workspaceDir>${JENKINS_HOME}/workspace/${ITEM_FULL_NAME}</workspaceDir>
  <buildsDir>${ITEM_ROOTDIR}/builds</buildsDir>
  <markupFormatter class="hudson.markup.EscapedMarkupFormatter"/>
  <jdks/>
  <viewsTabBar class="hudson.views.DefaultViewsTabBar"/>
  <myViewsTabBar class="hudson.views.DefaultMyViewsTabBar"/>
  <clouds/>
  <scmCheckoutRetryCount>0</scmCheckoutRetryCount>
  <views>
    <hudson.model.AllView>
      <owner class="hudson" reference="../../.."/>
      <name>all</name>
      <filterExecutors>false</filterExecutors>
      <filterQueue>false</filterQueue>
      <properties class="hudson.model.View$PropertyList"/>
    </hudson.model.AllView>
  </views>
  <primaryView>all</primaryView>
  <slaveAgentPort>50000</slaveAgentPort>
  <label></label>
  <crumbIssuer class="hudson.security.csrf.DefaultCrumbIssuer"/>
  <nodeProperties/>
  <globalNodeProperties/>
  <nodeRenameMigrationNeeded>false</nodeRenameMigrationNeeded>
</hudson

4、访问 localhost:8080 ,修改全局安全配置

配置安全域为:Jenkins 专有用户数据库 → 允许用户注册

重新注册

5、登录后,修改安全配置,不在允许注册