Ez a dokumentum elmagyarázza, hogyan állíts be folyamatos integrációs (CI) munkafolyamatokat egy Exercism nyelvi kurzushoz GitHub Actions (GHA) segítségével. Bevált gyakorlatokat és példákat kínál, amelyeket felhasználva gyors, megbízható és robusztus CI-munkafolyamatokat készíthetsz magadnak. Az ebben a mappában található GHA-munkafolyamatok bármilyen CI-rendszerhez igazíthatók, mert az alapstruktúra ugyanaz marad.
Ez a következőket teszi:
Ezen munkafolyamat-fájlok példaimplementációja megtalálható az exercism/javascript repóban.
A dokumentum hátralévő része azt hivatott elmagyarázni, hogyan működnek a munkafolyamatok. Ha sietsz, és csak át szeretnél állni a Travisről vagy a Circle-ről GHA-ra anélkül, hogy optimalizálnád a PR-szkripteket, nézd meg a ~10 perces útmutatónkat a Travisról való átállásról.
A következő műveleteket ajánljuk annak ellenőrzésére, hogy a repód tartalma sértetlen-e:
configlet lintelés a config.json ellenőrzéséhezv3 új fájlokat igényel; ez lehet, hogy átkerül a configlet-be)Lehetnek kurzusspecifikus műveletek is. Például:
És talán szeretnél még néhány kényelmi ellenőrzést, például:
Minden műveletnél gondold át, milyen gyakran kell lefutnia.
configlet lintelés annyira fontos (mert egy kurzus eltörhet, ha a config.json eltörik), hogy valószínűleg mindig le kell futnia, de csak egyszer kell lefutnia commitonként.Nagyon hasznos lehet, ha a lefuttatandó műveleteket helyben is elérhetővé teszed. Ez azt jelenti, hogy a tényleges munkát végző szkripteket kézzel is futtathatod. Ehhez ne ágyazd be a műveletet a munkafolyamat-fájlokba, hanem hozz létre egy önálló szkriptet. Például a csonkok ellenőrzése teljesen megoldható bashben a munkafolyamat-fájlon belül, de itt az a javaslat, hogy inkább hozz létre egy új futtatható szkriptet scripts/ci-check néven.
„De a parancs nagyon rövid, pl.
eslint . --ext ts --ext tsx”.Amikor ezt a parancsot frissíteni kell, most minden helyen frissíteni kell: a dokumentációban, a munkafolyamat-fájlokban és a karbantartók fejében. Ha ezt egy szkriptbe emeled ki, mindez megoldódik. Egy munkafolyamat-fájl elolvasása is nagyon ijesztő tud lenni.
A scripts/pr és scripts/pr-check szkriptek (lásd sablonok) több argumentummal futnak, eggyel minden olyan fájlhoz, amelyet ebben a PR-ben módosítottak vagy hozzáadtak. Például ha a two-fer frissült, a hívás így nézhet ki:
scripts/pr exercises/two-fer/README.md exercises/two-fer/.meta/example.ext
Ajánlott minden műveletet a megváltozott feladatra futtatni, nem a megváltozott fájlra. Ez azért van, mert egy fájl módosítása valószínűleg az egész feladat változásait kiváltja (gondolj a konfigurációra, a csomagokra).
Nem áll készen? / Bonyolult?
Mielőtt bevezetnéd ezt az optimalizálást, nyugodtan figyelmen kívül hagyhatod! Az átállási útmutató utal rá, hogy későbbi szakaszban érdemes hozzáadni. Ha a bemeneti argumentumokat figyelmen kívül hagyod, minden ellenőrzés lefut az összes feladatra. Ez teljesen rendben van. Csak tovább tart.
Ha a kurzusnak egyetlen „legfelső szintű” függőségi fájlja és/vagy más konfigurációs fájljai vannak, adj hozzá egy integritás lépést (amely a scripts/sync vagy bin/sync mellett létezik, és amely az összes konfigurációs fájlt átmásolná az összes feladatba), amely biztosítja, hogy a legfelső szintű vagy alapfájlok ugyanazok legyenek, mint amit a feladatkönyvtárakba másoltak. Így a függőségek frissíthetők, szinkronizálhatók a repóban, és biztosíthatjuk, hogy minden feladat ugyanazzal a konfigurációval rendelkezik.
Ennek gyakori módja egy ellenőrzőösszeg használata. Az Ubuntu (és több más Linux-disztribúció) tartalmaz egy sha1sum nevű eszközt, de bármelyik módszer működik, amellyel a konfigurációs fájlt hashelted vagy ellenőrzőösszeg-értékké alakítod (md5, sha1, crc32):
$ sha1sum README.md
cd58091c5043bf21f00d39ff1740d8b2976deeff *README.md
Ha a kurzus olyan további munkafolyamatokat használ, amelyek hozzáférést igényelnek a GitHub tokenhez vagy más titkokhoz, ajánlott a munkafolyamatban használt összes műveletet egy adott commithez rögzíteni. Részletekért lásd a GitHub biztonsági megerősítési útmutatóját.
Például:
- uses: julia-actions/setup-julia@v1
+ uses: julia-actions/setup-julia@d26d1111976eae5f00db04f0515ab744ec9cd79e # 1.3.1
Ha a tooling rendelkezik lockfile-okkal a függőségek kezeléséhez, fontold meg, hogy beleteszed a repóba, és „frozen lockfile”-t használsz a munkafolyamat-fájlokban. Például: npm ci, yarn install --frozen-lockfile és bundle install --frozen. Ez biztosítja, hogy a lockfile naprakész legyen a függőségek módosításakor, és megakadályozza, hogy rosszindulatú csomagok kerüljenek be.
Ebben a könyvtárban legalább a következő sablonok találhatók:
configlet.yml: Ez a munkafolyamat letölti a legfrissebb configlet binárist, és linteli ezt a repót. Minden commiton lefut. PR-eknél a tényleges commiton és egy „merge utáni” fán fut.ci.yml: Ez a munkafolyamat csak a main ágon fut, minden commiton egyszer.
pr.ci.yml: Ez a munkafolyamat csak PR-eken fut, minden commiton egyszer.
A nem PR-hez tartozó munkafolyamatok workflow_dispatch segítségével is elindíthatók.
Minden fájl tetején fel van sorolva, hogy mely „szkripteknek” kell elérhetőnek lenniük. Ha ezeket binárisokként szeretnéd, cseréld le a scripts/xxx-et bin/xxx-re. Néhány tooling megköveteli, hogy a binárisok egy bin mappában legyenek.
scripts/ci: egy szkript, amelynek az összes feladatot buildelnie és tesztelnie kell a példamegoldásokkal a tesztek ellenébenscripts/ci-check: egy szkript, amelynek az összes feladatot lintelnie kell, és opcionálisan ellenőriznie kell a csonkokat, a konfiguráció integritását és egyebeketscripts/pr: ugyanaz, mint a scripts/ci, de csak azokat a feladatokat futtatja, amelyeket a bemenetként megadott útvonalakból feloldscripts/pr-check: ugyanaz, mint a scripts/ci-check, de csak azokra a fájlokra vagy feladatokra fut, amelyeket a bemenetként megadott útvonalakból feloldHa bármilyen problémába ütközöl, vagy szeretnéd, hogy valaki átnézze a munkafolyamataidat, pingeld meg a @exercism/github-actions csapatot.
Módosítottál egy legfelső szintű fájlt, amelynek CI-futtatást kellene kiváltania az összes feladatra
A jelen írás pillanatában a pr.ci.yml csak „kiterjesztés” szerinti tesztelést tesz lehetővé. Ideális esetben ezt frissítenék, hogy mindig elinduljon, amikor bizonyos fájlok megváltoznak (például a tesztek futtatásához használt bináris). Ezek a változtatások azonban gyakran ritkák, és karbantartók végzik őket, így valószínűleg elég biztonságos, hogy a ci.yml a main ágon mindig, mindenre lefut.
Létrehoztál egy scripts/xxx fájlt Windowson, és most nem működik {other OS} alatt
Alapértelmezés szerint a Windowson létrehozott fájlok git-index bejegyzésében nem szerepel metaadat a futtathatóságukról, mert a Windows jogosultsági modellje más. A Git alapértelmezés szerint a git-index metaadatait használja annak meghatározására, hogy a fájlnak futtathatónak kell-e lennie a POSIX-alapú rendszereken, és így a scripts/xxx fájlt NEM teszi futtathatóvá.
git update-index --chmod=+x scripts/xxx
git commit -m "Make scripts/xxx executable"