97 lines
3.9 KiB
Groovy
97 lines
3.9 KiB
Groovy
// Jenkinsfile for Project A
|
|
|
|
pipeline {
|
|
agent any
|
|
|
|
parameters {
|
|
// 项目特定的默认值
|
|
string(name: 'GIT_REPO_URL', defaultValue: 'https://your-git-server.com/project-a.git', description: 'Git仓库URL')
|
|
string(name: 'GIT_BRANCH', defaultValue: 'main', description: '要拉取的Git分支')
|
|
credentials(name: 'GIT_CREDENTIALS_ID', defaultValue: 'your-git-credentials-id', description: 'Git凭证ID', required: false)
|
|
|
|
string(name: 'BUILD_COMMAND', defaultValue: 'mvn clean package -DskipTests', description: '项目A打包命令') // project-a 的打包命令
|
|
|
|
string(name: 'DOCKER_REGISTRY_URL', defaultValue: 'your-docker-registry.com', description: 'Docker镜像仓库URL')
|
|
string(name: 'DOCKER_IMAGE_NAME', defaultValue: 'project-a-app', description: 'Docker镜像名称') // project-a 的镜像名
|
|
string(name: 'IMAGE_BASE_TAG', defaultValue: '1.0', description: '基础镜像标签')
|
|
credentials(name: 'DOCKER_CREDENTIALS_ID', defaultValue: 'your-docker-registry-credentials-id', description: 'Docker镜像仓库凭证ID', required: true)
|
|
booleanParam(name: 'PUSH_LATEST_TAG', defaultValue: true, description: '是否同时推送 latest 标签?')
|
|
}
|
|
|
|
environment {
|
|
FULL_IMAGE_NAME = "${params.DOCKER_REGISTRY_URL}/${params.DOCKER_IMAGE_NAME}"
|
|
IMAGE_TAG = "" // 将在 Checkout 后动态设置
|
|
}
|
|
|
|
// tools { ... } // 如果需要
|
|
|
|
stages {
|
|
stage('1. Checkout Code') {
|
|
steps {
|
|
echo "拉取代码从 ${params.GIT_REPO_URL}, 分支: ${params.GIT_BRANCH}"
|
|
cleanWs()
|
|
checkout([
|
|
$class: 'GitSCM',
|
|
branches: [[name: params.GIT_BRANCH]],
|
|
userRemoteConfigs: [[
|
|
url: params.GIT_REPO_URL,
|
|
credentialsId: params.GIT_CREDENTIALS_ID
|
|
]],
|
|
extensions: [
|
|
[$class: 'CloneOption', shallow: true, noTags: true, depth: 1, timeout: 20],
|
|
[$class: 'PruneStaleBranch']
|
|
]
|
|
])
|
|
script {
|
|
def shortCommit = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
|
|
env.IMAGE_TAG = "${params.IMAGE_BASE_TAG}-${BUILD_NUMBER}-${shortCommit}"
|
|
echo "生成的镜像TAG: ${env.IMAGE_TAG}"
|
|
}
|
|
}
|
|
}
|
|
|
|
stage('2. Build and Package Application') {
|
|
steps {
|
|
echo "开始打包应用: ${params.BUILD_COMMAND}"
|
|
sh "${params.BUILD_COMMAND}"
|
|
echo "应用打包完成."
|
|
}
|
|
}
|
|
|
|
stage('3. Build Docker Image') {
|
|
steps {
|
|
echo "开始构建Docker镜像: ${env.FULL_IMAGE_NAME}:${env.IMAGE_TAG}"
|
|
script {
|
|
docker.build("${env.FULL_IMAGE_NAME}:${env.IMAGE_TAG}", "-f Dockerfile .") // 假设 Dockerfile 在根目录
|
|
}
|
|
echo "Docker镜像构建完成: ${env.FULL_IMAGE_NAME}:${env.IMAGE_TAG}"
|
|
}
|
|
}
|
|
|
|
stage('4. Push Docker Image') {
|
|
steps {
|
|
echo "开始推送Docker镜像到 ${params.DOCKER_REGISTRY_URL}"
|
|
script {
|
|
docker.withRegistry(params.DOCKER_REGISTRY_URL, params.DOCKER_CREDENTIALS_ID) {
|
|
docker.image("${env.FULL_IMAGE_NAME}:${env.IMAGE_TAG}").push()
|
|
echo "镜像 ${env.FULL_IMAGE_NAME}:${env.IMAGE_TAG} 推送成功."
|
|
if (params.PUSH_LATEST_TAG) {
|
|
docker.image("${env.FULL_IMAGE_NAME}:${env.IMAGE_TAG}").push('latest')
|
|
echo "镜像 ${env.FULL_IMAGE_NAME}:latest 推送成功."
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
post {
|
|
always {
|
|
echo 'Pipeline 结束.'
|
|
cleanWs()
|
|
}
|
|
// success { ... }
|
|
// failure { ... }
|
|
}
|
|
}
|