Überprüfen Sie, ob eine Pull-Anforderung mit dem Ziel-Branch auf dem neuesten Stand ist
Lesezeit: 5 Minuten
Brad Cooley
Unser Projekt verwendet geschützte Zweige und erfordert, dass der Basiszweig eines PR mit dem Zielzweig auf dem neuesten Stand ist, um zusammengeführt zu werden. Wir verwenden Jenkins auch, um den nicht zusammengeführten Kopf des PR zu erstellen, da das von uns verwendete Plugin automatisch alle offenen PRs neu erstellt, wenn sich der Zielzweig ändert, was eine Pipeline schnell verstopfen kann. Für den Fall, dass ein PR geöffnet wird, ohne dass der Ziel-Branch auf dem neuesten Stand ist, möchten wir in der Lage sein, die Jenkins-Pipeline sofort zu stoppen und den Committer zu benachrichtigen, dass er zuerst zusammenführen muss.
Mit der GitHub-API möchte ich also feststellen können, ob eine Pull-Anfrage mit dem Ziel-Branch auf dem neuesten Stand ist. Am nächsten scheint das “mergeable”-Attribut auf einer Pull-Anforderung zu sein, aber das sieht so aus, als ob es nur anzeigt, ob eine sichere automatische Zusammenführung durchgeführt werden kann, nicht ob der Zweig bereits auf dem neuesten Stand ist.
Gibt es ein direktes API-json-Tag, das eingesehen werden kann? Wenn nicht, gibt es eine einfache Möglichkeit, dies manuell mit Git-Befehlen zu überprüfen?
Erforderliche Statusprüfungen die Möglichkeit dazu haben Require branches to be up to date before merging. Dies beantwortet zwar nicht den API-Teil Ihrer Frage, kann aber ein gültiger Workflow sein, den Sie in Betracht ziehen sollten.
– Osowskit
11. Dezember 2016 um 22:32 Uhr
Scott Weldon
Ich weiß nicht, ob GitHub diese Informationen über ihre API offenlegt, aber Sie können dies manuell mit Git-Befehlen erkennen. Sie möchten die so genannte Merge-Basis finden und sicherstellen, dass dieses Commit mit der Spitze von identisch ist master (oder was auch immer Ihr Hauptzweig ist).
In Form eines Bash-Skripts würde es etwa so aussehen:
if [ $(git merge-base @ master) == $(git rev-parse master) ]
then
echo "Your branch is up to date."
exit 0
else
echo "You need to merge / rebase."
exit 1
fi
Wenn Sie dieses Skript als Build-Schritt einschließen, sollten die Exit-Werte dazu führen, dass Jenkins den Job bei Bedarf fehlschlägt.
Wie in Dmitrys Antwort erwähnt, können Sie mit neueren Versionen von Git die verwenden --is-ancestor Flagge für git merge-base um es auf einen Befehl zu vereinfachen. Das Skript sähe dann so aus:
if git merge-base --is-ancestor master @
then
echo "Your branch is up to date."
exit 0
else
echo "You need to merge / rebase."
exit 1
fi
Sie könnten sogar BITBUCKET_PR_DESTINATION_BRANCH anstelle von master verwenden, um es dynamisch zu machen
– Jorge Wander Santana Ureña
3. Oktober 2021 um 22:20 Uhr
@Jorge Danke, das ist eine gute Option für Bitbucket; vermutlich hat GitHub etwas ähnliches.
– Scott Weldon
5. Oktober 2021 um 17:20 Uhr
Ups, mein Fehler. du hast recht hehe.
– Jorge Wander Santana Ureña
5. Oktober 2021 um 20:24 Uhr
Ich habe echo hinzugefügt, um die Ergebnisse zu erhalten: git merge-base –is-ancestor master @ ; Echo $?
– STF
17. Januar um 13:37 Uhr
Außerdem sendet Github normalerweise den zusammengeführten Zweig an Jenkins – Sie müssen also überprüfen, ob der Ursprungszweig aktualisiert wird: git merge-base –is-ancestor origin/master origin/${ghprbSourceBranch};
– STF
19. Januar um 6:28 Uhr
Wenn Sie die Github-API verwenden möchten. Jede API, die das Pull-Request-Objekt zurückgibt, hat die mergeable_state Feld darin. Wenn sein Wert ist behind, das heißt, der Basiszweig wird aktualisiert, nachdem die Pull-Anforderung erstellt wurde. dh: Pull-Request-Zweig ist veraltet.
Wenn Sie Webhook-Antworten auf dem Jenkings-Server verarbeiten, enthalten die meisten Pull-Request-Ereignisse wie Pull-Request erstellt, bearbeitet, geschlossen oder issue_comment-Ereignisse die mergeable_state Informationen im Pull-Request-Objekt.
Sie müssen die GraphQL-API von GitHub verwenden und die mergeStateStatus Wert, wie andere erwähnt haben. Das Beispiel-Shell-Skript unten geht davon aus, dass Sie die Nummer der Pull-Anfrage bereits kennen und eine haben Persönliches GitHub-Zugriffstoken.
# get-merge-state-status.sh example
# $TOKEN should be a defined environment variable
OWN_ORG='IBM'
REPO='data-import'
# get PR number from input
PR_NUMBER=$1
# prepare query with the appropriate parameters
QUERY=`cat <<EOF
{"query":
"query {
repository(owner: \"${OWN_ORG}\", name: \"${REPO}\") {
pullRequest(number: ${PR_NUMBER}) {
title
state
mergeStateStatus
}
}
}"
}
EOF`
# remove new lines so that the api understands the query
QUERY=$(echo $QUERY|tr -d '\n')
curl_opts=(
-s
-H "Authorization: bearer $TOKEN"
-H "Accept: application/vnd.github.merge-info-preview+json"
-X POST
-d "$QUERY"
)
# make the api call
JSON=$(curl "${curl_opts[@]}" https://api.github.com/graphql)
STATE=$(echo $JSON | jq -r '.data.repository.pullRequest.state')
M_STATE=$(echo $JSON | jq -r '.data.repository.pullRequest.mergeStateStatus')
echo $STATE $M_STATE
Dann können Sie das Skript wie folgt ausführen:
[anask@supremedev]$ bash get-merge-state-status.sh 10
OPEN CLEAN
Beachten Sie, dass Sie bei Verwendung von GitHub Enterprise die Adresse von ändern api.github.com Zu api.github.<SRV_NAME>.com.
anask
git rev-list kann verwendet werden, um die Differenz zwischen zwei Zweigen zurückzugeben, solange der PR-Zweig einen gemeinsamen Punkt mit dem Zielzweig (z. B. Master) hat:
Dies ist ein sehr häufiges Problem für Personen, die einen Workflow implementieren möchten, bei dem Zusammenführungen serialisiert werden.
Dies ist etwas, das mit gelöst werden kann Verschmelzen leicht. Es bietet genau das, was Sie brauchen strikter Arbeitsablauf. Mergify übernimmt für Sie die Aktualisierung Ihrer veralteten Pull-Requests und beauftragt die Zusammenführung der gültigen Pull-Requests. Wir haben Mergify entwickelt, um genau dieses Problem überhaupt zu lösen!
(Haftungsausschluss: Ich bin einer der Mergify-Autoren)
14476100cookie-checkÜberprüfen Sie, ob eine Pull-Anforderung mit dem Ziel-Branch auf dem neuesten Stand istyes
Erforderliche Statusprüfungen die Möglichkeit dazu haben
Require branches to be up to date before merging
. Dies beantwortet zwar nicht den API-Teil Ihrer Frage, kann aber ein gültiger Workflow sein, den Sie in Betracht ziehen sollten.– Osowskit
11. Dezember 2016 um 22:32 Uhr