1. 项目概述与核心价值

最近在跟几个做后端和运维的朋友聊天,发现一个挺有意思的现象:大家聊到自动化部署和CI/CD(持续集成/持续交付)时,Jenkins依然是那个绕不开的“老伙计”。但有意思的是,现在几乎没人再提直接在服务器上裸装Jenkins了,话题的焦点都变成了“用Docker跑Jenkins”。这其实反映了一个很明显的趋势:容器化部署已经从一个“加分项”变成了“默认项”。今天,我就想结合自己这些年折腾环境的经验,来详细聊聊怎么用Docker把Jenkins稳稳当当地跑起来,以及在这个过程中你会遇到哪些“坑”,又该怎么优雅地跨过去。

简单来说,这个项目就是利用Docker容器技术来部署和运行Jenkins这个老牌的自动化服务器。它解决的核心痛点是环境的一致性与部署的便捷性。回想以前,在一台新服务器上部署Jenkins,你得先确认Java版本,处理各种系统依赖,配置用户权限,一不小心就可能因为环境差异导致构建失败。而Docker化之后,Jenkins及其运行环境被打包成一个标准的镜像,在任何支持Docker的机器上,都能以完全相同的方式启动和运行,真正实现了“一次构建,到处运行”。无论你是个人开发者想搭建一个学习环境,还是团队需要快速搭建一套标准的CI/CD流水线,Docker安装Jenkins都是一个高效、可靠的起点。

2. 环境准备与Docker基础

在真正动手拉取Jenkins镜像之前,确保你的Docker环境是健康且配置妥当的,这能避免至少一半后续可能出现的奇怪问题。很多人一上来就 docker run jenkins ,结果各种报错,其实根源往往在第一步就没打好基础。

2.1 Docker引擎的安装与验证

首先,你需要一个正常运行的Docker引擎。根据你的操作系统,安装方式略有不同。对于Linux系统(如Ubuntu/CentOS),我强烈建议通过官方仓库安装,而不是使用系统自带的旧版本包。

以Ubuntu 22.04为例,标准的安装流程如下:

# 1. 更新软件包索引并安装必要的依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release

# 2. 添加Docker官方GPG密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 3. 设置稳定版仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 4. 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

安装完成后,运行 sudo docker run hello-world 来验证安装是否成功。如果能看到欢迎信息,说明Docker引擎已经可以正常工作。

注意 :对于Windows和macOS用户,通常推荐安装Docker Desktop。但这里有一个 高频踩坑点 Docker Desktop failed to start because virtualisation support wasn’t detected 。这个错误意味着你的系统虚拟化支持未开启。解决方法通常是进入电脑的BIOS/UEFI设置(开机时按F2、Del等键),找到“Virtualization Technology”(VT-x/AMD-V)选项并启用它。在Windows上,还需要确保“Windows功能”中的“Hyper-V”和“Windows Subsystem for Linux”被勾选启用。

2.2 Docker镜像源加速配置

默认的Docker Hub镜像仓库在国内拉取速度可能很慢,甚至超时,这会导致 docker pull jenkins 命令卡住。配置一个国内的镜像加速器是必做操作。

修改或创建 /etc/docker/daemon.json 文件(Linux/macOS)或通过Docker Desktop的Settings进行配置(Windows)。以阿里云镜像加速器为例:

{
  "registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"]
}

修改后需要重启Docker服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

之后,你可以通过 docker info 命令查看 Registry Mirrors 一项,确认加速器是否生效。

2.3 理解Docker运行Jenkins的核心逻辑

很多人把Docker容器当成一个轻量级虚拟机,这是一个常见的误解。对于Jenkins来说,把它放进容器,我们追求的是进程隔离和环境封装,而不是在容器里再装一个完整的操作系统。官方Jenkins镜像本身基于一个精简的Linux发行版(如Alpine或OpenJDK官方镜像),只包含了运行Jenkins所必需的Java环境和基础工具。

