从零搭建Docker+Gitlab+Jenkins全链路CI/CD实战指南

张开发
2026/4/20 3:22:13 15 分钟阅读

分享文章

从零搭建Docker+Gitlab+Jenkins全链路CI/CD实战指南
1. 环境准备搭建你的Linux基础环境第一次接触CI/CD流水线时我也被各种工具搞得晕头转向。后来发现环境准备这一步最关键就像盖房子要先打地基。我推荐使用CentOS 7.x系统稳定性经过多年验证社区支持也完善。安装系统后先做这几件事更新系统yum update -y避免后续安装包版本冲突关闭防火墙systemctl stop firewalld systemctl disable firewalld测试环境建议关闭生产环境需单独配置规则禁用SELinux编辑/etc/selinux/config文件将SELINUXenforcing改为disabled注意生产环境建议保留防火墙只需开放后续用到的端口如GitLab的7001-7003Jenkins的90012. 安装Docker容器化的第一步Docker是整个流水线的核心我习惯用官方源安装最新稳定版# 添加Docker官方源 yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装Docker引擎 yum install -y docker-ce docker-ce-cli containerd.io # 启动并设置开机自启 systemctl enable --now docker验证安装是否成功docker run hello-world看到Hello from Docker!说明安装正确。我遇到过permission denied错误这是因为docker命令需要sudo权限解决方法有两种每次加sudo更推荐将当前用户加入docker组sudo usermod -aG docker $USER然后重新登录3. 配置Java开发环境虽然我们用Docker部署应用但Jenkins构建时需要Java环境。我选择JDK 8 Maven组合# 创建安装目录 mkdir -p /usr/local/{jdk1.8,maven3} # 解压安装包需提前上传jdk-8uXXX-linux-x64.tar.gz和apache-maven-3.6.3-bin.tar.gz tar -zxvf jdk-8u121-linux-x64.tar.gz -C /usr/local/jdk1.8 --strip-components 1 tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /usr/local/maven3 --strip-components 1配置环境变量编辑/etc/profile在末尾追加# JDK export JAVA_HOME/usr/local/jdk1.8 export PATH$JAVA_HOME/bin:$PATH # Maven export MAVEN_HOME/usr/local/maven3 export PATH$MAVEN_HOME/bin:$PATH使配置生效source /etc/profile然后验证java -version mvn -v4. 部署GitLab代码托管中心GitLab是代码管理的核心用Docker部署最方便# 创建数据目录重要否则容器重启数据会丢失 mkdir -p /usr/local/gitlab/{config,logs,data} # 运行GitLab容器 docker run -d \ --hostname gitlab.example.com \ --name gitlab \ --restart always \ -p 7001:443 -p 7002:80 -p 7003:22 \ -v /usr/local/gitlab/config:/etc/gitlab \ -v /usr/local/gitlab/logs:/var/log/gitlab \ -v /usr/local/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest第一次启动可能需要几分钟初始化。访问http://服务器IP:7002你会看到密码重置页面。获取初始密码docker exec -it gitlab grep Password: /etc/gitlab/initial_root_password登录后建议修改root密码创建新项目如hellospringboot配置SSH密钥cat ~/.ssh/id_rsa.pub复制到GitLab的SSH Keys设置5. Jenkins部署自动化构建引擎Jenkins是CI/CD的大脑同样用Docker部署# 创建工作目录 mkdir -p /usr/local/jenkins/workspace # 运行Jenkins容器注意挂载了Docker套接字和Java/Maven环境 docker run -d \ --name jenkins \ -uroot \ -p 9001:8080 \ -v /usr/local/jenkins/workspace:/var/jenkins_home/workspace \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/local/jdk1.8:/usr/local/jdk1.8 \ -v /usr/local/maven3:/usr/local/maven3 \ jenkins/jenkins:lts首次访问http://服务器IP:9001需要解锁docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword安装推荐插件后还需要手动安装Git Parameter支持Git参数化构建Pipeline流水线必备Docker PipelineDocker集成6. 项目实战SpringBoot应用自动化部署假设我们有个简单的SpringBoot项目结构如下hellospringboot/ ├── src/ ├── pom.xml └── DockerfileDockerfile示例FROM openjdk:8-jdk-alpine COPY target/*.jar app.jar ENTRYPOINT [java,-jar,/app.jar]在Jenkins中创建流水线项目Pipeline脚本示例pipeline { agent any stages { stage(Checkout) { steps { git ssh://git服务器IP:7003/root/hellospringboot.git } } stage(Build) { steps { sh mvn clean package } } stage(Docker Build) { steps { sh docker build -t hellospringboot:${BUILD_NUMBER} . } } stage(Deploy) { steps { sh docker run -d -p 8080:8080 --name hellospringboot hellospringboot:${BUILD_NUMBER} } } } }触发构建后访问http://服务器IP:8080即可看到应用运行。这套流程我优化过多次主要踩过的坑Docker容器内无法执行docker命令 → 挂载/var/run/docker.sockMaven下载慢 → 配置阿里云镜像权限问题 → 使用-uroot运行容器7. 高级配置让流水线更智能基础流程跑通后可以添加更多实用功能1. 自动触发构建在Jenkins项目配置中勾选Build when a change is pushed to GitLab然后在GitLab项目的Settings → Webhooks添加URL: http://JenkinsIP:9001/project/项目名 Secret Token: 在Jenkins项目配置中生成2. 邮件通知安装Email Extension插件后在Pipeline中添加post { always { emailext body: 构建详情${BUILD_URL}, subject: 构建通知${JOB_NAME} - ${BUILD_STATUS}, to: teamexample.com } }3. 多环境部署使用Jenkins的Promote Build功能或定义不同的stagestage(Deploy to Test) { when { branch test } steps { sh docker run -d -p 8081:8080 --name test-app hellospringboot:${BUILD_NUMBER} } } stage(Deploy to Prod) { when { branch master } steps { sh docker run -d -p 8082:8080 --name prod-app hellospringboot:${BUILD_NUMBER} } }这套系统我在三个项目中实际应用过最大的收益是代码提交到部署从原来的1小时缩短到5分钟人为失误减少90%以上回滚操作变得极其简单只需选择历史版本重新部署

更多文章