Jak můžu pomocí GitHub Actions vytvářet pracovní postupy pro CI?
Tady se dozvíte o GitHub Actions a pracovních postupech pro CI.
Naučíte se:
- Vytvoření pracovního postupu ze šablony
- Porozumět protokolům GitHub Actions
- Testování proti více cílům
- Samostatné úlohy sestavení a testování
- Uložení a přístup k artefaktům sestavení
- Automatizace označování žádosti o přijetí změn při kontrole
Vytvoření pracovního postupu ze šablony
Pokud chcete vytvořit pracovní postup, začněte pomocí šablony. Šablona obsahuje běžné úlohy a kroky předkonfigurované pro konkrétní typ automatizace, kterou implementujete. Pokud neznáte pracovní postupy, úlohy a kroky, podívejte se na modul Automatizace úloh vývoje pomocí gitHub Actions modulu.
Na hlavní stránce úložiště vyberte kartu Akce a pak vyberte Nový pracovní postup.
Na stránce Zvolit pracovní postup si můžete vybrat z mnoha různých šablon. Jedním z příkladů je šablona Node.js, která provádí čistou instalaci závislostí uzlů, sestaví zdrojový kód a spustí testy pro různé verze Node. Dalším příkladem je šablona balíčku Pythonu, která nainstaluje závislosti Pythonu a spouští testy, včetně lintu, napříč různými verzemi Pythonu.
Do vyhledávacího pole zadejte Node.js.
Ve výsledcích hledání v podokně Node.js vyberte Konfigurovat.
Tento výchozí pracovní postup šablony Node.js uvidíte v nově vytvořeném souboru node.js.yml.
name: Node.js CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x, 16.x, 18.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci
- run: npm run build --if-present
- run: npm test
Všimněte si atributu on:
. Tento pracovní postup se aktivuje při odeslání do úložiště a při vytvoření žádosti o sloučení proti hlavní větvi.
V tomto pracovním postupu je jedna job
. Pojďme se podívat, co to dělá.
Atribut runs-on:
určuje, že pro operační systém se pracovní postup spouští na ubuntu-latest
. Atribut node-version:
určuje, že existují tři sestavení, jedna pro Node verze 14.x, 16.x a 18.x. Část matrix
popíšeme podrobněji později, když pracovní postup přizpůsobíme.
steps
v úloze používá akci GitHub Actions actions/checkout@v3 k získání kódu z vašeho úložiště do virtuálního počítače a akci actions/setup-node@v3 k nastavení správné verze Node.js. Určíme, že budeme testovat tři verze Node.js s atributem ${{ matrix.node-version }}
. Tento atribut odkazuje na matici, která jsme dříve definovali. Atribut cache
určuje správce balíčků pro ukládání do mezipaměti ve výchozím adresáři.
Poslední část tohoto kroku spouští příkazy používané Node.js projekty. Příkaz npm ci
nainstaluje závislosti ze souboru package-lock.json, npm run build --if-present
spustí skript sestavení, pokud existuje, a npm test
spustí testovací architekturu. Všimněte si, že tato šablona zahrnuje sestavení i testovací kroky ve stejné úloze.
Další informace o npm najdete v dokumentaci k npm:
Protokoly akcí pro sestavení
Když se pracovní postup spustí, vytvoří protokol, který obsahuje podrobnosti o tom, co se stalo, a případné chyby nebo selhání testů.
Pokud dojde k chybě nebo se test nezdaří, zobrazí se v protokolech červená ✖ místo zelené značky ✔. Můžete prozkoumat podrobnosti o chybě nebo selhání a zjistit, co se stalo.
V cvičení identifikujete neúspěšné testy prozkoumáním podrobností v protokolech. K protokolům se dostanete ze záložky Akce.
Přizpůsobení šablon pracovních postupů
Na začátku tohoto modulu jsme popsali scénář, ve kterém potřebujete nastavit CI pro váš tým. Šablona Node.js je skvělý začátek, ale chcete ji přizpůsobit tak, aby lépe vyhovovala požadavkům vašeho týmu. Chcete cílit na různé verze Node a různé operační systémy. Chcete také, aby kroky sestavení a testování byly samostatné úlohy.
Pojďme se podívat, jak si pracovní postup přizpůsobíte.
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
node-version: [16.x, 18.x]
Tady jsme nakonfigurovali matici sestavení pro testování v různých operačních systémech a jazykových verzích. Tato matice vytváří čtyři sestavení, jedno pro každý operační systém spárované s každou verzí Node.
Čtyři sestavení spolu se všemi jejich testy vytvářejí značné množství protokolových informací. Může být obtížné to všechno seřadit. V následující ukázce vám ukážeme, jak přesunout testovací krok do vyhrazené testovací úlohy. Tato úloha prověřuje více cílů. Oddělení kroků sestavení a testování usnadňuje pochopení protokolu.
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
node-version: [16.x, 18.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: npm install, and test
run: |
npm install
npm test
env:
CI: true
Co jsou artefakty?
Když pracovní postup vytvoří něco jiného než záznam protokolu, produkt se nazývá artefakt. Například sestavení Node.js vytvoří kontejner Dockeru, který je možné nasadit. Tento artefakt, kontejner, je možné nahrát do úložiště pomocí akce actions/upload-artifact a později stáhnout z úložiště pomocí akce actions/download-artifact.
Uložení artefaktu ho zachová mezi úlohami. Každá úloha používá novou instanci virtuálního počítače, takže artefakt nemůžete znovu použít tak, že ho uložíte na virtuální počítač. Pokud artefakt potřebujete v jiné úloze, můžete artefakt nahrát do úložiště v jedné úloze a stáhnout ho pro jinou úlohu.
Úložiště artefaktů
Artefakty se ukládají do prostoru úložiště na GitHubu. Místo je volné pro veřejná úložiště a v závislosti na účtu je některé množství zdarma pro privátní úložiště. GitHub ukládá artefakty po dobu 90 dnů.
V následujícím fragmentu kódu pracovního postupu si všimněte, že v akci actions/upload-artifact@main
existuje atribut path:
. Hodnota tohoto atributu je cesta k uložení artefaktu. Tady určíme, veřejné nebo, aby se všechno nahrálo do adresáře. Pokud bychom chtěli nahrát jenom jeden soubor, použijeme něco jako veřejné/mytext.txt.
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: npm install and build webpack
run: |
npm install
npm run build
- uses: actions/upload-artifact@main
with:
name: webpack artifacts
path: public/
Pokud chcete stáhnout artefakt pro testování, musí se sestavení úspěšně dokončit a nahrát artefakt. V následujícím kódu určíme, že testovací úloha závisí na úloze sestavení.
test:
needs: build
runs-on: ubuntu-latest
V následujícím fragmentu kódu pracovního postupu stáhneme artefakt. Teď může testovací úloha použít artefakt k testování.
steps:
- uses: actions/checkout@v3
- uses: actions/download-artifact@main
with:
name: webpack artifacts
path: public
Další informace o používání artefaktů v pracovních postupech najdete v tématu Ukládání dat pracovního postupu jako artefaktů v dokumentaci k GitHubu.
Automatizace kontrol v GitHubu pomocí pracovních postupů
Zatím jsme popsali zahájení pracovního postupu s událostmi GitHubu, jako jsou push nebo "pull request". Pracovní postup můžeme spustit také podle plánu nebo na nějaké události mimo GitHub.
Někdy chceme pracovní postup spustit až poté, co osoba provede nějakou akci. Můžeme například chtít spustit pracovní postup jenom poté, co revidujícím žádost o přijetí změn schválí. V tomto scénáři můžeme aktivovat pull-request-review
.
Další akcí, kterou můžeme provést, je přidání štítku do pull requestu (žádosti o přijetí změn). V tomto případě použijeme akci pullreminders/label-when-approved-action.
steps:
- name: Label when approved
uses: pullreminders/label-when-approved-action@main
env:
APPROVALS: "1"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ADD_LABEL: "approved"
Všimněte si bloku s názvem env:
. V tomto bloku nastavíte proměnné prostředí pro tuto akci. Můžete například nastavit počet potřebných schvalovatelů. Tady je to jedna. Ověřovací proměnná secrets.GITHUB_TOKEN
je povinná, protože akce musí provádět změny v úložišti přidáním popisku. Nakonec zadáte název popisku, který chcete přidat.
Přidání popisku může být událost, která spustí jiný pracovní postup, například sloučení. Tuto událost probereme v dalším modulu o průběžném doručování pomocí GitHub Actions.