Naar inhoud

Vereiste CI-controles

Je vereiste controles zijn geslaagd. Je tests zijn niet uitgevoerd.

Hoe voorwaardelijk overgeslagen testjobs aan branchbeveiliging kunnen voldoen en hoe altijd uitgevoerde gatejobs niet-geteste merges voorkomen.

4 min. leestijdDoor

Een nuttige optimalisatie opende een gat in het beleid

Unit- en E2E-jobs startten pas nadat een run-tests-label was toegevoegd. Zo konden we kostbare suites uitstellen zolang een pull request nog werd voorbereid, maar voor elke merge moesten ze nog steeds worden uitgevoerd. Branchbeveiliging dwong die bedoeling niet af.

Toen de voorwaarde op jobniveau als onwaar werd geëvalueerd, werd de testworker overgeslagen. GitHub gaf de overgeslagen job voor vereiste controles toch een geslaagde eindstatus. Het pull request kon daardoor groen lijken terwijl geen enkele testopdracht was uitgevoerd.

Houd de worker voorwaardelijk

Ik behield het label omdat het nuttig was tijdens de beoordeling. De fout was dat de voorwaardelijke worker zelf een vereiste controle was. GitHub kon aan die controle voldoen wanneer de worker werd overgeslagen.

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:coverage

De worker beslist of de tests nu worden uitgevoerd. Een afzonderlijke gate beslist of het pull request veilig kan worden gemerged. Door die beslissingen te mengen ontstond de onterecht groene status.

Scheid de worker van het beleid

Ik voegde na elke worker een kleine gate toe. Deze declareert de worker in needs, draait met if: always() en slaagt alleen wanneer het workerresultaat success is. Een overgeslagen, geannuleerde of mislukte suite blokkeert de merge nu met een bruikbaar bericht.

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"
Bovenliggend resultaat  Vereiste gate
success                slaagt
failure                mislukt
cancelled              mislukt
skipped                mislukt met een bruikbaar labelbericht

Houd de kostbare workers voorwaardelijk

De gates staan vóór echte testsuites. De unitdekking omvatte 73 Jest-bestanden, afgedwongen drempels en automatisch stijgende dekkingsnormen. Playwright draaide in Chromium en WebKit met vier workers, twee nieuwe pogingen in CI en gedeelde authenticatiestatus.

Unit en E2E kregen elk een stabiele gatenaam. Branchbeveiliging kan die namen blijven vereisen, ook als de workerimplementatie later verandert.

Stel de gate verplicht, niet de worker

Branchbeveiliging werd gewijzigd om CI Gate (Unit) en CI Gate (E2E) te vereisen, niet de voorwaardelijke workers. Daarmee werd het mergecontract expliciet: een verwachte suite moet slagen of een zichtbare fout geven die uitlegt waarom deze niet is uitgevoerd.

  • Houd kostbaar werk voorwaardelijk wanneer de repository daar een duidelijke reden voor heeft.
  • Verzamel altijd elke definitieve workerstatus die voor het mergebeleid van belang is.
  • Stel de stabiele naam van de aggregator verplicht in branchbeveiliging.
  • Maak duidelijk welke actie nodig is wanneer validatie wordt overgeslagen, in plaats van de controle stilzwijgend groen te maken.