Java Service 持续集成落地指南
一、目标与总体流程
二、落地步骤
<properties>
<java.version>21</java.version>
<maven.compiler.release>21</maven.compiler.release>
<sonar.coverage.jacoco.xmlReportPaths>target/site/jacoco/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*Test.java</include>
<include>**/*IT.java</include>
</includes>
<argLine>@{jacoco.agent.argLine}</argLine>
</configuration>
</plugin>
</plugins>
</build>
junit.jupiter.execution.parallel.enabled=true
junit.jupiter.execution.parallel.mode.default=concurrent
junit.jupiter.execution.parallel.config.strategy=dynamic
junit.jupiter.execution.parallel.config.dynamic.factor=2
三、示例流水线
pipeline {
agent any
tools { jdk 'jdk-21' }
environment {
MAVEN_OPTS = '-Dmaven.repo.local=$WORKSPACE/.m2/repository'
IMAGE = "${env.DOCKER_REGISTRY}/myorg/${env.JOB_NAME}:${env.BUILD_NUMBER}"
HELM_CHART = "charts/${env.JOB_NAME}"
}
stages {
stage('Checkout') { steps { checkout scm } }
stage('Build & Test') {
steps {
sh 'mvn -B clean verify'
junit '**/target/surefire-reports/*.xml'
jacoco execPattern: '**/target/jacoco.exec', classPattern: '**/classes', sourcePattern: '**/src/main/java'
}
}
stage('Quality Gates') {
steps {
withSonarQubeEnv('Sonar') { sh 'mvn sonar:sonar' }
dependencyCheck additionalArguments: '--format XML --out .', odcInstallation: 'OWASP-DC'
publishHTML target: [reportDir: 'target/dependency-check-report', reportFiles: 'index.html', reportName: 'OWASP DC Report']
}
}
stage('Docker Build & Push') {
steps {
sh 'docker buildx build --platform linux/amd64,linux/arm64 -t $IMAGE --push .'
}
}
stage('Deploy to Staging') {
steps { sh 'helm upgrade --install $JOB_NAME $HELM_CHART --namespace staging --atomic --set image.tag=$BUILD_NUMBER' }
}
stage('Canary 5%') {
steps { sh 'helm upgrade $JOB_NAME $HELM_CHART --namespace canary --atomic --set replicaCount=1 --set image.tag=$BUILD_NUMBER --set service.canary.enabled=true' }
}
stage('Promotion to Prod') {
when { expression { currentBuild.result == null || currentBuild.result == 'SUCCESS' } }
steps {
timeout(time: 5, unit: 'MINUTES') {
input 'Promote to production?'
}
sh 'helm upgrade $JOB_NAME $HELM_CHART --namespace prod --atomic --set image.tag=$BUILD_NUMBER'
}
}
}
post {
failure {
script {
// 可结合 SLO/指标做自动回滚
echo 'Build/Deploy failed, check reports and roll back if needed.'
}
}
}
}
variables:
MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository"
DOCKER_BUILDKIT: 1
IMAGE: $CI_REGISTRY/myorg/$CI_PROJECT_NAME:$CI_COMMIT_SHA
stages: [build, test, security, package, deploy-staging, canary, deploy-prod]
cache:
paths: [.m2/repository]
build-test:
stage: build
script:
- mvn -B clean verify
- junit '**/target/surefire-reports/*.xml'
- jacoco execPattern: '**/target/jacoco.exec', classPattern: '**/classes', sourcePattern: '**/src/main/java'
sonar:
stage: security
script: mvn sonar:sonar
allow_failure: true
owasp-dc:
stage: security
script:
- dependency-check.sh --format XML --out .
artifacts:
paths: [dependency-check-report.xml]
docker-build:
stage: package
script:
- docker buildx build --platform linux/amd64,linux/arm64 -t $IMAGE --push .
deploy-staging:
stage: deploy-staging
script:
- helm upgrade --install $CI_PROJECT_NAME charts/$CI_PROJECT_NAME --namespace staging --atomic --set image.tag=$CI_COMMIT_SHA
canary:
stage: canary
script:
- helm upgrade $CI_PROJECT_NAME charts/$CI_PROJECT_NAME --namespace canary --atomic --set replicaCount=1 --set image.tag=$CI_COMMIT_SHA --set service.canary.enabled=true
when: manual
deploy-prod:
stage: deploy-prod
script:
- helm upgrade $CI_PROJECT_NAME charts/$CI_PROJECT_NAME --namespace prod --atomic --set image.tag=$CI_COMMIT_SHA
when: manual
四、关键实践与风险控制
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。