这意味着, 容器内的Jenkins数据(如任务配置、插件、构建日志)默认是易失的 。一旦容器被删除,所有数据都会丢失。因此,我们的核心操作思路是: 将容器内需要持久化的数据目录,通过“卷(Volume)”或“绑定挂载(Bind Mount)”的方式,映射到宿主机(Host)的物理磁盘上 。这是整个Docker化部署中最关键的一步,理解透了,后面的一切都顺理成章。

3. Jenkins镜像的选择与容器启动

准备好了Docker环境,接下来就是选择镜像和启动容器。这里面的门道,直接决定了你后续使用的稳定性和便利性。

3.1 官方镜像与标签策略

直接运行 docker pull jenkins 会拉取最新的 jenkins:latest 标签。但在生产环境或追求稳定性的场景下,我 极其不推荐 使用 latest 标签。因为这个标签指向的版本会随时更新,可能导致今天还能用的配置,明天就因为版本升级而出现兼容性问题。

正确的做法是使用带有具体版本号的标签。你可以去 Docker Hub Jenkins页面 查看所有可用标签。通常, jenkins/jenkins:lts (长期支持版)或 jenkins/jenkins:2.4xx 这样的具体LTS版本是更稳妥的选择。注意,近年来官方推荐使用 jenkins/jenkins 这个镜像名,它比旧的 jenkins 镜像维护得更积极。

# 拉取最新的LTS版本镜像
docker pull jenkins/jenkins:lts

# 或者拉取一个具体的LTS版本,例如2.426.1
docker pull jenkins/jenkins:2.426.1-lts

3.2 首次启动与数据持久化

现在,让我们启动第一个Jenkins容器,并完成数据持久化。我们将使用 docker run 命令,并附上关键的参数。

# 创建一个目录用于存放Jenkins的持久化数据
sudo mkdir -p /var/jenkins_home
# 修改目录权限,确保容器内的Jenkins用户(UID 1000)可以写入
sudo chown -R 1000:1000 /var/jenkins_home

# 运行Jenkins容器
docker run -d \
  --name my-jenkins \
  -p 8080:8080 \
  -p 50000:50000 \
  -v /var/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkins/jenkins:lts

让我逐一解释这些参数:

  • -d :后台运行容器。
  • --name my-jenkins :给容器起个名字,方便后续管理。
  • -p 8080:8080 :将容器的8080端口(Jenkins Web界面)映射到宿主机的8080端口。
  • -p 50000:50000 :映射50000端口,用于Jenkins Agent(构建节点)的通信,这是分布式构建所必需的。
  • -v /var/jenkins_home:/var/jenkins_home :这是 数据持久化的核心 。将宿主机目录 /var/jenkins_home 挂载到容器内的 /var/jenkins_home 。这样,所有Jenkins配置、插件、任务数据都实际保存在宿主机上。
  • -v /var/run/docker.sock:/var/run/docker.sock :这是一个 高级且实用的挂载 。它允许Jenkins容器直接与宿主机上的Docker守护进程通信。这意味着,你可以在Jenkins的Pipeline脚本中直接使用 docker 命令来构建和运行其他容器,实现“Docker in Docker”(DinD)的效果,对于构建Docker镜像的流水线非常有用。 注意 :这带来了安全风险,因为它赋予了容器很高的权限,仅在可信环境或为简化学习流程时使用。

实操心得 :关于 /var/jenkins_home 的权限问题,是新手第一个大坑。容器内的Jenkins进程默认以用户 jenkins (UID 1000)运行。如果你在宿主机上用 root 创建了目录并启动容器,Jenkins用户将没有写入权限,导致启动失败。所以务必 chown 1000:1000 。更优雅的做法是使用Docker的“命名卷”(Named Volume),让Docker自动管理权限和存储位置: docker volume create jenkins-data ,然后在运行时使用 -v jenkins-data:/var/jenkins_home

3.3 初始解锁与插件安装

容器启动后,用浏览器访问 http://你的服务器IP:8080 。你会看到Jenkins的解锁页面。

要获取初始管理员密码,需要查看容器的日志输出:

# 查看容器日志,找到初始密码
docker logs my-jenkins

在日志中寻找一行类似 Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: 的信息,下面就是密码。

