整个流程就是,使用Jenkins拉取Harbor中的镜像,然后ssh去删除当前存在的容器,然后根据指定的镜像版本去创建新的容器。
流水线解释
这里选取镜像使用的“Image Tag Parameter”这个插件和harbor进行集成。Image Tag Parameter(镜像标签参数)是Jenkins中一个非常实用的插件功能,它允许用户在构建过程中动态地选择和指定Docker镜像的标签。
选取DeployEnv后,DeployHost会进行自动联动,这里使用的“Active Choices Reactive Parameter”这个插件。Active Choices Reactive Parameter插件通过Groovy脚本或Scriptler目录中的脚本,能够动态地根据用户的输入或其他参数的选择来更新参数的值选项列表。这种动态交互性使得Jenkins的构建过程更加灵活和可定制。
流水线pipeline
pipeline{
agent any
stages{
stage("info"){
steps{
script{
env.harbor = "harbor.devops.linux66.cn:9001"
}
echo "harbor地址:${harbor}"
sh 'echo "容器服务名字:${containerName}"'
sh 'echo "容器环境变量:${DeployEnv}"'
sh 'echo "镜像tag:${DOCKER_IMAGE}"'
sh 'echo "部署主机:${DeployHost}"'
sh """
ssh root@$DeployHost /root/deploy-backend.sh $containerName ${env.harbor} $DOCKER_IMAGE $DeployEnv $hostPort
"""
}
}
}
}
远程主机上脚本文件 /root/deploy-backend.sh
[root@prod ~]# cat /root/deploy-backend.sh
#!/bin/bash
containerName=$1
harbor=$2
docker_image=$3
DeployEnv=$4
hostPort=$5
image=`echo "${docker_image}"|awk -F":" '{print $1}'`
version=`echo "${docker_image}"|awk -F":" '{print $2}'`
if [ $# -ne 5 ]; then
echo "The shell script must pass 5 parameters"
exit 0
fi
echo "------拉取新版镜像--------------"
docker pull ${harbor}/${docker_image}
if [ `echo $?` -eq 0 ]; then
echo "------停止当前容器并删除------------"
run=$(docker ps -a| grep -w $containerName | awk '{print $1}')
docker stop $run
docker rm $run
echo "------启动新版镜像---------------"
image_new=$(docker images | grep $image | grep $version | awk '{print $3}')
docker run -d -e ASPNETCORE_ENVIRONMENT=${DeployEnv} -p ${hostPort}:80 --restart=always --name $containerName $image_new
fi
echo "--------------------- dotnet容器服务状态 -------------------"
docker ps | grep dotnet
注意事项:
1、不要忘记给远程主机上的脚本添加执行权限chmod +x /root/deploy-backend.sh;
2、不要忘记jenkins与远程主机采用SSH密钥对进行连接;
3、远程主机上需要通过docker login登录私有镜像仓库,否则远程主机无权拉取镜像。