devops-jenkins-pipeline-参数化构建

实现效果:通过参数化从gitlab拉取代码,maven构建jar包,jenkins构建镜像推送至harbor仓库,远程服务器拉取镜像启动容器。

1、配置jenkins内部使用docker

确保docker.sock文件所属用户和组为root,其他用户也有rw权限

 修改jenkins配置文件中数据挂载,将docker映射至jenkins内部

 重启jenkins,进入容内部验证docker可用

docker-compose down

docker-compose up -d

2、源码增加Dockerfile内容推送至gitlab

 

 

3、创建jenkins流程

 3.1 创建流水线项目

 脚本语法如下入所示

agent any : jenkins有可能是集群多节点,any是让进群下任一节点执行该任务,也可以写节点名指定固定节点执行任务。

stage : 代表流水线的单个任务,写在stages中。

 3.2 配置参数化

 

 3.3 从gitlab拉取代码

 

 获取到脚本:checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'e5d79e06-7420-467b-be50-d849dd9caf29', url: 'http://10.80.39.86:8929/devops/pak.git']])

其中name: '*/master',代表拉取最新代码,替换成参数变量${tag}后写入pipeline脚本。

 3.3.2 构建测试

 

 

 3.4 maven构建jar包

 Shell Script指令为/var/jenkins_home/maven/bin/mvn clean package -DskipTests,将生成后脚本写入pipeline中

 

 

 3.5通过docker制作镜像

 

 

 

 3.6 推送镜像至Harbor

在此harbor采用变量表示

 

 然后将harbor替换在pipeline中

 

 

 

 3.7 通知目标服务器部署项目

目标服务器创建部署服务脚本

复制代码
#[root@localhost test]# cat /opt/test/deploy.sh 
harbor_addr
=$1 harbor_repo=$2 project=$3 version=$4 container_port=$5 host_port=$6 imageName=$harbor_addr/$harbor_repo/$project:$versionecho $imageName containerId=`docker ps -a | grep ${project} | awk '{print $1}'` echo $containerId if [ "$containerId" != "" ] ; then docker stop $containerId docker rm $containerId fi tag=`docker images | grep ${project} | awk '(print $2)'` echo $tag if [[ "$tag" =~ "$version" ]] ; then docker rmi $imageName fi docker login -u admin -p Harbor12345 $harbor_addr docker pull $imageName docker run -d -p $host_port:$container_port --name $project $imageName echo "SUCCESS"
复制代码

参数化构建字符参数--表示容器端口和映射主机端口

 使用sshPublisher生成脚本

 这里有个大坑,${harborAddress}和${harborRepo}是pipeline中定义的全局变量,sshPublisher组件这种写法获取不到该变量值,要将execCommand:'''指令内容'''的三引号改为双引号,同时多指令放在同一行用&&连接,如下所示

修改前
sshPublisher(publishers: [sshPublisherDesc(configName: '10.80.39.87', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /opt/test/
docker login ${harborAddress} -u ${harborUser} -p ${harborPasswd}
./deploy.sh ${harborAddress}  ${harborRepo} ${JOB_NAME} ${tag} ${container_port} ${host_port}''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
修改后,见红字
sshPublisher(publishers: [sshPublisherDesc(configName: '10.80.39.87', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "cd /opt/test/ && docker login ${harborAddress} -u ${harborUser} -p ${harborPasswd} && ./deploy.sh ${harborAddress}  ${harborRepo} ${JOB_NAME} ${tag} ${container_port} ${host_port}", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

 

 

posted @   阿锋888  阅读(366)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示