自动合并分支时如何解决冲突?在 GitLab 中?你想要一个 yaml 脚本,一个 CI 动作配方,还是只需要 git 命令?

How to resolve conflict while merging branch automatically? in GitLab? do you want a yaml script, a CI action recipe, or just the git command?

如果我合并两个 branch.It 节目,

Merge blocked: merge conflicts must be resolved

如果我给解决冲突

ENTRYPOINT ["java","-Dspring.profiles.active=**development**","-jar","/app/integration-service.jar"]
ENTRYPOINT ["java","-Dspring.profiles.active=**stage**","-jar","/app/integration-service.jar"]
kind: Deployment
metadata:
  name: integration-app
  namespace: stellacenter-**dev**
  namespace: stellacenter-**stage-uat**
  labels:
    app: integration-app
spec:
kind: Service
metadata:
  name:  integration-service
  namespace: stellacenter-**dev**
  namespace: stellacenter-**stage-uat**
spec:
  type: NodePort
  selector:

这是在 GitLab 中 使用我们的 并提交到源分支并完成它的简单方法,但我想在合并时自动解决冲突而不是手动解决冲突。是否有有什么要添加的规则吗?怎么办。请帮我整理一下。我附上了我正在使用的 yaml 脚本。

services:
  - docker:19.03.11-dind
workflow:
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH == "developer" || $CI_COMMIT_BRANCH == "stage"|| ($CI_COMMIT_BRANCH =~ (/^([A-Z]([0-9][-_])?)?SPRINT(([-_][A-Z][0-9])?)+/i))
      when: always
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH != "developer" || $CI_COMMIT_BRANCH == "stage"|| ($CI_COMMIT_BRANCH !~ (/^([A-Z]([0-9][-_])?)?SPRINT(([-_][A-Z][0-9])?)+/i))
      when: never 
stages:
  - build
  - Publish
  - deploy
cache:
  paths:
    - .m2/repository
    - target
build_jar:
  image: maven:3.8.3-jdk-11
  stage: build
  script: 
    - mvn clean install package -DskipTests=true
  artifacts:
    paths:
      - target/*.jar
docker_build:
  stage: Publish
  image: docker:19.03.11
  services:
    - docker:19.03.11-dind
  variables:
    IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
  script: 
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG
deploy_dev:
  stage: deploy
  image: stellacenter/aws-helm-kubectl
  before_script:
    - aws configure set aws_access_key_id ${DEV_AWS_ACCESS_KEY_ID}
    - aws configure set aws_secret_access_key ${DEV_AWS_SECRET_ACCESS_KEY}
    - aws configure set region ${DEV_AWS_DEFAULT_REGION}
  script:
    - sed -i "s/<VERSION>/${CI_COMMIT_SHORT_SHA}/g" appointment-service.yml
    - mkdir -p  $HOME/.kube
    - cp $KUBE_CONFIG_DEV $HOME/.kube/config
    - chown $(id -u):$(id -g) $HOME/.kube/config 
    - export KUBECONFIG=$HOME/.kube/config
    - kubectl apply -f appointment-service.yml

在合并或 MR 管道期间没有自动方法来执行此操作。也没有办法使用 rules: 或类似的方法来检测冲突。您将需要手动修复冲突。

如果您有办法(例如脚本)通过一系列可重复的命令可靠地解决冲突,您可能能够通过使用 CICD 作业自动完成。

例如,你可能使用$CI_OPEN_MERGE_REQUESTS$CI_MERGE_REQUEST_IID找到打开的合并请求,然后使用merge requests API判断是否存在冲突,如果存在冲突, 采取一些措施来修复冲突,然后将修复推送到源分支。

示例:

fix-conflicts:
  stage: .pre # run before all other stages
  rules:
    - if: '$CI_MERGE_REQUEST_IID'
      
  script:
    # use the MR API to detect if there is a conflict. You implement this script.
    # if no conflicts exist (nonzero script exit) - exit 0 for the job
    - ./does-mr-conflict-exist.sh $CI_MERGE_REQUEST_IID || exit 0
    # you implement this script to fix the conflict
    - ./fix-conflicts.sh
    - git push -u origin "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME"
    - exit 1  # optional - stop the pipeline (a new one will be created from push)