我正在我的 gitlab ci cd 管道上实施 Maven 发布流程。发布完成后,应该推送带有创建的标签发布进程名称的 docker 镜像。 然后应将其部署到内部云和工件。 我有以下问题。当maven发布作业出现错误并且失败时;假设 CI/CD 变量之一丢失,作业因此失败。 mvn release:prepare 已经创建了标签并提交了 pom 文件中的更改,当涉及到 mvn release:perform 时,它在推送图像时面临错误。 因此,当我修复丢失的变量问题并重新运行作业时,它从一开始就失败,说“更新被拒绝,因为当前分支的尖端落后”,因为它已经提交了前一阶段中的文件,但没有推送.
我怎样才能确保,当maven发布作业期间出现问题并且我想重新运行它时,我从干净阶段开始,恢复之前的提交和所有更改?
我尝试执行回滚操作,但也没有成功
stages:
- build
- test
- release
- push
- deploy
- rollback
cache:
key: $CI_JOB_NAME
paths:
- /.m2/repository
gemnasium-maven-dependency_scanning:
stage: test
variables:
MAVEN_CLI_OPTS: "-DskipTests --batch-mode"
DS_MAX_DEPTH: -1
.setup-mvn:
before_script:
- 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- chmod 400 "$SSH_PRIVATE_KEY"
- ssh-add "$SSH_PRIVATE_KEY"
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- git config --global user.email "[email protected]"
- git config --global user.name "🤖 GitLab CI/CD"
- ssh-keyscan -p 2222 code.gitlab.com >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- mkdir -p ~/.m2
- |
cat <<EOF > ~/.m2/settings.xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
....
EOF
build:
image: docker-local.artifactory.com/maven:3.9.6-eclipse-temurin-21-jammy
variables:
KUBERNETES_CPU_REQUEST: "3"
KUBERNETES_CPU_LIMIT: "5"
KUBERNETES_MEMORY_REQUEST: "4Gi"
KUBERNETES_MEMORY_LIMIT: "7Gi"
stage: build
extends: .setup-mvn
script:
- mvn clean package
artifacts:
paths:
- server/target/*.jar
maven_release:
stage: release
image: docker-local.artifactory.com/maven:3.9.6-eclipse-temurin-21-jammy-openssh
extends: .setup-mvn
when: manual
script:
- git checkout -B "$CI_COMMIT_REF_NAME"
- mvn release:clean release:prepare --batch-mode -DscmCommentPrefix="[skip ci]"
- mvn release:perform -Dgoals=install
push_image:
stage: push
dependencies:
- maven_release
image:
name: docker-local.artifactory.com/executor:v1.14.0-debug
entrypoint: [""]
when: manual
script:
- VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
- mkdir -p /kaniko/.docker
- echo $DOCKER_AUTH_CONFIG > /kaniko/.docker/config.json
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile ./Dockerfile --destination docker-local.artifactory.com/$CI_PROJECT_NAME:$VERSION
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile ./Dockerfile --destination docker-local.artifactory.com/$CI_PROJECT_NAME:latest
- echo "Docker image pushed."
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<pushChanges>false</pushChanges>
<projectVersionPolicyId>SemVerVersionPolicy</projectVersionPolicyId>
<tagNameFormat>v-@{project.version}</tagNameFormat>
</configuration>
</plugin>
</plugins>
</build>
如果
mvn release:perform -Dgoals=install || exit 1
命令出现错误,您可以添加另一个阶段来重置。所以你不必控制任何事情,因为如果出现错误,存储库将被清理。
stages:
- build
- test
- release
- push
- deploy
- rollback
cache:
key: $CI_JOB_NAME
paths:
- /.m2/repository
gemnasium-maven-dependency_scanning:
stage: test
variables:
MAVEN_CLI_OPTS: "-DskipTests --batch-mode"
DS_MAX_DEPTH: -1
.setup-mvn:
before_script:
- 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- chmod 400 "$SSH_PRIVATE_KEY"
- ssh-add "$SSH_PRIVATE_KEY"
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- git config --global user.email "[email protected]"
- git config --global user.name "🤖 GitLab CI/CD"
- ssh-keyscan -p 2222 code.gitlab.com >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- mkdir -p ~/.m2
- |
cat <<EOF > ~/.m2/settings.xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
....
EOF
rollback_release:
stage: rollback
extends: .setup-mvn
script:
- git reset --hard HEAD~1
- git push -f origin $CI_COMMIT_REF_NAME
build:
image: docker-local.artifactory.com/maven:3.9.6-eclipse-temurin-21-jammy
variables:
KUBERNETES_CPU_REQUEST: "3"
KUBERNETES_CPU_LIMIT: "5"
KUBERNETES_MEMORY_REQUEST: "4Gi"
KUBERNETES_MEMORY_LIMIT: "7Gi"
stage: build
extends: .setup-mvn
script:
- mvn clean package
artifacts:
paths:
- server/target/*.jar
maven_release:
stage: release
image: docker-local.artifactory.com/maven:3.9.6-eclipse-temurin-21-jammy-openssh
extends: .setup-mvn
when: manual
script:
- git checkout -B "$CI_COMMIT_REF_NAME"
- mvn release:clean release:prepare --batch-mode -DscmCommentPrefix="[skip ci]"
- mvn release:perform -Dgoals=install || exit 1
push_image:
stage: push
dependencies:
- maven_release
image:
name: docker-local.artifactory.com/executor:v1.14.0-debug
entrypoint: [""]
when: manual
script:
- VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
- mkdir -p /kaniko/.docker
- echo $DOCKER_AUTH_CONFIG > /kaniko/.docker/config.json
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile ./Dockerfile --destination docker-local.artifactory.com/$CI_PROJECT_NAME:$VERSION
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile ./Dockerfile --destination docker-local.artifactory.com/$CI_PROJECT_NAME:latest
- echo "Docker image pushed."