1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| pipeline { parameters { // 配置多选 extendedChoice name: 'APP_NAME', type: 'PT_CHECKBOX', description: '请勾选所要发布的项目模块', quoteValue: false, saveJSONParameterToFile: false, value: 'schedule,web-township-background', visibleItemCount: 2, multiSelectDelimiter: ',', defaultValue: 'account-server' } options { buildDiscarder(logRotator(numToKeepStr: '10', artifactNumToKeepStr: '5')) } environment { PROJECT = '项目名' BRANCH_NAME = '环境名(分支名)' HARBOR_NAMESPACE = 'docker仓库凭据名称' GIT_ID = 'git凭据名称' GIT_URL = "https://git.xxx.com/${APP_NAME}.git(git的url)" REGISTRY = '镜像仓库地址' DOCKER_COMPOSE_ID = 'global-docker-compose-file' DOCKER_DOCKERFILE_ID = 'global-dockerfile-file' SW_OAP = 'skywalking OPA地址' ROBOT_ID = '机器人id' } agent any tools { maven 'maven' jdk 'jdk8' } ...... 这部分跟其他的一样,省略 ...... stages { stage('镜像制作') { steps { script { // for 上面的多选变量,','分割 for (appName in APP_NAME.tokenize(',')) { // 按应用名称区分目录,进入到对应的应用目录 dir("${appName}") { // 进行打包 buildDockerImage(appName) } } } } } stage('更新版本') { steps { script { // 生成字典,分别是应用名,部署节点,应用端口 def App = [ 'app1': ['host': 'host-231', 'port': '8080'], 'app2': ['host': 'host-241', 'port': '8081'], ] for (appName in APP_NAME.tokenize(',')) { // 根据应用名称与暴露端口生成对应的docker-ompose.yaml dockerCompose(appName, App[appName]['port']) // 发送生成的docker-ompose.yaml文件到对应的节点,然后启动 sshDeploy(appName, App[appName]['host']) } } } } } } // 为了省事,方便理解直接写到下面 // 制作镜像函数 def buildDockerImage(String appName, String port = '') { // 设置 Docker 镜像名称 def dockerImageName = "${REGISTRY}/${appName}:1.${BUILD_NUMBER}" if ("${REGISTRY}" == '') { dockerImageName = "${REGISTRY}/${appName}:1.${BUILD_NUMBER}" } // 读取 docker-compose 部署文件 configFileProvider([configFile(fileId: "${DOCKER_COMPOSE_ID}", targetLocation: "docker-compose")]){ // 替换docker-compose文件中的变量 def dockercompose = readFile encoding: "UTF-8", file: "docker-compose" def dockercomposefile = dockercompose.replaceAll("#APP_NAME","${appName}") .replaceAll("#APP_IMAGE_NAME","${dockerImageName}") .replaceAll("#APP_PORT","${port}") // 生成新的 docker-compose 部署文件 writeFile encoding: 'UTF-8', file: 'docker-compose.yml', text: "${dockercomposefile}" } } // ssh远程更新函数 def sshDeploy(String appName,String hostName) { sshPublisher(publishers: [sshPublisherDesc(configName: "${hostName}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: """ docker-compose -f /data/app/${appName}/docker-compose.yml up -d """, execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "${appName}/", remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'docker-compose.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) }
|