Files
Genarrative/jenkins/Jenkinsfile.deploy

103 lines
3.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
pipeline {
agent none
options {
disableConcurrentBuilds()
timestamps()
}
parameters {
string(name: 'SOURCE_NODE_NAME', defaultValue: '', description: '上游构建节点名')
string(name: 'SOURCE_WORKSPACE_ROOT', defaultValue: '', description: '上游源码根目录')
string(name: 'BUILD_VERSION', defaultValue: '', description: '待部署版本号')
string(name: 'DEPLOY_DIRECTORY', defaultValue: '/var/lib/jenkins/deploy/Genarrative', description: '固定部署目录')
string(name: 'EXPECTED_UPSTREAM_JOB', defaultValue: '', description: '允许触发本作业的上游作业名')
}
stages {
stage('校验触发来源') {
agent {
label 'built-in'
}
steps {
script {
// Pipeline 的 build 步骤通常会把下游触发原因记录成 BuildUpstreamCause
// 直接只查经典 UpstreamCause 会把真实的上游触发误判成“人工执行”。
def pipelineUpstreamCauses = currentBuild.getBuildCauses('org.jenkinsci.plugins.workflow.support.steps.build.BuildUpstreamCause')
def classicUpstreamCauses = currentBuild.getBuildCauses('hudson.model.Cause$UpstreamCause')
def upstreamCause = null
if (pipelineUpstreamCauses && !pipelineUpstreamCauses.isEmpty()) {
upstreamCause = pipelineUpstreamCauses[0]
} else if (classicUpstreamCauses && !classicUpstreamCauses.isEmpty()) {
upstreamCause = classicUpstreamCauses[0]
}
if (!upstreamCause) {
error('部署流水线禁止人工直接执行,只允许由上游构建并部署流水线触发。')
}
def actualUpstreamJob = upstreamCause?.upstreamProject ?: ''
def expectedUpstreamJob = params.EXPECTED_UPSTREAM_JOB?.trim()
def allowedUpstreamJob = env.GENARRATIVE_ALLOWED_UPSTREAM_JOB?.trim()
if (!params.BUILD_VERSION?.trim()) {
error('BUILD_VERSION 不能为空。')
}
if (!params.SOURCE_WORKSPACE_ROOT?.trim()) {
error('SOURCE_WORKSPACE_ROOT 不能为空。')
}
if (!params.SOURCE_NODE_NAME?.trim()) {
error('SOURCE_NODE_NAME 不能为空。')
}
if (!actualUpstreamJob?.trim()) {
error('无法从上游触发原因中解析作业名,请检查 Jenkins Pipeline Build Step 插件版本与触发链。')
}
if (expectedUpstreamJob && actualUpstreamJob != expectedUpstreamJob) {
error("上游作业校验失败,期望 ${expectedUpstreamJob},实际 ${actualUpstreamJob}")
}
if (allowedUpstreamJob && actualUpstreamJob != allowedUpstreamJob) {
error("环境门禁校验失败,仅允许 ${allowedUpstreamJob} 触发,实际 ${actualUpstreamJob}")
}
env.UPSTREAM_JOB_NAME = actualUpstreamJob
}
}
}
stage('部署指定版本') {
agent {
label "${params.SOURCE_NODE_NAME}"
}
steps {
dir("${params.SOURCE_WORKSPACE_ROOT}") {
sh """
bash -lc '
set -euo pipefail
test -d "build/${params.BUILD_VERSION}"
chmod +x scripts/jenkins-deploy-release.sh
# 只部署上游已构建好的版本目录,避免部署阶段再次构建产生漂移。
./scripts/jenkins-deploy-release.sh \
--source-dir "build/${params.BUILD_VERSION}" \
--deploy-dir "${params.DEPLOY_DIRECTORY}"
'
"""
}
}
}
}
post {
success {
echo "部署完成,版本号: ${params.BUILD_VERSION},上游作业: ${env.UPSTREAM_JOB_NAME}"
}
}
}