Gitlab CI/CD git push POMs 所有阶段工作的变化

Posted

技术标签:

【中文标题】Gitlab CI/CD git push POMs 所有阶段工作的变化【英文标题】:Gitlab CI/CD git push POMs changes in all stage's jobs 【发布时间】:2021-11-02 14:43:57 【问题描述】:

我在 Spring Boot 中制作了简单的微服务结构(三个模块),我想在更改后的微服务的 pom 中配置 gitlab ci/cd 以自动增加版本号。所以我在我的 .gitlab-ci.yml 中创建了一步:

.increment-version-module:
  stage: increment version
  image: ssmolinski9/docker-adoptopenjdk-11-maven-node
  except:
    variables:
      - $GITLAB_USER_LOGIN == "login"
      - $CI_COMMIT_BRANCH == "master"
  before_script:
    - git config --global user.email "mymail"
    - git config --global push.default matching
    - git config --global user.name "myname"
    - git config --global user.password "$CI_INCREMENTION_PWD"
  script:
    - NUMBER=$(grep \<\/version $MODULE/pom.xml | head -n 1 | cut -d '>' -f2 | cut -d '<' -f1)
    - NUMBER_1=$(echo $NUMBER | cut -d '.' -f1)
    - NUMBER_2=$(echo $NUMBER | cut -d '.' -f2)
    - NUMBER_3=$(echo $NUMBER | cut -d '.' -f3)
    - NUMBER_3=$((NUMBER_3+1))
    - NUMBER_new="$NUMBER_1"."$NUMBER_2"."$NUMBER_3"
    - sed -i 's/\<version\>$NUMBER\<\/version\>/\<version\>$NUMBER_new\<\/version\>/g' $MODULE/pom.xml
    - echo $NUMBER_new
    - mvn $MAVEN_CLI_OPTS -pl $MODULE versions:set -B -DnewVersion=$NUMBER_new -f pom.xml
    - mvn $MAVEN_CLI_OPTS -pl $MODULE versions:commit -B -DprocessAllModules -f pom.xml
    - git commit -a -m ''$MODULE' POM Version Increment '$NUMBER_new''
    - git pull https://myname:$CI_INCREMENTION_PWD@gitlab.com/url/to/my/repo/api.git HEAD:$CI_COMMIT_REF_NAME --prune --rebase
    - git push https://myname:$CI_INCREMENTION_PWD@gitlab.com/url/to/my/repo/api.git HEAD:$CI_COMMIT_REF_NAME -u -f

然后我为我拥有的每个模块创建了三个工作,例如:

increment-discovery-service:
  extends:
    - .discovery-service
    - .increment-version-module
  resource_group: incrementing

虽然它可以工作,但我的管道处于 SUCCESS 状态,但是......当我拉出我的更改时,只有三个提交中的一个(最后一个)仍然存在。管道日志中的所有内容都是正确的(新版本,创建提交,推送),但我认为 git push 中的 -f 选项搞砸了。

Last commits on my branch

有什么想法吗?

【问题讨论】:

你确定你需要 git 中的内部版本号,在工件中拥有它还不够吗? 【参考方案1】:

我想我明白了。我必须从 $CI_COMMIT_REF_NAME 而不是 HEAD:$CI_COMMIT_REF_NAME 中提取。我改变了它,一切似乎都正常。如果将来有人需要,我会提供完整的解决方案。

我的模块结构:

--discovery-service
---pom.xml 
---.gitlab-ci.yml 
--dummy-service
---pom.xml
---.gitlab-ci.yml
--gateway-service
---pom.xml
---.gitlab-ci.yml
-.gitlab-ci.yml
-.pom.xml

所以我在每个微服务的模块中都有 pom.xml 和 .gitlab-ci.yml 和一个用于 root。

微服务中的每个 .gitlab-ci.yml 看起来像:

.discovery-service:
  variables:
    MODULE: "discovery-service"
  only:
    changes:
      - "discovery-service/**/*"

在 main .gitlab-ci.yml 中我们必须包含微服务的配置:

include:
  - local: discovery-service/.gitlab-ci.yml
  - local: dummy-service/.gitlab-ci.yml
  - local: gateway-service/.gitlab-ci.yml

.increment-version-module 我在第一篇文章中列出。仅在没有 HEAD 的情况下从 $CI_COMMIT_REF_NAME 更改 pull。你必须为每个模块做的最后一件事:

increment-discovery-service:
  extends:
    - .discovery-service
    - .increment-version-module
  resource_group: incrementing

increment-dummy-service:
  extends:
    - .dummy-service
    - .increment-version-module
  resource_group: incrementing

increment-gateway-service:
  extends:
    - .gateway-service
    - .increment-version-module
  resource_group: incrementing

【讨论】:

以上是关于Gitlab CI/CD git push POMs 所有阶段工作的变化的主要内容,如果未能解决你的问题,请参考以下文章

CI/CD之搭建私有git仓库gitlab

DevOps实战-基于Docker的CI/CD

git 客户端连接gitlab 实现简单的CI/CD

CI/CD持续集成与持续交付(上)-------- git,gitee远程共有仓库和gitlab私有仓库,jenkins

CI/CD持续集成与持续交付(上)-------- git,gitee远程共有仓库和gitlab私有仓库,jenkins

gitlab 的 CI/CD 配置管理