或者直接进入容器内部查看密码文件:

docker exec my-jenkins cat /var/jenkins_home/secrets/initialAdminPassword

输入密码后,会进入插件安装界面。这里我建议 选择“安装推荐的插件” 。这是最省事且覆盖了基础功能的方式。网络通畅的话,等待其安装完成即可。如果遇到插件下载慢或失败,可以稍后在Jenkins管理界面更换为国内的插件更新中心镜像地址。

安装完插件,创建第一个管理员用户,配置实例URL,你的Docker版Jenkins就初步就绪了。

4. 进阶配置与优化

基础服务跑起来只是第一步,要让Jenkins在容器里用得顺手,还需要一些进阶配置。这些配置能显著提升你的使用体验和系统的健壮性。

4.1 使用Docker Compose编排服务

对于需要多个参数和卷挂载的复杂容器,使用 docker run 命令既冗长又难以维护。 Docker Compose 是管理多容器应用的神器,即使只有一个Jenkins容器,用它来定义也能让配置清晰可见、易于版本管理。

创建一个 docker-compose.yml 文件:

version: '3.8'
services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins
    restart: unless-stopped # 确保容器意外退出时自动重启
    privileged: false
    user: root # 为了方便示例,这里使用root,生产环境应使用更严格的用户映射
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - jenkins-data:/var/jenkins_home # 使用命名卷
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker # 将宿主机docker客户端挂载进去(可选)
      - ./casc-configs:/var/jenkins_home/casc-configs # 用于Configuration as Code
    environment:
      - JAVA_OPTS=-Djenkins.install.runSetupWizard=false # 跳过安装向导(需配合Casc)
      - TZ=Asia/Shanghai # 设置容器时区
volumes:
  jenkins-data:

然后,在文件所在目录执行 docker-compose up -d 即可启动。管理命令也变得更简单: docker-compose logs 查看日志, docker-compose down 停止并移除容器, docker-compose restart 重启。

4.2 配置时间与容器资源限制

容器内默认是UTC时间,这会导致构建日志的时间戳与我们本地时间不符。通过环境变量 TZ=Asia/Shanghai 可以解决。另外,为容器分配合理的资源限制是个好习惯,可以防止单个容器耗尽主机资源。

docker run 命令或 docker-compose.yml 中,可以添加资源限制:

# 在docker-compose.yml的jenkins服务下添加
deploy:
  resources:
    limits:
      cpus: '2.0'
      memory: 4G
    reservations:
      memory: 1G

这限制了Jenkins容器最多使用2个CPU核心和4GB内存,并确保至少有1GB内存预留。

4.3 实现Configuration as Code (JCasC)

这是Jenkins运维的“终极武器”。传统上,Jenkins的所有配置(系统设置、插件配置、凭据、节点等)都通过Web界面手动点击完成,难以备份和复制。JCasC插件允许你用YAML文件来定义Jenkins的整个配置。

  1. 在Jenkins中安装 “Configuration as Code” 插件。
  2. 在宿主机上准备一个YAML配置文件,例如 jenkins-casc.yaml ,内容可以包含基础配置:
    jenkins:
      systemMessage: “Jenkins configured automatically by Docker & JCasC”
    credentials:
      system:
        domainCredentials:
          - credentials:
              - usernamePassword:
                  scope: GLOBAL
                  id: “gitlab-credential”
                  username: “${GITLAB_USER}”
                  password: “${GITLAB_TOKEN}”
    
  3. 修改你的Docker启动命令或Compose文件,将这个配置目录挂载进去,并设置环境变量指向它:
    volumes:
      - ./jenkins-casc.yaml:/var/jenkins_home/casc-configs/jenkins.yaml
    environment:
      - CASC_JENKINS_CONFIG=/var/jenkins_home/casc-configs
    

这样,每次启动容器,Jenkins都会根据YAML文件自动配置。你的所有基础设施变更都变成了代码,可以纳入Git版本控制。

5. 构建流水线实战与集成

Jenkins的核心价值在于自动化流水线。这里我们以一个典型的“从GitLab拉取代码,构建Docker镜像并推送”的流水线为例,展示如何与容器环境结合。

