Überprüfen Sie, ob eine Pull-Anforderung mit dem Ziel-Branch auf dem neuesten Stand ist

Lesezeit: 5 Minuten

Benutzeravatar von Brad Cooley
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

Benutzeravatar von Scott Weldon
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.

Hier ist Zusammenführungsstatus Erläuterung

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.

Benutzeravatar von Dmitry
Dmitri

Dafür gibt es eine moderne Methode

git merge-base --is-ancestor A B

sehen git-merge-base

Benutzeravatar von anask
anask

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.

Benutzeravatar von anask
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:

git rev-list --left-right --count  \                                                                 
    origin/dev_develop...$(git branch --show-current) | \                                        
    awk '{print "Behind "$1" - Ahead "$2""}'

# output example: Behind 13 - Ahead 20

Sie können also den folgenden Check mit dem entsprechenden Exit-Code hinzufügen:

target="origin/master"
source=$(git branch --show-current)

# compare the target branch to the pull request branch
behind=`git rev-list --left-right --count  $target...$source | awk '{print $1}'`

if [[ $behind = 0 ]];
    then
        echo 'Up to date!'
        exit 0
    else
        echo 'Please merge!'
        exit 1
fi

Wenn Sie Travis oder andere CI-Jobs verwenden, die nicht alle Commits ziehen, führen Sie a git fetch bevor du die Äste vergleichst:

# fetch the pull request branch's commits
git config remote.origin.fetch \
    +refs/heads/"${source}":refs/remotes/origin/"${source}"
git fetch origin

Benutzeravatar von jd_
jd_

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)

1447610cookie-checkÜberprüfen Sie, ob eine Pull-Anforderung mit dem Ziel-Branch auf dem neuesten Stand ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy