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)])
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类