5.1 准备Jenkins环境

首先,需要在Jenkins中配置必要的凭据和工具。

  1. 配置GitLab凭据 :在“Manage Jenkins” -> “Manage Credentials” 中,添加你的GitLab用户名和密码(或个人访问令牌Token)。Token比密码更安全。
  2. 配置Docker Registry凭据 :同上,添加你的私有镜像仓库(如Harbor)或Docker Hub的登录凭据。
  3. 确保Docker可用 :因为我们挂载了 docker.sock ,所以在Jenkins的Pipeline脚本中,可以直接调用 docker 命令。你可以在Pipeline的 sh 步骤中执行 docker version 来测试。

5.2 编写Jenkinsfile

在你的Git项目根目录下创建一个 Jenkinsfile ,这是流水线即代码的定义文件。

pipeline {
    agent any // 使用任何可用的代理执行
    environment {
        // 使用在Jenkins中配置的凭据ID
        GITLAB_CREDENTIALS = credentials('gitlab-credential-id')
        DOCKER_REGISTRY_CREDENTIALS = credentials('docker-hub-credential-id')
        DOCKER_IMAGE = ‘your-username/your-app’
        DOCKER_TAG = “${env.BUILD_NUMBER}”
    }
    stages {
        stage(‘Checkout’) {
            steps {
                // 使用凭据从GitLab拉取代码
                git credentialsId: ‘gitlab-credential-id’, url: ‘https://gitlab.com/your-group/your-project.git’, branch: ‘main’
            }
        }
        stage(‘Build’) {
            steps {
                script {
                    // 使用挂载进来的Docker命令构建镜像
                    sh “docker build -t ${DOCKER_IMAGE}:${DOCKER_TAG} .”
                }
            }
        }
        stage(‘Test’) {
            steps {
                // 运行测试,例如运行一个包含测试的容器
                sh “docker run --rm ${DOCKER_IMAGE}:${DOCKER_TAG} npm test”
            }
        }
        stage(‘Push’) {
            steps {
                script {
                    // 登录Docker Registry
                    sh “echo ${DOCKER_REGISTRY_CREDENTIALS_PSW} | docker login -u ${DOCKER_REGISTRY_CREDENTIALS_USR} --password-stdin”
                    // 推送镜像
                    sh “docker push ${DOCKER_IMAGE}:${DOCKER_TAG}”
                    // 同时打上latest标签并推送(可选)
                    sh “docker tag ${DOCKER_IMAGE}:${DOCKER_TAG} ${DOCKER_IMAGE}:latest”
                    sh “docker push ${DOCKER_IMAGE}:latest”
                }
            }
        }
        stage(‘Deploy’) {
            steps {
                // 例如,在另一台服务器上拉取新镜像并重启服务
                sh “ssh user@production-server ‘docker pull ${DOCKER_IMAGE}:${DOCKER_TAG} && docker-compose up -d’”
            }
        }
    }
    post {
        always {
            // 清理构建环境,例如删除临时镜像
            sh ‘docker system prune -f’
        }
        success {
            echo ‘Pipeline succeeded!’
        }
        failure {
            echo ‘Pipeline failed!’
        }
    }
}

5.3 创建流水线任务

在Jenkins中,新建一个“流水线(Pipeline)”类型的任务。

  • 在“流水线”配置部分,选择“Pipeline script from SCM”。
  • SCM选择“Git”,填入你的仓库URL,并指定凭据。
  • 在“脚本路径”中,填写 Jenkinsfile (如果它在根目录)。 保存后,点击“立即构建”,Jenkins就会自动按照 Jenkinsfile 定义的步骤执行整个CI/CD流程。

6. 运维、监控与故障排查

将Jenkins放入容器后,日常的运维和监控方式也需要进行相应的调整。

6.1 日常运维命令

掌握几个关键的Docker命令,就能轻松管理Jenkins容器:

# 查看容器运行状态
docker ps | grep jenkins

# 查看容器实时日志(类似 tail -f)
docker logs -f my-jenkins

