def depots = [ [ name: "${PROJECT_NAME}", origin: "${GIT_SSH_URL}", ] ] def getCheckoutJob(depot) { return { dir(path: "./modules/${depot.get('name')}") { checkout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: depot.get('origin'), credentialsId: env.CREDENTIALS_ID]]]) script { if (depot.get('name') == 'coding-artifacts') { sh 'git submodule sync' sh 'git submodule update --init --recursive' } } } } } def application_name = env.APPLICATION_NAME.split(",") def ports = env.PROTOCOL_PORTS.split(",") def jobs = [] application_name.eachWithIndex{ it,i -> jobs[i]=[application_name[i],ports[i]] } def parallelStagesMap = jobs.collectEntries { ["检测tsf应用${it[0]}" : generateStage(it)] } def generateStage(jdata) { echo '${project_pub_name}' return { stage("stage: ${project_pub_name}") { echo "${jdata[0]}" checkTsfApplication secretId: "${env.SECRET_ID}", secretKey: "${env.SECRET_KEY}", applicationName: "${project_pub_name}", applicationType: "${env.APPLICATION_TYPE}", endpoint: "${env.TSF_ENDPOINT}", microserviceType: "${env.MICROSERVICE_TYPE}" } } } def parallelStagesMap2 = jobs.collectEntries { ["部署tsf应用${it[0]}" : generateStage2(it)] } def generateStage2(jdata) { echo '${project_pub_name}' return { stage("stage: ${project_pub_name}") { echo "${jdata[0]}" deployTsf secretId: "${env.SECRET_ID}", secretKey: "${env.SECRET_KEY}", endpoint: "${env.TSF_ENDPOINT}", applicationName: "${project_pub_name}", clusterName: "${env.CLUSTER_NAME}", namespace: "${DEPLOY_ENV}", groupName: "${project_pub_name}-${DY_ENV}", pkgVersion: "${VERSION}-${DEPLOY_ENV}", protocolPorts: "[{Protocol:\"TCP\",Port:"+"${jdata[1]}"+",TargetPort:" +"${jdata[1]}"+"}]", accessType: "${env.ACCESS_TYPE}", updateType: "${env.UPDATE_TYPE}", businessLogNames: "${logpath}" } } } def deploy_env = "${DEPLOY_ENV}" def createDY_ENV() { return deploy_env.split("-")[1] } def createName() { return deploy_env.split("-")[0] } // TODO: 这里应该要根据实际的运行域决定,待整理规范 def getClusterName() { if (env.DEPLOY_ENV.contains("dev") ){ return "IPC-public-开发环境" } else if (env.DEPLOY_ENV.contains("test") ){ return "IPC-public-测试环境" } else { return "IPC-public-演示环境" } } pipeline { agent any stages { stage("检出项目代码仓库") { steps { checkout([$class: 'GitSCM', branches: [[name: env.SUB_BRANCH]], userRemoteConfigs: [[url: "${env.SUB_GIT_REPO_URL}/${project_name}.git", credentialsId: env.SUB_CREDENTIALS_ID]]]) script { sh """ echo "machine git.code.tencent.com" > ~/.netrc echo "login ${GIT_USERNAME}" >> ~/.netrc echo "password ${GIT_PASSWORD}" >> ~/.netrc """ sh 'cat ~/.netrc' sh 'git submodule sync' sh 'git submodule update --init --recursive' } } } stage('检出子仓库') { steps { script { checkoutJobs = [:] depots.findAll{ depot -> (depot.get('origin') != '') }.each { depot -> echo "submodule > ${depot}" checkoutJobs[depot.get('name')] = getCheckoutJob(depot) checkoutJobs['failFast'] = false } parallel checkoutJobs } } } stage('校验tsf环境') { steps{ script { parallel parallelStagesMap } } } stage('编译构建') { agent { docker { image 'ipcmaven.pdcts.com.cn:8082/npm:tsf' args '-u root --network=host -v /var/run/docker.sock:/var/run/docker.sock --add-host=raw.githubusercontent.com:199.232.28.133 -v /usr/bin/docker:/usr/bin/docker -v /etc/hosts:/etc/hosts' reuseNode true } } steps { script { withCredentials([usernamePassword(credentialsId: "${DOCKER_REGISTRY_CREDENTIALS_ID}", usernameVariable: 'REGISTRY_USER', passwordVariable: 'REGISTRY_PASS')]) { sh """ pwd ls -ls . ls -ls ./modules npm config ls mv ./modules/${DEPOT_NAME}/build . # 编译构建 bash -e build/build.sh ${TSF_REPO} ${project_pub_name} ${HARBOR_ACCOUNT_NAME} ${HARBOR_PASSWORD} ${image_version} ${BUILD_TYPE} ${NPM_BUILD_SCRIPT} """ } } } } stage('触发tsf部署') { when { environment name:'DEPLOY_ENABLE', value:'true' } steps { script { parallel parallelStagesMap2 } sh """ # 如果还要执行别的一些sh命令,可在此添加,比如企业微信的通知机器人 """ } } } environment { PROTOCOL = 'http' // 系统预留参数 APPLICATION_TYPE = 'C' // 项目类型,系统预留参数 MICROSERVICE_TYPE = 'N' // 系统预留参数 DY_ENV = createDY_ENV() // 环境 PName = createName() // 项目组名passid和里约网关passid一致 image_version = "${VERSION}-${DEPLOY_ENV}" // 镜像版本 project_name = "${APPLICATION_NAME}" // 项目工程名称 project_pub_name = "${PName}-${GIT_PROJECT_NAME ? GIT_PROJECT_NAME : project_name}" // TSF 项目名称 UPDATE_TYPE = "1" // 更新类型,运维预留参数,暂时未启用 ACCESS_TYPE = "2" // 制品类型,运维预留参数,暂时未启用 BUILD_TYPE = "${BUILD_TYPE}" // 编译类型 CLUSTER_NAME = getClusterName() // 部署组名称 logpath = "${PName}-web-logs" // 日志名称 } }