使用Git代码仓库管理,jenkins 进行自动化构建、部署(dev)、docker容器化技术实现项目运行,实现项目的持续CI/CD
第一部分 环境搭建
环境准备
- 三台物理机器:
GitLab远程仓库服务器server1
Jenkins服务器 server2
Server服务器 server3
CI/CD流程

项目开发流程使用dev-test-release-master模式管理,dev/test使用jenkins自动化构建部署应用,QA和生产使用jenkins流水线方式构建和推送镜像,使用AWS EC2部署应用。
Gitlab仓库搭建
- 修改配置并刷新缓存
#step1 配置yum源
vim /etc/yum.repos.d/gitlab-ce.repo
#step2 复制以下内容:
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1
#step3 更新本地yum缓存
sudo yum makecache
- 安装gitlab社区版
sudo yum install gitlab-ce #自动安装最新版
#其他的服务操作命令
启动:gitlab-ctl start
关闭:gitlab-ctl stop
重启:gitlab-ctl restart
重载配置:gitlab-ctl reconfigure
查看状态:gitlab-ctl status
- 加载配置文件
gitlab-ctl reconfigure
- 启动gitlab
gitlab-ctl start
- 登录访问,首次访问需要修改新密码,默认用户root
- 安装git
#安装git构建本地仓库
yum -y install git
#创建仓库目录
mkdir mygit.git
#进入仓库并初始化
cd mygit.git
git --bare init
Jenkins服务器搭建
需要安装的软件:git、jdk、maven、tomcat、jenkins.war
- 安装git客户端
yum -y install git
- 生成秘钥给glab服务器
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa root@xxx.xx.xx.xxx
- 安装jdk
#下载安装jdk
yum install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64
#检查安装结果
java -version
ls /usr/lib/jvm/
#修改环境配置
vi /etc/profile
#将下面三项加入配置
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.el7_7.x86_64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
export PATH=$PATH:${JAVA_PATH}
#使配置生效
source /etc/profile
- 安装maven
#step1 下载
wget https://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
#step2 解压
tar zxf apache-maven-3.6.3-bin.tar.gz
mv apache-maven-3.6.3 /usr/local/maven3.6.3
#step3 修改环境变量, 在/etc/profile中添加以下几行
export MAVEN_HOME=/usr/local/maven3.6.3
export PATH=$MAVEN_HOME/bin:$PATH
#生效配置
source /etc/profile
- 安装tomcat
#下载安装包
wget -P https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.56/bin/apache-tomcat-8.5.56.tar.gz
#解压
tar zxf apache-tomcat-8.5.56.tar.gz
#安装
mv apache-tomcat-8.5.56 /usr/local/tomcat8
#启动
/usr/local/tomcat8/bin/startup.sh
- 安装Jenkins
#下载war包
wget http://updates.jenkins-ci.org/download/war/2.201/jenkins.war
#把war移动到安装tomcat的webapps目录下
mv jenkins.war /usr/local/tomcat8/webapps/
#到安装tomcat的webapps目录下用工具安装
cd /usr/local/tomcat8/webapps/
java -jar jenkins.war --httpPort=8090
至此,Jenkins服务器搭建完毕
Server服务器搭建
Server服务器是Docker镜像部署机器,开发和测试环境使用Docker Maven Plugin插件自动打包构建镜像并推送到Server服务器,构建完成后远程shell执行sh脚本部署docker镜像。
需要安装:
docker-ce
docker-registry:2.0
- 安装docker
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce-18.09.6
#启动/重启/停止docker
systemctl start docker/systemctl stopdocker/systemctl stop docker
#查询镜像
docker images
- 安装docker registery
# 安装registery2.0
docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
# 如果遇到镜像下载不下来的情况,需要修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值,然后重启docker服务:
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
# Docker开启远程API
vi /usr/lib/systemd/system/docker.service
#修改前
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
#修改后
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
#让Docker支持http上传镜像
echo '{ "insecure-registries":["registry服务器地址:5000"] }' > /etc/docker/daemon.json
#执行命令使配置生效
systemctl daemon-reload
#重启docker
systemctl stop docker
systemctl start docker
#修改防火墙配置是registry支持远程上传镜像
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --reload
jenkins环境配置
- 升级站点源
http://updates.jenkins.io/update-center.json
或
http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
- jenkins插件管理
系统管理—》插件管理—》可下载镜像
#需要下载的插件
Localization: Chinese (Simplified)
Maven Integration plugin
Publish Over SSH
Git client
Git Parameter
SSH plugin
Pipeline
-
远程server服务器配置
全局凭据
-
全局凭证管理
凭证管理—》系统—》全局凭据—》添加凭据
image.png
至此git+jenkins+docker环境搭建完成。
第二部分 应用构建部署
jenkins自动化构建部署(dev、test)
使用Maven构建Docker镜像
- 应用pom文件添加maven-docker-plugin配置
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>mall-tiny/${project.artifactId}:${project.version}</imageName>
<dockerHost>http://registry服务器地址:2375</dockerHost>
<baseImage>java:8</baseImage>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]
</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
配置说明:
executions.execution.phase:此处配置了在maven打包应用时构建docker镜像;
imageName:用于指定镜像名称,mall-tiny是仓库名称,{project.version}为仓库名称;
dockerHost:打包后上传到的docker服务器地址;
baseImage:该应用所依赖的基础镜像,此处为java;
entryPoint:docker容器启动时执行的命令;
resources.resource.targetPath:将打包后的资源文件复制到该目录;
resources.resource.directory:需要复制的文件所在目录,maven打包的应用jar包保存在target目录下面;
resources.resource.include:需要复制的文件,打包好的应用jar包。
-
Jenkins创建项目
Jenkins—》添加Items
根据自己所有选择合适项目类型,这里我们选择Freestyle project,以便我们自定义构建流程。也可以从其他项目copy配置。
创建项目
-
配置代码源
代码源配置
说明:
Repository URL:远程代码仓库地址
Credentials:凭据,可选择已添加的全局凭据,或者在此页面自定义全局凭据
指定分支(为空时代表any):指定项目构建分支
构建触发器:可自定义构建触发,如钩子函数、定时任务等
-
构建流程配置
构建步骤1 执行shell脚本,修改应用配置
shell步骤
构建步骤2 使用maven打包构建镜像并推送到server
maven构建
构建步骤3 远程执行shell,部署镜像
远程shell部署
-
执行构建任务
构建
至此dev/test自动化构建部署镜像完成。
jenkins自动化构建(QA、生产)
使用Maven构建Docker镜像
QA、生产环境Jenkins项目配置基本类似,只是构建流程不一样,QA和生产环境使用pipeline流水线进行镜像构建
pipeline {
agent any
environment {
REPOSITORY="http://58.251.217.68:8010/developteam/backend/spring-cloud/saas-platform.git"
projectdir="business/user-center"
projectname="buyer-user-platform"
}
stages {
stage('获取代码') {
steps {
echo "start fetch code from git:${REPOSITORY}"
deleteDir()
git credentialsId: '0ab25a75-dcfc-4212-aac0-36a0cfd47bf5', url: 'http://58.251.217.68:8010/developteam/backend/spring-cloud/saas-platform.git'
}
}
stage('打包-common') {
steps {
echo "start package common"
withMaven(maven: 'maven3.6.3') {
sh " mvn -f commons/pom.xml clean install -Dmaven.test.skip=true -amd "
}
}
}
stage('替换') {
steps {
echo "start replace"
sh " cd ${WORKSPACE}/${projectdir}/${projectname} "
sh " rm -f target/${projectname}.jar "
sh "mv ${WORKSPACE}/${projectdir}/${projectname}/src/main/resources/bootstrap.yml.example ${WORKSPACE}/${projectdir}/${projectname}/src/main/resources/bootstrap.yml "
sh "mv ${WORKSPACE}/${projectdir}/${projectname}/src/main/resources/bootstrap-test.yml.example ${WORKSPACE}/${projectdir}/${projectname}/src/main/resources/bootstrap-test.yml "
sh "mv ${WORKSPACE}/${projectdir}/${projectname}/src/main/resources/bootstrap-prod.yml.example ${WORKSPACE}/${projectdir}/${projectname}/src/main/resources/bootstrap-prod.yml "
sh "sed -i '/<dockerHost>/d' ${WORKSPACE}/${projectdir}/${projectname}/pom.xml"
}
}
stage('打包') {
steps {
echo "start build"
withMaven(maven: 'maven3.6.3') {
sh " mvn -f ${projectdir}/${projectname}/pom.xml clean package -DskipDockerTag -DskipDockerPush "
}
}
}
stage('push image to aws ecr') {
steps {
echo "start push"
script {
docker.withRegistry('https://941124188381.dkr.ecr.cn-north-1.amazonaws.com.cn', 'ecr:cn-north-1:aws_ecr') {
docker.image('${projectname}').push('${BUILD_NUMBER}')
}
}
}
}
stage('push image to aws ecr us-west-2') {
steps {
echo "start push"
script {
docker.withRegistry('https://690337281734.dkr.ecr.us-west-2.amazonaws.com', 'ecr:us-west-2:aws_us_west_2_ecr') {
docker.image('${projectname}').push('${BUILD_NUMBER}')
}
}
}
}
stage('clean local images') {
steps {
echo "start clean"
sh "docker rmi ${projectname}:latest "
}
}
}}
Amazon ECS(Elastic Container Service) 集群管理
ECS参考
Jenkins构建镜像后推送到AWS ECR(aws 镜像存储库)使用ECS(需要使用EC2 运行实例)进行集群创建维护和镜像实例分组、运行、管理等。

网友评论