# 进入容器内部(用于调试)
docker exec -it my-jenkins /bin/bash

# 重启容器
docker restart my-jenkins

# 停止并删除容器(数据卷会保留)
docker stop my-jenkins && docker rm my-jenkins

# 备份数据卷(假设使用命名卷 jenkins-data)
docker run --rm -v jenkins-data:/source -v $(pwd):/backup alpine tar czf /backup/jenkins-backup-$(date +%Y%m%d).tar.gz -C /source .

6.2 监控与日志管理

  • 资源监控 :使用 docker stats my-jenkins 可以实时查看容器的CPU、内存使用情况。对于生产环境,可以集成Prometheus+Grafana,利用 cAdvisor node-exporter 来监控容器和宿主机的资源。
  • 日志管理 :默认情况下,Jenkins的访问日志和应用日志都输出到容器的标准输出(stdout/stderr),可以通过 docker logs 查看。对于更结构化的日志管理,可以考虑:
    1. docker run 时使用 --log-driver 指定日志驱动,如 json-file (默认)、 syslog journald
    2. 使用 docker logs --tail 100 --follow my-jenkins 持续跟踪最新日志。
    3. 搭建ELK(Elasticsearch, Logstash, Kibana)或Loki+Grafana等日志聚合系统,将容器日志统一收集和分析。

6.3 常见问题与排查技巧

即使准备得再充分,实际运行中还是会遇到问题。下面是一些典型问题及其排查思路:

