CICD部署文档
Jenkins和harbor均采用docker镜像部署,ssh环境已默认打通,详细过程省略,本文主要记录不同版本的jenkins配置,详细请转https://blog.csdn.net/zkzsq/article/details/128059660;
复制文件到jenkins容器中:
1)docker ps
2)docker inspect -f '{{.ID}}' c46c54383e56 # 获取长id
3)docker cp 本地路径 容器长ID:容器路径
例:
docker cp /iids/docker-compose c46c54383e56f84115d5736f2cb8ff5f283138625a5ab41cc910668a95d3d7bb:/iids/docker-compose
从容器中复制文件到宿主机:
docker cp jenkins:/iids/docker-compose/ /iids/
准备jenkinsfile
放在git上,jenkins拉取下来执行
def iids_project_url="https://gitee.com/mrzhouk/iids.git"
def iids_algorithm_url="https://gitee.com/mrzhouk/iids-algorithm.git"
def gitee_auth="0d1b9c58-08d1-4061"
//构建版本名称
def version ="${version}"
//harbor私服地址
def harbor_url="172.18.99.999:8000"
//harbor的项目名称
def harbor_project_name="iids"
def habor_auth="1199675c-5981-4f47-b2e7"
def project_names = "${project_name}"
def workspace="/var/jenkins_home/workspace/iids-show"
def nacos_config="${nacos}"
node {
def mvnHome
stage('1.拉取iids代码') {
checkout([$class: 'GitSCM', branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false, extensions: [],
submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${gitee_auth}",
url: "${iids_project_url}"]]])
}
stage('2.构建代码') {
echo "编译common"
sh "mvn clean install -f ${workspace}/iids-flat-common/pom.xml -Dmaven.test.skip=true"
echo "编译common-model"
sh "mvn clean install -f ${workspace}/iids-flat-common-model/pom.xml -Dmaven.test.skip=true"
echo "编译common-api"
sh "mvn clean install -f ${workspace}/iids-flat-common-api/pom.xml -Dmaven.test.skip=true"
for(project_name_item in project_names.tokenize(',')){
echo "${project_name_item}"
if(project_name_item!='iids-flat-algorithm'){
sh "mvn clean package -f ${workspace}/${project_name_item}/pom.xml -Dmaven.test.skip=true"
}
}
}
stage('3.拉取iids_flat_algorithm代码') {
checkout([$class: 'GitSCM', branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false, extensions: [],
submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${gitee_auth}",
url: "${iids_algorithm_url}"]]])
}
//提前准备dockerfile
stage('4.复制jar包到dockerfile处') {
for(project_name_item in project_names.tokenize(',')){
if(project_name_item=='iids-flat-algorithm'){
echo "复制算法文件"
sh "cp -r ${workspace}/IIDS.Algorithm.WebAPI/bin/publish/ /iids/docker-compose/iids-flat-algorithm/publish/"
//提前准备appsettings.json文件存放在docker-compose目录下,该条命令用于更新代码后替换该文件
sh "cp -r /iids/docker-compose/appsettings.json /iids/docker-compose/iids-flat-algorithm/publish/"
}else{
sh "cp ${workspace}/${project_name_item}/target/${project_name_item}.jar /iids/docker-compose/${project_name_item}/"
}
}
}
stage('5.打包镜像') {
for(project_name_item in project_names.tokenize(',')){
echo "我进来了"
sh " docker build -t ${harbor_url}/${harbor_project_name}/${project_name_item}:${version} /iids/docker-compose/${project_name_item}/"
}
}
stage('6.镜像上传') {
withCredentials([usernamePassword(credentialsId: '03a33ce9-e69a-4560-9a25-828a61dc9523', passwordVariable: 'password', usernameVariable: 'username')]) {
// 登陆
sh "docker login -u ${username} -p ${password} ${harbor_url}"
//上传镜像
for(project_name_item in project_names.tokenize(',')){
echo "上传镜像"
echo "${project_name_item}"
sh "docker push ${harbor_url}/${harbor_project_name}/${project_name_item}:${version}"
echo "删除镜像"
sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${project_name_item}:${version}"
}
}
}
stage('7.远程发布') {
for(project_name_item in project_names.tokenize(',')){
echo "我进来拉取镜像了"
def docker_image = "${harbor_url}/${harbor_project_name}/${project_name_item}"
echo "$docker_image"
echo "$version"
echo "$project_name_item"
echo "$harbor_url"
sshPublisher(publishers: [sshPublisherDesc(configName: 'iids_show',
transfers: [sshTransfer(cleanRemote: false, excludes: '',
execCommand:"/iids/depoly.sh $docker_image $version $project_name_item $harbor_url", execTimeout: 240000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')],
usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
准备dockerfile
java应用
FROM openjdk:8u292-jre-slim
VOLUME /temp
ENV JVM_OPS="-Xms256m -Xmx256m -XX:PermSize=512M -XX:MaxPermSize=512m"
ENV JAVA_OPS=""
ENV ACTIVE=""
ADD iids-app-push.jar iids-app-push.jar
ENTRYPOINT ["java","-jar","-Dspring.cloud.nacos.discovery.server-addr=172.18.99.999:8848","-Dspring.cloud.nacos.discovery.namespace=52a24e95-3e1c-4b98-","-Dspring.cloud.nacos.config.server-addr=172.18.99.999:8848","-Dspring.cloud.nacos.config.namespace=52a24e95-3e1c-4b98-965e","-Dspring.profiles.active=show","-Dspring.cloud.inetutils.preferred-networks=12.16.240","-Dspring.cloud.nacos.config.group=DEFAULT_GROUP","/iids-app-push.jar"]
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#编译命令
# docker build -t iids-flat-adm:1.0.1 .
#删除容器
# docker rm -f iids-flat-adm
#删除虚悬镜像none
# docker rmi $(docker images -q -f dangling=true)
#启动命令
# docker run -d --network host --restart=always --name iids-flat-adm iids-flat-adm:1.0.1
#查看日志
# docker logs -f -t --tail=100 iids-flat-adm
C#应用
FROM mcr.microsoft.com/dotnet/aspnet:5.0
COPY . /publish
WORKDIR /publish
#EXPOSE 80
CMD ["dotnet", "./publish/IIDS.Algorithm.WebAPI.dll"]
#导出
# docker save iids-flat-algorithm:1.0.0 | gzip > iids-flat-algorithm-1.0.0.tar.gz
# docker save > iids-flat-algorithm.tar iids-flat-algorithm:1.0.0
#导入
# docker load --input iids-flat-algorithm.tar.gz
准备部署脚本
4.准备部署脚本
上传到应用服务器/iids/depoly.sh
#! /bin/sh
#接收外部参数
#镜像名称
docker_image=$1
#镜像版本号
version=$2
#容器名称
project_name_item=$3
#harbor地址
harbor_url=$4
echo "$docker_image"
echo "$image_version"
#查询容器是否存在,存在则删除
containerId=`docker ps -a | grep -w ${project_name_item} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
#停掉容器
docker stop $containerId
#删除容器
docker rm $containerId
echo "成功删除容器"
fi
#查询镜像是否存在,存在则删除
imageId=`docker images | grep -w ${docker_image} | awk '{print $3}'`
if [ "$imageId" != "" ] ; then
#删除镜像
docker rmi -f $imageId
echo "成功删除镜像"
fi
echo "登陆harbor"
sudo docker login -u admin -p admin $harbor_url
echo "拉取镜像"
docker pull $docker_image:$version
echo "启动容器"
docker run -d -v /iids/logs/:/logs/ --name $project_name_item $docker_image:$version
日志目录:/iids/logs/
jenkins配置
1)下载复选框插件
2)配置参数化构建:
版本号:
3)自定义参数构建