需求背景

搭建一套容器化的 CI/CD 系统,实现代码提交后自动触发构建、测试、打包 Docker 镜像并推送至镜像仓库的全流程自动化,提高开发效率,减少人工操作错误。

实现步骤

  1. 环境准备
  • 安装 Docker 和 Docker Compose,确保用户有权限操作 Docker。
  • 准备镜像仓库(如 Docker Hub、阿里云容器仓库),并创建访问账号。
  • 规划目录结构:

TypeScript取消自动换行复制


  1. Docker Compose 配置

部署 Jenkins 容器,并挂载 Docker socket 以实现容器内操作 Docker:

TypeScript取消自动换行复制


  1. 初始化 Jenkins
  • 启动服务:docker-compose up -d
  • 查看初始密码:docker logs jenkins_jenkins_1 | grep "Administrator password"
  • 访问http://localhost:8080,输入密码完成安装,推荐安装 “推荐插件”。
  1. 安装必要插件
  • 进入 “系统管理”→“插件管理”,安装以下插件:
  • Docker Pipeline:支持在流水线中操作 Docker。
  • Git:从 Git 仓库拉取代码。
  • Pipeline:创建声明式流水线。
  • Credentials Binding:管理敏感信息(如仓库账号)。
  1. 配置镜像仓库凭据
  • 进入 “系统管理”→“凭据”→“系统”→“全局凭据”,添加 “Username with password” 类型凭据:
  • Username:镜像仓库账号(如 Docker Hub 用户名)。
  • Password:仓库密码或访问令牌。
  • ID:设置标识(如docker-hub-creds),后续在流水线中引用。
  1. 创建 CI/CD 流水线
  • 新建任务,选择 “流水线”,命名为demo-pipeline。
  • 在 “流水线” 配置中选择 “Definition” 为 “Pipeline script from SCM”,SCM 选择 “Git”,填写代码仓库 URL(如https://github.com/your/repo.git)。
  • 在代码仓库根目录创建Jenkinsfile,定义流水线流程:

TypeScript取消自动换行复制

}

stage('构建Docker镜像') {

steps {

sh "docker build -t ${REPO}:${TAG} ."

}

}

stage('推送镜像到仓库') {

steps {

withCredentials([usernamePassword(credentialsId: 'docker-hub-creds', passwordVariable: 'PWD', usernameVariable: 'USER')]) {

sh "docker login -u ${USER} -p ${PWD}"

sh "docker push ${REPO}:${TAG}"

}

}

}

stage('清理') {

steps {

sh "docker rmi ${REPO}:${TAG}" # 清理本地镜像

sh "docker logout"

}

}

}

post {

success {

echo "流水线执行成功!镜像:${REPO}:${TAG}"

}

failure {

echo "流水线执行失败"


  1. 测试流水线
  • 点击 “立即构建”,查看控制台输出,确认各阶段执行情况。
  • 构建成功后,登录镜像仓库,验证镜像是否已推送。

关键知识点

  • Docker-in-Docker vs 挂载 Socket:通过挂载宿主机 Docker socket,避免在容器内安装完整 Docker 环境,更轻量且共享宿主机镜像缓存。
  • 凭据管理:敏感信息(如密码、令牌)需通过 Jenkins 凭据存储,避免明文出现在配置中。
  • 流水线语法:声明式流水线使用pipeline块,通过stages定义阶段,post处理构建后操作(成功 / 失败回调)。
  • 扩展优化:添加定时构建、代码质量检查(SonarQube)、自动部署到测试环境等步骤,实现完整 DevOps 流程。