Come aggiungere un semplice test STI per un pacchetto

Test come singolo comando

Task

Esiste un pacchetto somepackage, che contiene un binario: /usr/bin/somebinary

Il modo più semplice e ovvio per testare questo binario è eseguirlo: somebinary --help e controllare lo stato di uscita del risultato.

Come aggiungere questo test per il pacchetto?

Il framework Ruoli Test Standard fornisce una soluzione per il task. È pienamente supportato in Fedora Rawhide.

Soluzione

Crea il file tests/tests.yml nel dist-git del pacchetto:

rpms/somepackage.git:
.
├── 0001-something.patch
├── somepackage.spec
├── sources
└── tests
    └── tests.yml

tests.yml è un playbook ansible, in cui descrivi l’ambiente di test e i passaggi per eseguire i tuoi test.

Ci sono molte opzioni e esempi disponibili, ma concentriamoci sul compito attuale: vogliamo eseguire solo un comando.

Per questo caso, il contenuto del file dovrebbe essere il seguente:

rpms/somepackage.git:tests/tests.yml
- hosts: localhost
  roles:
  - role: standard-test-basic                         (1)
    tags:
    - classic
    tests:
    - simple:
        dir: .
        run: "somebinary --help"                      (2)
1 questo è un ruolo di test standard, si occupa dell’ambiente di test, del logging, dell’archiviazione dei risultati, ecc
2 questo è il tuo comando di test, il suo codice di uscita definisce l’esito del test

Invia la tua modifica come pull request per vedere i risultati dei test nell’interfaccia di Pagure, oppure spingila direttamente in dist-git e ottieni nuovi risultati dei test ogni volta che costruisci il pacchetto in Koji.

Il test verrà eseguito in modalità non bloccante fino a quando non configurerai la gating per esso.

Test in un (sotto)pacchetto

Task

Esiste un pacchetto somepackage, e per esso esiste una suite di test di integrazione impacchettata in un pacchetto separato sometests, che fornisce il binario run_some_tests nel percorso di sistema.

L’obiettivo è attivare questo binario come test per il pacchetto principale.

Soluzione

Come sopra, è necessario creare un file di configurazione tests.yml con il seguente contenuto:

rpms/somepackage.git:tests/tests.yml
---
- hosts: localhost
  roles:
    - role: standard-test-basic
      tags:
        - classic
      required_packages:
        - sometests                    (1)

      tests:
        - integration_tests:            (2)
            dir: .
            run: run_some_tests         (3)
1 pacchetto aggiuntivo che deve essere installato nell’ambiente di test
2 qualsiasi stringa, verrà utilizzata come identificatore per gli artefatti e i risultati del test
3 comando di esecuzione del test

Test nel tarball sorgente

Test in repository esterno

Task

Ora esaminiamo una configurazione leggermente più complessa.

Supponiamo che esista un pacchetto somepackage che stiamo per testare. Per esso esiste una suite di test di integrazione, che (purtroppo) non è ancora impacchettata e si trova in un repository git separato https://somewhere/sometests.git. La suite di test ha una dipendenza da uno strumento impacchettato sometool. E nel repository di test c’è uno script run_some_tests che attiva l’esecuzione dei test.

L’obiettivo è attivare l’esecuzione della suite di test per un pacchetto.

Soluzione

Dobbiamo creare un file di configurazione tests.yml con il seguente contenuto:

rpms/somepackage.git:tests/tests.yml
---
- hosts: localhost
  roles:
    - role: standard-test-basic                        (1)
      tags:
        - classic

      required_packages:
        - sometool                                     (2)

      repositories:
        - repo: "https://somewhere/sometests.git"      (3)
          dest: "sometests"                            (4)

      tests:
        - integration_tests:                           (5)
            dir: "sometests"                           (6)
            run: "run_some_tests --all"                (7)
1 stesso ruolo di test di base come al solito
2 pacchetto aggiuntivo che deve essere installato nell’ambiente di test
3 percorso al repository git remoto
4 percorso locale in cui il repository verrà scaricato
5 qualsiasi stringa, verrà utilizzata come identificatore per gli artefatti e i risultati del test
6 stessa cartella come in <4>, contiene il repository esterno scaricato
7 comando di esecuzione del test

Domande

E se volessi eseguire non uno ma una sequenza di comandi?

Metti uno script bash nella cartella tests/scripts/ ed eseguilo dal playbook.

rpms/somepackage.git:
.
├── 0001-something.patch
├── somepackage.spec
├── sources
└── tests
    ├── scripts
    │   └── run_tests.sh      (1)
    └── tests.yml
1 il tuo scenario di test personalizzato

Configura il test dist-git per eseguire questo script:

- hosts: localhost
  roles:
  - role: standard-test-basic      (1)
    tags:
    - classic
    tests:
    - simple:
        dir: scripts               (2)
        run: ./run_tests.sh        (3)
1 stesso ruolo standard
2 passa alla sottocartella (il percorso è relativo alla cartella tests/)
3 questo è lo script di test, il suo codice di uscita è il risultato del test

Cosa c’è sotto il cofano? (Ovvero, come funziona internamente?)

Per testare la build noi:

  • scarichiamo (checkout) il repository dist-git

  • prendiamo l’ultima immagine qcow di Fedora Rawhide

  • installiamo tutti i pacchetti della build di koji su di essa

  • eseguiamo il playbook ansible definito in tests.yml

Come verifico la mia configurazione?

È possibile eseguire e debug i ruoli di test standard localmente. Ma consigliamo vivamente di utilizzare il flusso di lavoro delle pull-request per questo: crea semplicemente una pull-request e attendi che la CI reagisca ad essa.

Attiviamo quasi la stessa infrastruttura CI per il testing delle PR come quella utilizzata per la gating delle nuove build.

E non appena il risultato del test è pronto, apparirà nella pagina della pull request su Fedora Pagure

Per riavviare il test aggiungi un commento alla PR in Pagure, con il seguente contenuto: [citest]