105 lines
4.1 KiB
Plaintext
105 lines
4.1 KiB
Plaintext
pipeline {
|
||
agent {
|
||
label 'linux && genarrative-build'
|
||
}
|
||
|
||
options {
|
||
disableConcurrentBuilds()
|
||
buildDiscarder(logRotator(numToKeepStr: '20', artifactNumToKeepStr: '20'))
|
||
}
|
||
|
||
environment {
|
||
GIT_REMOTE_URL = 'http://127.0.0.1:3000/GenarrativeAI/Genarrative.git'
|
||
CARGO_HOME = '/var/cache/genarrative-build/cargo-home'
|
||
CARGO_TARGET_DIR = '/var/cache/genarrative-build/cargo-target/prod-release'
|
||
CARGO_INCREMENTAL = '0'
|
||
RUSTC_WRAPPER = 'sccache'
|
||
SCCACHE_DIR = '/var/cache/genarrative-build/sccache'
|
||
SCCACHE_CACHE_SIZE = '30G'
|
||
}
|
||
|
||
parameters {
|
||
string(name: 'SOURCE_BRANCH', defaultValue: 'master', description: '源码分支,默认 master 最新提交')
|
||
string(name: 'COMMIT_HASH', defaultValue: '', description: '可选,指定属于 SOURCE_BRANCH 的 Git commit')
|
||
string(name: 'BUILD_VERSION', defaultValue: '', description: '发布版本号,留空则使用 Jenkins BUILD_NUMBER')
|
||
booleanParam(name: 'PUBLISH_AFTER_BUILD', defaultValue: false, description: '构建成功后是否触发 API 发布')
|
||
string(name: 'DEPLOY_JOB_NAME', defaultValue: 'Genarrative-Api-Deploy', description: 'API 发布流水线作业名')
|
||
choice(name: 'DEPLOY_TARGET', choices: ['development', 'release'], description: 'PUBLISH_AFTER_BUILD=true 时的逻辑部署目标;development 使用当前 Linux 开发/构建/开发部署 agent')
|
||
booleanParam(name: 'CONFIRM_RELEASE_DEPLOY_AGENT', defaultValue: false, description: 'PUBLISH_AFTER_BUILD=true 且目标为 release 时必须确认已有独立 release 部署 agent')
|
||
}
|
||
|
||
stages {
|
||
stage('Checkout') {
|
||
steps {
|
||
checkout([
|
||
$class: 'GitSCM',
|
||
branches: [[name: "*/${params.SOURCE_BRANCH}"]],
|
||
doGenerateSubmoduleConfigurations: false,
|
||
extensions: [[$class: 'CleanBeforeCheckout']],
|
||
userRemoteConfigs: [[url: "${GIT_REMOTE_URL}"]],
|
||
])
|
||
sh '''
|
||
bash -lc '
|
||
set -euo pipefail
|
||
chmod +x scripts/jenkins-checkout-source.sh
|
||
SOURCE_BRANCH="${SOURCE_BRANCH}" \
|
||
COMMIT_HASH="${COMMIT_HASH}" \
|
||
GIT_REMOTE_URL="${GIT_REMOTE_URL}" \
|
||
SOURCE_COMMIT_FILE=".jenkins-source-commit" \
|
||
scripts/jenkins-checkout-source.sh
|
||
'
|
||
'''
|
||
script {
|
||
env.SOURCE_COMMIT = readFile('.jenkins-source-commit').trim()
|
||
env.EFFECTIVE_BUILD_VERSION = params.BUILD_VERSION?.trim() ? params.BUILD_VERSION.trim() : env.BUILD_NUMBER
|
||
}
|
||
}
|
||
}
|
||
|
||
stage('Build Api') {
|
||
steps {
|
||
sh '''
|
||
bash -lc '
|
||
set -euo pipefail
|
||
mkdir -p "${CARGO_HOME}" "${CARGO_TARGET_DIR}" "${SCCACHE_DIR}"
|
||
SOURCE_BRANCH="${SOURCE_BRANCH}" SOURCE_COMMIT="${SOURCE_COMMIT}" \
|
||
npm run build:production-release -- --component api-server --name "${EFFECTIVE_BUILD_VERSION}"
|
||
'
|
||
'''
|
||
}
|
||
}
|
||
|
||
stage('Archive') {
|
||
steps {
|
||
archiveArtifacts artifacts: "build/${env.EFFECTIVE_BUILD_VERSION}/api-server,build/${env.EFFECTIVE_BUILD_VERSION}/api-server.sha256,build/${env.EFFECTIVE_BUILD_VERSION}/release-manifest.json", fingerprint: true
|
||
}
|
||
}
|
||
|
||
stage('Publish') {
|
||
when {
|
||
expression { return params.PUBLISH_AFTER_BUILD }
|
||
}
|
||
steps {
|
||
build job: params.DEPLOY_JOB_NAME,
|
||
wait: true,
|
||
propagate: true,
|
||
parameters: [
|
||
string(name: 'SOURCE_BRANCH', value: params.SOURCE_BRANCH),
|
||
string(name: 'COMMIT_HASH', value: env.SOURCE_COMMIT),
|
||
string(name: 'BUILD_VERSION', value: env.EFFECTIVE_BUILD_VERSION),
|
||
string(name: 'DEPLOY_TARGET', value: params.DEPLOY_TARGET),
|
||
booleanParam(name: 'CONFIRM_RELEASE_DEPLOY_AGENT', value: params.CONFIRM_RELEASE_DEPLOY_AGENT),
|
||
string(name: 'BUILD_JOB_NAME', value: env.JOB_NAME),
|
||
string(name: 'BUILD_NUMBER_TO_DEPLOY', value: env.BUILD_NUMBER),
|
||
]
|
||
}
|
||
}
|
||
}
|
||
|
||
post {
|
||
success {
|
||
echo "API 构建完成: version=${env.EFFECTIVE_BUILD_VERSION}, commit=${env.SOURCE_COMMIT}"
|
||
}
|
||
}
|
||
}
|