Påkrevde CI-kontroller
De påkrevde kontrollene bestod. Testene kjørte ikke.
Slik kan betinget utelatte testjobber oppfylle grenbeskyttelsen, og slik hindrer portjobber som alltid kjører, at uprøvde endringer blir slått sammen.
4 min lesetidAv Abdullah Raheel
En nyttig optimalisering åpnet et hull i reglene
Enhets- og E2E-jobbene startet først når etiketten run-tests var lagt til. Det lot oss utsette kostbare testserier mens en pull request fortsatt ble klargjort, men testene skulle fremdeles kjøres før hver sammenslåing. Grenbeskyttelsen håndhevet ikke denne hensikten.
Når vilkåret på jobbnivå ble usant, ble testjobben hoppet over. GitHub ga likevel den utelatte jobben en vellykket sluttstatus overfor de påkrevde kontrollene. Pull requesten kunne dermed se grønn ut selv om ingen testkommando var kjørt.
Behold den betingede testjobben
Jeg beholdt etiketten fordi den var nyttig under gjennomgangen. Feilen var å gjøre selve den betingede testjobben til en påkrevd kontroll. GitHub kunne godkjenne denne kontrollen når jobben ble hoppet over.
unit-tests:
if: |
github.event_name == 'workflow_dispatch' ||
(github.event.action == 'labeled' && github.event.label.name == 'run-tests') ||
(github.event.action == 'synchronize' &&
contains(github.event.pull_request.labels.*.name, 'run-tests'))
steps:
- run: pnpm test:unit:coverageTestjobben avgjør om testene skal kjøre nå. En egen portjobb avgjør om pull requesten trygt kan slås sammen. Da disse beslutningene ble blandet, oppsto den uriktige grønne statusen.
Skill testjobben fra regelen
Jeg la til en liten portjobb etter hver testjobb. Den oppgir testjobben i needs, kjører med if: always() og består bare når resultatet fra testjobben er success. En testserie med resultatet skipped, cancelled eller failure blokkerer nå sammenslåingen med en nyttig melding.
ci-gate:
name: CI Gate (Unit)
runs-on: ubuntu-latest
needs: [unit-tests]
if: always()
steps:
- name: Check test results
run: |
result="${{ needs.unit-tests.result }}"
if [[ "$result" != "success" ]]; then
echo "::error::Unit tests did not pass (result: $result)"
exit 1
fi
echo "Unit tests passed"Oppstrømsresultat Påkrevd portjobb
success pass
failure fail
cancelled fail
skipped fail med en melding som kan følges oppLa de kostbare testjobbene være betingede
Portjobbene står foran reelle testserier. Enhetstestene omfattet 73 Jest-filer, håndhevede terskler og terskler for testdekning som bare kunne øke. Playwright kjørte i Chromium og WebKit med fire arbeidere, to nye forsøk i CI og delt autentiseringstilstand.
Enhetstestene og E2E-testene fikk hvert sitt stabile portnavn. Grenbeskyttelsen kan fortsette å kreve disse navnene selv om implementasjonen av testjobbene senere endres.
Krev portjobben, ikke testjobben
Grenbeskyttelsen ble endret til å kreve CI Gate (Unit) og CI Gate (E2E), ikke de betingede testjobbene. Det gjorde kontrakten for sammenslåing tydelig: en forventet testserie må enten fullføres eller gi en synlig feil som forklarer hvorfor den ikke kjørte.
- La kostbart arbeid være betinget når kodelageret har en tydelig grunn til det.
- Samle alltid sluttresultatet fra hver testjobb som er relevant for reglene for sammenslåing.
- Krev det stabile navnet på samlejobben i grenbeskyttelsen.
- Gjør utelatt validering mulig å følge opp i stedet for å vise den som stille grønn.

