Bitbucket zu Gitlab Webhook zum Auslösen der Pipeline

Bitbucket zu Gitlab Webhook zum Auslösen der Pipeline

Wir haben folgendevor OrtSzenario: Entwickler arbeiten in Bitbucket an Apps, Ops arbeiten in Gitlab an „Gitops“-Dingen. Wir möchten Builds und Bereitstellungen über unsere Gitlab-Pipeline automatisieren und suchen nach Möglichkeiten zur Implementierung. Der Build-Teil funktioniert bereits. Aber wir möchten zwischen Zweigen unterscheiden – nicht jeder Zweig sollte bereitgestellt werden – insbesondere die Produktion würde manuell bereitgestellt werden.

Da der Webhook den Zweig enthält, habe ich versucht, ihn in der Bereitstellungsphase festzulegen:

only:
  - dev

sowie

  rules:
    - if: '$TOKEN_BRANCH != $PROD_BRANCH'

Aber in beiden Fällen wird die Bereitstellungspipeline weiterhin ausgelöst.

Mir fielen zwei Workarounds ein:

Eine Möglichkeit wäre, das Bitbucket-Repository per „Post Commit Hook“ zu spiegeln – dieses Plugin ist allerdings zum einen kostenpflichtig und zum anderen braucht man für die Spiegelung ein zweites Plugin – und das einzige, das ich finden konnte, wird nicht mehr gepflegt.

Die zweite Möglichkeit wäre, Gitlab Ultimate zu lizenzieren, um „Pull Mirroring“ verwenden zu können, das auch über einen Bitbucket-Webhook ausgelöst werden könnte.

Da wir keine Verwendung für die Repository-Spiegelung haben und der einzige Anwendungsfall darin bestünde, die Gitlab-Pipeline in einem „lokalen Repository“ verwenden zu können, in dem alle oben genannten Möglichkeiten zum Unterscheiden des Zweigs für die Bereitstellung funktionieren sollten, würde ich es vorziehen, eine Möglichkeit mit bereits verfügbaren Ressourcen zu finden.

Ich freue mich, Ihre Meinung dazu zu hören!

BEARBEITEN: Teile der Pipeline:

variables:
  PROD_BRANCH: main

before_script:
  - TOKEN_BRANCH=$(cat $TRIGGER_PAYLOAD | jq -r '.changes[0].ref.displayId')

deploy:
  stage: deploy
  tags:
    - openshift
  rules:
    - if: $TOKEN_BRANCH != $PROD_BRANCH
  • echo $TOKEN_BRANCH gibt „main“ zurück.
  • in Regeln: Dieser Teil der Pipeline wird nur ausgelöst, wenn die folgende Anweisung wahr ist.
  • Da "main == main" und nicht "!=" ist, sollte die "Deploy"-Phase der Pipeline nicht ausgeführt werden. Aber sie wird ausgeführt...

mehrere Varianten

rules:
  - if: '$TOKEN_BRANCH !~ $PROD_BRANCH'

rules:
  - if: '$TOKEN_BRANCH =~ $PROD_BRANCH'
    when: never

in diesen Fällen passiert das Gegenteil – die Pipeline hat nie eine Bereitstellungsphase – sie zeigt die Phase nicht einmal in der „Pipelines“-Ansicht in Gitlab an.

Antwort1

Habe eine funktionierende Lösung gefunden:

Nachdem "Regeln" nicht funktionierten, verwende ich jetzt eine "if-Schleife" im Skriptteil der Deployment-Phase. So wird die Deployment-Phase zwar jedes Mal ausgelöst, die Logik (= das Deployment) wird aber nur ausgeführt, wenn das Token die entsprechende Phase enthält.

deploy-to-test:
  stage: deploy
  variables:
    PROD: master
  tags:
    - openshift
  script:
    - >
      if [ "$TOKEN_BRANCH" != "$PROD" ]; then
      ---logic---
      else
        echo "skipping ..."
      fi

verwandte Informationen