GitLab 管道中 Maven 发布作业失败后如何从干净阶段开始?

问题描述 投票:0回答:1

我正在我的 gitlab ci cd 管道上实施 Maven 发布流程。发布完成后,应该推送带有创建的标签发布进程名称的 docker 镜像。 然后应将其部署到内部云和工件。 我有以下问题。当maven发布作业出现错误并且失败时;假设 CI/CD 变量之一丢失,作业因此失败。 mvn release:prepare 已经创建了标签并提交了 pom 文件中的更改,当涉及到 mvn release:perform 时,它在推送图像时面临错误。 因此,当我修复丢失的变量问题并重新运行作业时,它从一开始就失败,说“更新被拒绝,因为当前分支的尖端落后”,因为它已经提交了前一阶段中的文件,但没有推送.

我怎样才能确保,当maven发布作业期间出现问题并且我想重新运行它时,我从干净阶段开始,恢复之前的提交和所有更改?

我尝试执行回滚操作,但也没有成功

gitlab-ci.yml:

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."

pom.xml(仅适用于 maven-release-plugin):

<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>
maven gitlab gitlab-ci maven-release-plugin
1个回答
0
投票

如果

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."
© www.soinside.com 2019 - 2024. All rights reserved.