Gå til hovedinnhold

Merge-stopp

Et merge-stopp stopper merges inn i én branch, med en begrunnelse, frem til et tidspunkt. Bruk det for et kutt i et utgivelsestog, en hendelse eller en migrering som ikke må kollidere med andre endringer. Utgivelsestog setter og opphever sine egne merge-stopp (source: train), eid av togets eier.

Et merge-stopp dekker ett av disse:

  • alle repositoryer i organisasjonen;
  • en liste med repositoryer (opptil 50);
  • ett repository.

Det gjelder alltid én branch, main med mindre du oppgir en annen.

Slik stopper et merge-stopp en merge

fremforge setter en commit-status, fremforge/hold, på head-commiten til hver åpen pull request mot en branch med merge-stopp:

StatusBetydning
pendingEt merge-stopp dekker denne pull requesten. Beskrivelsen oppgir eieren, utløpstiden og begrunnelsen.
successIngen merge-stopp dekker den, eller en administrator slapp denne pull requesten gjennom (se Overstyring for administratorer).

På en branch der fremforge/hold er en påkrevd sjekk, stopper et pending merge-stopp alle måter å merge på:

  • Merge-knappen og API-ets merge-endepunkt avviser med «Not all required status checks successful».
  • Automatisk merge venter. Når merge-stoppet oppheves, blir statusen success, og alle pull requests som er klargjort til å merges, merges da. En pull request som klargjøres under en frys, merges etter den.
  • Merge-køen holder pull requesten utenfor en merge-gruppe. Hvis merge-stoppet varer lenger enn køens tidsavbrudd for sjekker, parkerer køen pull requesten og setter den tilbake én gang, når sjekkene er grønne igjen.

Når du pusher til en pull request med merge-stopp, eller åpner en ny, får den statusen i løpet av sekunder. En avstemmingsjobb reparerer hvert 5. minutt alle statuser som mangler, er utdaterte eller ble satt av noen andre.

Merge-stopp stenger ved feil. Hvis fremforge ikke kan sette statusen, venter en ny pull request mot en branch der merge-stopp håndheves, til den kan det.

I konsollen

Eiere av organisasjonen administrerer merge-stopp under Bygg og utrulling → Merge-stopp (https://frem.sh/<org>/_admin/merge-holds): de aktive merge-stoppene med eier, utløpstid og hvor merge-knappen venter, knapper for å oppheve, forlenge eller slippe én pull request gjennom, et skjema for å sette et merge-stopp, bryterne for håndheving og merge-stoppene som nylig er avsluttet. Alt på siden finnes også i API-et nedenfor.

Slå på håndheving

Å kreve fremforge/hold er et tilvalg, per repository eller for hele organisasjonen, per branch. Inntil du slår det på, listes merge-stopp og leses av verktøy, men merge-knappen venter ikke på dem.

curl -X PUT https://frem.sh/_app/api/v1/orgs/<org>/merge-holds/enforcement \
  -H "Authorization: Bearer $FREMFORGE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"repo": "*", "branch": "main"}'

repo er et repositorynavn, eller * for alle repositoryer, også de som opprettes senere. Tokenet trenger policy:write.

Når du slår det på, setter fremforge først fremforge/hold på hver åpen pull request mot branchen. Først da legger den sjekken til i branchens beskyttelsesregel. Ingen pull request venter noen gang på en sjekk som ingenting har satt.

Svaret lister:

  • required_on: repositoryer der sjekken nå er påkrevd.
  • unprotected: repositoryer der branchen ikke har noen beskyttelsesregel. fremforge oppretter ikke en; legg til en regel, så krever avstemmingsjobben sjekken innen 5 minutter.
  • failed: repositoryer der pull requestene ikke kunne leses. Regelen deres blir stående urørt, og jobben prøver igjen.

For å slå det av sender du samme innhold med DELETE. fremforge fjerner sjekken der ingen andre tilvalg fortsatt dekker repositoryet.

Sette et merge-stopp

curl -X POST https://frem.sh/_app/api/v1/orgs/<org>/merge-holds \
  -H "Authorization: Bearer $FREMFORGE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
        "repos": ["platform", "infrastructure-azure"],
        "reason": "Train 42 cut: no merges until the tst probe passes",
        "duration_minutes": 120
      }'
FeltPåkrevdMerknader
reasonjaÉn linje, opptil 500 tegn. Vises i statusen på hver pull request med merge-stopp.
expires_at eller duration_minutesnøyaktig ettMinst 5 minutter og høyst 7 dager frem i tid. expires_at er ISO 8601 med tidssone.
reposneiUtelat for å stoppe alle repositoryer.
branchneiEtt branchnavn, uten jokertegn. Standard main.
ownerbare for et token som ikke handler for en personEt medlem av organisasjonen.

Tokenet trenger deployments:write, det samme scopet som setter utrullinger på pause. Lesing av merge-stopp krever deployments:read.

