需求背景
搭建一套容器化的 CI/CD 系统,实现代码提交后自动触发构建、测试、打包 Docker 镜像并推送至镜像仓库的全流程自动化,提高开发效率,减少人工操作错误。
实现步骤
- 环境准备
- 安装 Docker 和 Docker Compose,确保用户有权限操作 Docker。
- 准备镜像仓库(如 Docker Hub、阿里云容器仓库),并创建访问账号。
- 规划目录结构:
- Docker Compose 配置
部署 Jenkins 容器,并挂载 Docker socket 以实现容器内操作 Docker:
- 初始化 Jenkins
- 启动服务:docker-compose up -d
- 查看初始密码:docker logs jenkins_jenkins_1 | grep "Administrator password"
- 访问http://localhost:8080,输入密码完成安装,推荐安装 “推荐插件”。
- 安装必要插件
- 进入 “系统管理”→“插件管理”,安装以下插件:
- Docker Pipeline:支持在流水线中操作 Docker。
- Git:从 Git 仓库拉取代码。
- Pipeline:创建声明式流水线。
- Credentials Binding:管理敏感信息(如仓库账号)。
- 配置镜像仓库凭据
- 进入 “系统管理”→“凭据”→“系统”→“全局凭据”,添加 “Username with password” 类型凭据:
- Username:镜像仓库账号(如 Docker Hub 用户名)。
- Password:仓库密码或访问令牌。
- ID:设置标识(如docker-hub-creds),后续在流水线中引用。
- 创建 CI/CD 流水线
- 新建任务,选择 “流水线”,命名为demo-pipeline。
- 在 “流水线” 配置中选择 “Definition” 为 “Pipeline script from SCM”,SCM 选择 “Git”,填写代码仓库 URL(如https://github.com/your/repo.git)。
- 在代码仓库根目录创建Jenkinsfile,定义流水线流程:
}
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 "流水线执行失败"
- 测试流水线
- 点击 “立即构建”,查看控制台输出,确认各阶段执行情况。
- 构建成功后,登录镜像仓库,验证镜像是否已推送。
关键知识点
- Docker-in-Docker vs 挂载 Socket:通过挂载宿主机 Docker socket,避免在容器内安装完整 Docker 环境,更轻量且共享宿主机镜像缓存。
- 凭据管理:敏感信息(如密码、令牌)需通过 Jenkins 凭据存储,避免明文出现在配置中。
- 流水线语法:声明式流水线使用pipeline块,通过stages定义阶段,post处理构建后操作(成功 / 失败回调)。
- 扩展优化:添加定时构建、代码质量检查(SonarQube)、自动部署到测试环境等步骤,实现完整 DevOps 流程。