问题现象 可能原因 排查步骤与解决方案
浏览器访问 8080 端口无法连接 1. 容器未启动。
2. 防火墙/安全组未开放端口。
3. 端口被占用。
1. docker ps 查看容器状态, docker logs 查看启动日志。
2. 检查宿主机防火墙( ufw status / firewall-cmd )和云服务商安全组规则。
3. `netstat -tlnp
Jenkins启动成功,但插件安装极慢或失败 网络连接问题,默认插件中心地址在国外。 1. 更换为国内镜像源:在Jenkins管理后台,“Manage Jenkins” -> “Plugin Manager” -> “Advanced”,将“Update Site”的URL替换为清华镜像 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
2. 或手动下载插件 .hpi 文件,在“Advanced”选项卡中上传安装。
Pipeline中执行 docker 命令提示“权限拒绝” 容器内的用户(jenkins)没有访问 /var/run/docker.sock 的权限。 1. 检查宿主机上 docker.sock 的权限: ls -l /var/run/docker.sock ,通常属于 root:docker
2. 启动容器时,将用户加入 docker 组: -u root (最简单但不安全),或者更安全地在宿主机创建一个组,将 docker.sock 的组权限赋予它,然后让容器用户加入该组(需自定义镜像)。
容器启动后,Jenkins数据目录为空或权限错误 卷挂载的宿主机目录权限不正确。 1. 检查宿主机目录是否存在,以及其所有者和权限: ls -ld /var/jenkins_home
2. 确保目录所有者是UID 1000(或你指定的用户): sudo chown -R 1000:1000 /var/jenkins_home
3. 推荐改用命名卷 ,让Docker自动管理权限。
构建时内存不足,Jenkins被终止(OOM Killer) 容器内存限制过小,或单个构建任务消耗内存过多。 1. 增加容器的内存限制(通过 -m 参数或Compose文件中的 deploy.resources.limits.memory )。
2. 优化构建脚本,避免在构建过程中产生过大的中间文件。
3. 在Jenkins系统配置中,调整执行器数量,减少并发构建任务。
如何修改Jenkins管理员密码? 忘记密码或需要重置。 方法一(通过容器) :进入容器,编辑 /var/jenkins_home/users/<username>/config.xml ,找到 passwordHash 字段,将其值替换为新密码的哈希值(可用 openssl passwd -6 生成)。
方法二(更安全) :如果启用了安全设置,可以用初始管理员账户(密码在 initialAdminPassword 文件中)登录,然后在“用户管理”中直接修改。

6.4 备份与恢复策略

数据无价,定期备份 /var/jenkins_home 目录(或你命名的数据卷)至关重要。

  1. 简单备份 :使用 tar 命令定期打包数据目录。
    # 备份
    docker run --rm --volumes-from my-jenkins -v $(pwd):/backup alpine tar czf /backup/jenkins-backup-$(date +%Y%m%d).tar.gz -C /var/jenkins_home .
    # 恢复(需先停止Jenkins容器)
    docker run --rm --volumes-from my-jenkins -v $(pwd):/backup alpine sh -c “cd /var/jenkins_home && tar xzf /backup/jenkins-backup-20231027.tar.gz”
    
  2. 版本化备份 :将 jenkins_home 中的重要配置文件(如 jobs/ , users/ , secrets/ 等)纳入一个私有Git仓库进行版本管理,结合JCasC,实现配置的完全可追溯。
  3. 云存储备份 :编写脚本,将备份文件上传到云存储服务(如AWS S3、阿里云OSS、腾讯云COS)。

7. 安全加固与生产环境建议

在开发测试环境怎么方便怎么来,但一旦考虑生产环境,安全就是头等大事。Docker化的Jenkins同样需要遵循安全最佳实践。

7.1 容器安全原则

  1. 避免使用 --privileged -u root :除非绝对必要,否则不要给Jenkins容器特权或root身份运行。我们之前挂载 docker.sock 已经赋予了很大权限,应将其限制在仅构建Docker镜像的特定构建节点上,而不是主控制器(Master)。
  2. 使用非root用户运行容器 :Jenkins官方镜像已经使用 jenkins 用户(UID 1000)。确保你的卷挂载目录对该用户可写即可。
  3. 限制容器资源 :如前所述,使用 -m , --cpus 等参数限制容器的CPU和内存使用,防止资源耗尽攻击或程序bug导致系统瘫痪。
  4. 定期更新镜像 :关注安全公告,定期将基础镜像(如 jenkins/jenkins:lts )更新到最新的小版本,以获取安全补丁。

7.2 网络与访问安全

  1. 使用反向代理 :不要直接将Jenkins的8080端口暴露在公网。使用Nginx或Traefik作为反向代理,可以方便地添加SSL/TLS加密(HTTPS)、访问控制、限流等功能。
    # Nginx 配置示例片段
    server {
        listen 443 ssl;
        server_name jenkins.your-domain.com;
        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;
        location / {
            proxy_pass http://localhost:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
  2. 配置Jenkins安全域 :在Jenkins的“Configure Global Security”中,启用安全矩阵或基于项目的授权策略,遵循最小权限原则,为不同用户或团队分配精确的权限。
  3. 管理好凭据 :充分利用Jenkins的“Credentials”功能存储密码、密钥、令牌等敏感信息。避免在Pipeline脚本中硬编码密码。对于云服务商(如AWS、Azure)的访问,尽量使用临时安全凭证(如IAM Role、SAS Token)。

7.3 构建环境隔离

让Jenkins Master只做调度和管理,具体的构建任务交给独立的Agent(节点)去执行。这能提高安全性、稳定性和可扩展性。

  1. 使用Docker动态创建Agent :安装“Docker Plugin”或“Kubernetes Plugin”。当有构建任务时,Jenkins Master会指示Docker守护进程启动一个包含特定构建工具(如Maven, Go, Node.js)的临时容器作为Agent,任务完成后容器自动销毁。这种方式实现了极致的环境隔离和清洁。
  2. 使用静态Agent :对于需要特殊硬件或持久化工作空间的场景,可以创建常驻的虚拟机或物理机作为Agent,并将其注册到Jenkins Master。

我个人在多个生产环境中的体会是,将Jenkins Docker化,再结合Configuration as Code和动态Docker Agent,整套CI/CD系统的可维护性和可复现性会得到质的提升。初期可能会觉得配置繁琐,但一旦形成规范,新环境的搭建、旧环境的迁移、配置的回滚都变得异常简单。最后一个小技巧:把所有Docker Compose文件、JCasC YAML文件、备份脚本都放到一个Git仓库里,你的整个Jenkins基础设施也就实现了“代码化”管理。

更多推荐