Eier

Hvert merge-stopp tilhører en person. Når du, eller en agent som handler på dine vegne, setter et merge-stopp, er du eieren. Et token som ikke handler for en person, for eksempel et CI-token, må oppgi owner.

Utløp og varsling

Ingen merge-stopp blokkerer for alltid. Når et merge-stopp når utløpstiden, opphever fremforge det innen 5 minutter, registrerer merge_hold.expired i revisjonsloggen og sender e-post til eieren. Hvis merges fortsatt må stoppes, forlenger du det før den tid:

curl -X PATCH https://frem.sh/_app/api/v1/orgs/<org>/merge-holds/<id> \
  -H "Authorization: Bearer $FREMFORGE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"duration_minutes": 60}'

Liste og oppheve merge-stopp

# Live holds, and where enforcement is on
curl https://frem.sh/_app/api/v1/orgs/<org>/merge-holds \
  -H "Authorization: Bearer $FREMFORGE_TOKEN"

# Release one
curl -X POST https://frem.sh/_app/api/v1/orgs/<org>/merge-holds/<id>/release \
  -H "Authorization: Bearer $FREMFORGE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"note": "Train 42 is out"}'

Legg til ?state=all på listen for å ta med opphevede merge-stopp. Pull requests med merge-stopp blir success i løpet av sekunder etter en oppheving.

Når et merge-stopp settes eller oppheves, vises det også i hendelsesfeeden som hold.placed og hold.released, én hendelse per repository merge-stoppet dekker.

AI-assistenter som er koblet til via fremforges MCP-server, kan liste merge-stopp med verktøyet list_merge_holds.

Overstyring for administratorer

Det finnes to overstyringer, og begge registreres i revisjonsloggen:

  • Oppheve noen andres merge-stopp. Alle eiere av organisasjonen kan oppheve alle merge-stopp. Når eieren opphever det, registrerer revisjonsloggen merge_hold.released. Når noen andre gjør det, registreres merge_hold.override.
  • Slippe én pull request gjennom. For en hasterettelse under en frys kan du unnta én enkelt pull request. Statusen blir success, og merge-stoppet gjelder fortsatt for alt annet. En begrunnelse er påkrevd. Revisjonsloggen registrerer merge_hold.exempted.
curl -X POST https://frem.sh/_app/api/v1/orgs/<org>/merge-holds/<id>/exemptions \
  -H "Authorization: Bearer $FREMFORGE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"repo": "platform", "pr_number": 812, "reason": "INC-7 hotfix"}'

En repository-administrator kan fortsatt merge manuelt der branchregelen ikke gjelder for administratorer. Det er break-glass-veien (nødtilgang), og Forgejo registrerer den som enhver annen merge.

Utgivelsesfrys fra en issue

Hvis teamet ditt fryser et repository ved å opprette en issue med etiketten release-freeze, fortsetter det å virke. I et repository der håndheving er på, gjør fremforge hver åpen release-freeze-issue om til et merge-stopp på det repositoryet:

  • forfatteren av issuen eier det;
  • begrunnelsen er tittelen på issuen;
  • når issuen lukkes eller etiketten fjernes, oppheves det i løpet av sekunder.

Dermed respekterer også merge-knappen frysen. En frys har ingen egen sluttid, så merge-stoppet varer 24 timer om gangen: mens issuen er åpen, fornyer fremforge merge-stoppet når det utløper, og sender e-post til eieren om at frysen fortsatt gjelder.

Dette gjør ikke et merge-stopp

  • Det stopper ikke direkte push til branchen. Bruk branchbeskyttelse for å kreve pull requests.
  • Det stopper ikke utrullinger. Sett et utrullingsmiljø på pause for det.
  • Alle med skrivetilgang til et repository kan sette en commit-status med hvilket som helst navn. fremforge setter fremforge/hold tilbake og registrerer merge_hold.status_foreign i revisjonsloggen når noen andre setter den. Det lukker hullet i løpet av sekunder til minutter, ikke umiddelbart.

Revisjonshendelser

HendelseNår
merge_hold.createdEt merge-stopp ble satt, også et merge-stopp speilet fra en release-freeze-issue.
merge_hold.updatedEieren forlenget det eller endret begrunnelsen.
merge_hold.releasedEieren opphevet det, eller release-freeze-issuen ble lukket.
merge_hold.overrideNoen andre enn eieren opphevet eller endret det.
merge_hold.exemptedÉn pull request ble sluppet gjennom.
merge_hold.expiredDet nådde utløpstiden og ble opphevet.
merge_hold.renewedEt release-freeze-merge-stopp utløp mens issuen fortsatt var åpen.
merge_hold.enforcement_enabled / merge_hold.enforcement_disabledHåndheving ble slått på eller av.
merge_hold.status_foreignNoen andre satte fremforge/hold, og fremforge satte den tilbake.