美文网首页
git + jekins + docker持续集成

git + jekins + docker持续集成

作者: 蜀山_竹君子 | 来源:发表于2020-08-23 17:20 被阅读0次

使用Git代码仓库管理,jenkins 进行自动化构建、部署(dev)、docker容器化技术实现项目运行,实现项目的持续CI/CD

第一部分 环境搭建

环境准备

  1. 三台物理机器:
GitLab远程仓库服务器server1
Jenkins服务器 server2
Server服务器 server3

CI/CD流程

cicd.png

项目开发流程使用dev-test-release-master模式管理,dev/test使用jenkins自动化构建部署应用,QA和生产使用jenkins流水线方式构建和推送镜像,使用AWS EC2部署应用。

Gitlab仓库搭建

  1. 修改配置并刷新缓存
#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
  1. 安装gitlab社区版
sudo yum install gitlab-ce #自动安装最新版
#其他的服务操作命令
启动:gitlab-ctl start
关闭:gitlab-ctl stop
重启:gitlab-ctl restart
重载配置:gitlab-ctl reconfigure
查看状态:gitlab-ctl status
  1. 加载配置文件
gitlab-ctl reconfigure
  1. 启动gitlab
gitlab-ctl start
  1. 登录访问,首次访问需要修改新密码,默认用户root
  2. 安装git
#安装git构建本地仓库
yum -y install git
#创建仓库目录
mkdir mygit.git
#进入仓库并初始化
cd mygit.git
git --bare init

Jenkins服务器搭建

需要安装的软件:git、jdk、maven、tomcat、jenkins.war

  1. 安装git客户端
yum -y install git
  1. 生成秘钥给glab服务器
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa root@xxx.xx.xx.xxx
  1. 安装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
  1. 安装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
  1. 安装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
  1. 安装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
  1. 安装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
  1. 安装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环境配置

  1. 升级站点源
http://updates.jenkins.io/update-center.json
或
http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
  1. jenkins插件管理
    系统管理—》插件管理—》可下载镜像
#需要下载的插件
Localization: Chinese (Simplified)
Maven Integration plugin
Publish Over SSH
Git client
Git Parameter
SSH plugin
Pipeline
  1. 远程server服务器配置


    全局凭据
  2. 全局凭证管理
    凭证管理—》系统—》全局凭据—》添加凭据


    image.png

    至此git+jenkins+docker环境搭建完成。

第二部分 应用构建部署

jenkins自动化构建部署(dev、test)

使用Maven构建Docker镜像

  1. 应用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.artifactId}为镜像名称,{project.version}为仓库名称;
dockerHost:打包后上传到的docker服务器地址;
baseImage:该应用所依赖的基础镜像,此处为java;
entryPoint:docker容器启动时执行的命令;
resources.resource.targetPath:将打包后的资源文件复制到该目录;
resources.resource.directory:需要复制的文件所在目录,maven打包的应用jar包保存在target目录下面;
resources.resource.include:需要复制的文件,打包好的应用jar包。

  1. Jenkins创建项目
    Jenkins—》添加Items
    根据自己所有选择合适项目类型,这里我们选择Freestyle project,以便我们自定义构建流程。也可以从其他项目copy配置。


    创建项目
  2. 配置代码源


    代码源配置

    说明:

Repository URL:远程代码仓库地址
Credentials:凭据,可选择已添加的全局凭据,或者在此页面自定义全局凭据
指定分支(为空时代表any):指定项目构建分支
构建触发器:可自定义构建触发,如钩子函数、定时任务等

  1. 构建流程配置
    构建步骤1 执行shell脚本,修改应用配置


    shell步骤

    构建步骤2 使用maven打包构建镜像并推送到server


    maven构建
    构建步骤3 远程执行shell,部署镜像
    远程shell部署
  2. 执行构建任务


    构建

    至此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 运行实例)进行集群创建维护和镜像实例分组、运行、管理等。

aws镜像管理

相关文章

网友评论

      本文标题:git + jekins + docker持续集成

      本文链接:https://www.haomeiwen.com/subject/svoijktx.html