Jenkins整合docker自动化部署

1、Jenkins系统配置

选择系统管理
在这里插入图片描述

选择系统配置

在这里插入图片描述

填写SSH remote hosts
在这里插入图片描述

注意,Credentials这里选择的,需要先在凭据那里添加全局凭据
在这里插入图片描述

填写新的全局凭据如下:
在这里插入图片描述

2、Jenkins上的工程部署配置

新建一个任务
在这里插入图片描述

任务类型配置为流水线
任务配置如下:
General这里的配置如图:
在这里插入图片描述

构建触发器这里选择第三项
在这里插入图片描述

注意,构建触发器这里选择的第三项后面的网址是需要在gitlab这边做配置,才能够从gitlab那边勾到代码自动部署。
同时,需要点击高级按钮,获取里面的Secret token。通过点击Generate按钮。如下图:
在这里插入图片描述

高级项目选项不用配置
流水线配置如下:
在这里插入图片描述

3、代码配置
需要在工程中配置一个Jenkinsfile-slwdev文件

示例如下:

node{
def mvnHome = tool ‘m3’
def dockerComposeHome = ‘/usr/local/bin’
env.PATH = “ e n v . P A T H : {env.PATH}: env.PATH:{mvnHome}/bin:${dockerComposeHome}”
def SPRING_PROFILES_ACTIVE = “slwdev”
def API_PORT=8098
def DPORT=18098

def remote=[:]
remote.name=‘[email protected]
remote.host = ‘10.10.201.96’
remote.user = ‘root’
remote.password = ‘Sutpcslw1’
remote.allowAnyHosts = true
stage(‘Prepare’){
echo “1.Prepare”
checkout scm
pom = readMavenPom file: ‘code/carroad-api/pom.xml’
docker_host = “nexus.sutpc.cc:9091”
img_name = “ p o m . g r o u p I d − {pom.groupId}- pom.groupId{pom.artifactId}- S P R I N G P R O F I L E S A C T I V E " d o c k e r i m g n a m e = " {SPRING_PROFILES_ACTIVE}" docker_img_name = " SPRINGPROFILESACTIVE"dockerimgname="{docker_host}/${img_name}”
echo “group: ${pom.groupId}, artifactId: ${pom.artifactId}, version: ${pom.version}”
echo “docker-img-name: KaTeX parse error: Expected '}', got '&' at position 161: …ME != 'master' &̲& env.BRANCH_NA…{env.BRANCH_NAME}-${build_tag}”
}
}
}

stage(“Verify”){
echo “2.Verify”
sh “cd ./code/carroad-api”
//sh “mvn clean install -Dmaven.test.skip=true -f ./code/carroad-api/pom.xml”
sh “mvn clean install -Dmaven.test.skip=true -Dcheckstyle.skip=true -f ./code/carroad-api/pom.xml”
}

stage(“Build”){
echo “3.Build”
echo “docker_img_name: d o c k e r i m g n a m e , b u i l d t a g : {docker_img_name},build_tag: dockerimgname,buildtag:{build_tag}”
sh “docker build -t d o c k e r i m g n a m e : {docker_img_name}: dockerimgname:{build_tag} -f ./code/carroad-api/Dockerfile ./code/carroad-api/”
}

stage(‘Push’) {
echo “4.Push”
echo ‘Pushing Docker Image…’
echo “docker tag d o c k e r i m g n a m e : {docker_img_name}: dockerimgname:{build_tag} ${docker_img_name}:latest”
echo “docker tag d o c k e r i m g n a m e : {docker_img_name}: dockerimgname:{build_tag} d o c k e r i m g n a m e : {docker_img_name}: dockerimgname:{pom.version}”
sh “docker tag d o c k e r i m g n a m e : {docker_img_name}: dockerimgname:{build_tag} ${docker_img_name}:latest”
sh “docker tag d o c k e r i m g n a m e : {docker_img_name}: dockerimgname:{build_tag} d o c k e r i m g n a m e : {docker_img_name}: dockerimgname:{pom.version}”
sh “docker login -u admin -p admin123 nexus.sutpc.cc:9091”
echo “docker push ${docker_img_name}:latest”
sh “docker push ${docker_img_name}:latest”
echo “docker push d o c k e r i m g n a m e : {docker_img_name}: dockerimgname:{pom.version}”
sh “docker push d o c k e r i m g n a m e : {docker_img_name}: dockerimgname:{pom.version}”
echo “docker push d o c k e r i m g n a m e : {docker_img_name}: dockerimgname:{build_tag}”
sh “docker push d o c k e r i m g n a m e : {docker_img_name}: dockerimgname:{build_tag}”
}
stage(‘Deploy’){
echo “5.Deploy”
echo “docker kill ${img_name}”
echo “docker rm ${img_name}”
echo “docker pull ${docker_img_name}:latest”
echo “docker run -d -p A P I P O R T : 8098 − e S P R I N G P R O F I L E S A C T I V E = {API_PORT}:8098 -e SPRING_PROFILES_ACTIVE= APIPORT:8098eSPRINGPROFILESACTIVE={SPRING_PROFILES_ACTIVE} --name ${img_name} ${docker_img_name}:latest”
sshCommand remote :remote,command:“docker kill ${img_name}”,failOnError:false
sshCommand remote :remote,command:“docker rm ${img_name}”,failOnError:false
sshCommand remote :remote,command:“docker login -u admin -p admin123 nexus.sutpc.cc:9091”,failOnError:false
sshCommand remote :remote,command:“docker pull ${docker_img_name}:latest”,failOnError:false
sshCommand remote:remote,command:“docker run -d -p A P I P O R T : 8098 − e S P R I N G P R O F I L E S A C T I V E = {API_PORT}:8098 -e SPRING_PROFILES_ACTIVE= APIPORT:8098eSPRINGPROFILESACTIVE={SPRING_PROFILES_ACTIVE} -e JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=${DPORT} --name ${img_name} ${docker_img_name}:latest”
}


其中SPRING_PROFILES_ACTIVE是你的分支配置名称

同时,你需要有一个Dockerfile文件

示例如下:

FROM openjdk:8-jdk-alpine
RUN echo “Asia/Shanghai” > /etc/timezone
ADD target/carroad-api-1.0-SNAPSHOT.jar /app/carroad-api.jar
#CMD [“java”, “-jar”,"-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", “/app/carroad-api.jar”, “–user.timezone=GMT+08”]
ENTRYPOINT [“sh”,"-c",“java J A V A O P T S − D j a v a . s e c u r i t y . e g d = f i l e : / d e v / . / u r a n d o m − D s p r i n g . p r o f i l e s . a c t i v e = {JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active= JAVAOPTSDjava.security.egd=file:/dev/./urandomDspring.profiles.active={SPRING_PROFILES_ACTIVE} -Xmx900m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -jar /app/carroad-api.jar”, “–user.timezone=GMT+08”]
EXPOSE 8098


注:
Jenkins在打包到docker镜像中时需要能够访问到docker仓库,所以需要在/etc/docker/文件夹下配置一个daemon.json文件。

daemon.json文件内容如下:
{
“registry-mirrors”: [“https://docker.mirrors.ustc.edu.cn”],
“insecure-registries”: [“nexus.sutpc.cc:9091”]
}

至此,整个流程结束。over。