Ek het 'n redelike lang ervaring met GitHub-werkstrome, maar nie tot die punt waar ek kan beweer ek is 'n kenner. Wat is GitHub werkstrome? 'N Werkstroom is 'n konfigurerbare outomatiese proses wat een of meer take sal uitvoer. Werkstroom word gedefinieer deur 'n YAML-lêer wat in jou repository ingeskryf word en sal uitgevoer word wanneer dit deur 'n gebeurtenis in jou repository veroorsaak word, of hulle kan handmatig of op 'n gedefinieerde skedule veroorsaak word. Werkstrome word gedefinieer in die .github/werkstrome directory in 'n repository. 'N repository kan verskeie werkstrome hê, wat elkeen 'n ander stel take kan uitvoer, soos: Bouw en toets trek versoekings Deploying your application every time a release is created Voeg 'n etiket toe elke keer as 'n nuwe uitgawe geopen word • Oor werkstrome a Workflows word gedefinieer deur 'n YAML-lêer wat in jou repository gekyk word en sal uitgevoer word wanneer dit deur 'n gebeurtenis in jou repository veroorsaak word, of hulle kan handmatig of op 'n gedefinieerde skedule veroorsaak word. workflow Werkstrome word gedefinieer in die .github/werkstrome directory in 'n repository. 'N repository kan verskeie werkstrome hê, wat elkeen 'n ander stel take kan uitvoer, soos: Bouw en toets trek versoekings Die implementering van jou aansoek elke keer as 'n vrylating geskep word Voeg 'n etiket toe elke keer as 'n nuwe uitgawe geopen word - die Oor werkstrome As gevolg hiervan is 'n werkstroom vergelykbaar met 'n Jenkins-werk, wat in YAML in plaas van XML geïmplementeer word. , in teenstelling met 'n oorlewende Jenkins-werkkonfigurasie. Dit lyk nie veel nie, maar dit laat toe om broncodebeheerbenaderings te gebruik, insluitend versieer en terugval. Jare gelede het ek vir 'n kliënt gewerk waarvan die DevOps-span 'n Puppet-gebaseerde benadering geïmplementeer het om Jenkins-werkplekke te herbou sodat die Puppet-konfigurasie in Git kan gestoor word. stored inside the code repository Let daarop dat GitHub redelik laat was vir die party. Voordat dit werkstrome implementeer het, het ek 'n derde-party-diens genaamd Ek het hoofsaaklik oorgeskakel omdat Travis betaal is en sekondêr omdat werkstrome natief deel van GitHub is. Travis die Die tip: Hulle word genoem GitHub aksies is heeltemal anders. Use the correct semantics GitHub werkstrome GitHub aksies GitHub-werkstrome bestaan uit wat self bestaan uit die Stappe van verwysing 'n paar optionele parameters, insluitend 'n naam. Werkplek Stappe loop jobs: metrics: runs-on: my-image #1 steps: - name: Install dependencies via Poetry #2 run: poetry install #3 OCI beeld waarop die werkstroom hardloop Stap naam Stap bevel GitHub-aksieë is herbruikbare komponente wat alternatiewe bied vir die herhaal van dieselfde bevel oor en oor. 'N Aksie is 'n vooraf gedefinieerde, herbruikbare stel take of kode wat spesifieke take in 'n werkstroom uitvoer, wat die hoeveelheid herhalende kode verminder wat u in u werkstroomlêers skryf. Verwyder jou Git repository van GitHub Skep die korrekte gereedskapsketting vir jou bouomgewing Authentificering vir jou wolkverskaffer Jy kan jou eie optrede skryf, of jy kan optrede vind om te gebruik in jou werkstrome in die GitHub Marketplace. Byvoorbeeld, in plaas van git checkout uit te voer, kan jy die checkout aksie gebruik. GitHub aksies 'N Aksie is 'n vooraf gedefinieerde, herbruikbare stel take of kode wat spesifieke take in 'n werkstroom uitvoer, wat die hoeveelheid herhalende kode verminder wat u in u werkstroomlêers skryf. Verwyder jou Git repository van GitHub Skep die korrekte gereedskapsketting vir jou bouomgewing Authentificering vir jou wolkverskaffer Jy kan jou eie optrede skryf, of jy kan optrede vind om te gebruik in jou werkstrome in die GitHub Marketplace. Byvoorbeeld, in plaas van git checkout uit te voer, kan jy die checkout aksie gebruik. - die GitHub aksies jobs: metrics: runs-on: my-image steps: - uses: actions/checkout@v5 #1 with: #2 fetch-depth: 0 submodules: recursive Verwys na 'n GitHub aksie Aktiewe parameters Ek is 'n groot fan van nie die wiel opnieuw uitvind nie. GitHub-aksie speel daarin 'n groot rol. Die tip: indien moontlik. Prefer GitHub Actions over ad-hoc commands Kies die regte aksie Die GitHub Marketplace gehostes Aksies word opgelys deur kategorieë. Jy kan filter deur die tipe van die skepper en sorter deur gewildheid. Baie aksies Wanneer jy 'n aksie kies, moet jy dieselfde sorg uitoefen as wanneer jy enige ander verslawing inbring. Vendor: prefer verified creators License type: Open Source vs. closed source. With the former, check the exact terms; the Apache v2 license is very different from the GPL one. Pricing for commercial actions Check the source code repository of actions that display it and check the following information: ** Inception date ** Activity, including the repartition of commits per committer, the number of open issues, the mean time for fixing issues, etc. ** Documentation (reference material, tutorials, how-to guides, and explanations) Community, if any Support Die tip: Be as careful in choosing a GitHub Action as in choosing any other dependency. Ken jou optrede Soos die vorige tip, kom hierdie een uit 'n meer algemene een - ek praat uit ervaring. Ek het 'n werkstroom ontwikkel om 'n Java-toepassing te pak. Ek het die werkstroom swaar gebruik, en die werk moes die afhankings by elke hardloop aflaai. jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - uses: actions/setup-java@v4 #1 with: distribution: temurin java-version: 21 - uses: actions/cache@v4 #2 with: path: ~/.m2/repository #3 key: ${{ platform }}-maven--${{ hashFiles('**/pom.xml') }} #4 restore-keys: | ${{ runner.os }}-maven- #4 Installeer die JDK Skep 'n cache. Die cache is generiese en kan lêers oor hardloop cache. Cache die plaaslike Maven repository Cache afhanklikhede. Die sleutel gebruik die runner OS, wat nie verander nie, en die POM se hash. Maar toe ek die dokumentasie gelees het, het ek besef ek kan dieselfde op 'n veel eenvoudiger manier bereik: Die aksie het 'n ingeboude funksionaliteit vir die caching en herstel van afhanklikhede. Dit gebruik 'n toolkit/cache onder hood vir die caching van afhanklikhede, maar vereis minder konfigurasie instellings. Ondersteunde pakketbestuurders is gradle, maven en sbt. Die formaat van die gebruikte cache sleutel is setup-java-${plattform }}-${ packageManager }}-${ fileHash }}, waar die hash gebaseer is op die volgende lêers: MAVEN: * / POM.xml Caching pakket afhanklikhede Die aksie het 'n ingeboude funksionaliteit vir die cache en herstel van afhanklikhede. Dit gebruik die toolkit / cache onder hoed vir die cache van afhanklikhede, maar vereis minder konfigurasie instellings. Ondersteunde pakketbestuurders is gradle, maven en sbt. Die formaat van die gebruikte cache sleutel is , waar die hash gebaseer is op die volgende lêers: setup-java-${{ platform }}-${{ packageManager }}-${{ fileHash }} MAVEN: * / POM.xml - die Caching pakket afhanklikhede So, ek het die bovenstaande snippet vervang met die volgende: jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - uses: actions/setup-java@v4 with: distribution: temurin java-version: 21 cache: maven #1 Dit is die Die tip: Om 'n uur op die dokumentasie te spandeer, kan jou help om man-days van moeite te bespaar. Thoroughly read the documentation of actions. Pin jou afhanklikheid weergawe Hierdie afdeling neem ook algemene advies en toepas dit op die GitHub-werkstrome-versie.U vind weergawes op ten minste twee plekke: die OCI-beeld en die GitHub Actions-versie. Miskien het jy die in die vorige snippets. op die oomblik van hierdie skryf, dit dui op Met verloop van tyd sal dit na die nuutste weergawe, met verskillende biblioteke se weergawes, wys. Dit kan 'n mislukking veroorsaak tydens die werkstroom, of erger, verander die uitvoer op maniere wat jy nie sal sien totdat dit te laat is nie. [Al die beskikbare beelde] runs-on: ubuntu-latest ubuntu-24.04 https://github.com/actions/runner-images Die versie van aksie werk anders, aangesien hulle na 'n GitHub-repo-verwysing dui: 'n tag of 'n kompromie SHA. Terwyl die OCI-beeld in GitHub se hande is, is die aksie die verantwoordelikheid van sy verskaffer. Dit beteken dat enigeen met kompromie-regte die inhoud van 'n onderliggende tag kan verander. Pin vir 'n komitee must jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@08c6903 #1 Pin na 'n spesifieke commit 💡 Tip: Neem veiligheid ernstig en pin actions to a specific commit. Gebruik die werkverslag Elkeen van jou werkstroom stappe sal waarskynlik baie logboeke uitvoer. In 'n gereelde werkstroom kan die algehele hoeveelheid logstreke baie groot wees. Sommige van hulle kan nuttig wees, sommige van hulle mag nie wees nie, maar omdat daar slegs 'n standaarduitvoer en standaardfout is, eindig alles op dieselfde plek. , die aantal toetse loop of die persentasie van kode dekking, in die geval jy nie hierdie data elders stuur nie. GitHub maak dit eenvoudig om die data wat jy wil by te voeg in die werkverslag. Ek het g. U kan werkversameling gebruik om unieke inhoud, soos toetsresultaatversameling, te wys en te groepeer, sodat iemand wat die resultaat van 'n werkstroomloop bekyk, nie nodig het om na die logboeke te gaan om belangrike inligting te sien wat verband hou met die loop, soos mislukkings. Job samestellings ondersteun GitHub smaak Markdown, en jy kan jou Markdown inhoud vir 'n stap by die GITHUB_STEP_SUMMARY omgewing lêer. Voeg 'n werkopsomming by U kan werkversameling gebruik om unieke inhoud, soos toetsresultaatversameling, te wys en te groepeer, sodat iemand wat die resultaat van 'n werkstroomloop bekyk, nie nodig het om na die logboeke te gaan om belangrike inligting te sien wat verband hou met die loop, soos mislukkings. Job samestellings ondersteun GitHub smaak Markdown, en jy kan jou Markdown inhoud vir 'n stap by die GITHUB_STEP_SUMMARY omgewing lêer. - die Voeg 'n werkverslag Hier is 'n van Apache Arrow: die monster - name: Show inputs run: | echo "upload_artifacts: ${{ inputs.upload_artifacts }}" >> $GITHUB_STEP_SUMMARY echo "schedule: ${{ github.event.schedule }}" >> $GITHUB_STEP_SUMMARY echo "ref: ${{ github.ref }}" >> $GITHUB_STEP_SUMMARY die Ek is: Die resultate Die tip: Om die ontwikkelaar se ervaring te verbeter. Use GitHub job summary Begrip van die lewenscyklus van werkstrome Werkstrome voer sekere stappe uit. 'N mislukte stap annuleer al die oorblywende stappe, en die werkstroom eindig in 'n In die voorbeeld hierbo beteken dit dat ons geen toetsopsomming sal kry as enige van die volgende stappe misluk nie. Die voorwaarde. Failure if U kan die volgende statuskontrole-funksie gebruik as uitdrukkings in as voorwaardelike. 'n Standaardstatuskontrole van sukses() word toegepas, tensy u een van hierdie funksies insluit. • Status verifikasie funksies U kan die volgende statuskontrole-funksie gebruik as uitdrukkings in as voorwaardelike. 'n Standaardstatuskontrole van sukses() word toegepas, tensy u een van hierdie funksies insluit. - die Status verifikasie funksies GitHub gebruik standaard, maar opsies sluit in die en . success() always() cancelled() failure() - name: Show inputs if: ${{ always() }} #1 run: | echo "upload_artifacts: ${{ inputs.upload_artifacts }}" >> $GITHUB_STEP_SUMMARY echo "schedule: ${{ github.event.schedule }}" >> $GITHUB_STEP_SUMMARY echo "ref: ${{ github.ref }}" >> $GITHUB_STEP_SUMMARY Voer altyd die stap uit, ongeag of die vorige stappe suksesvol was of nie. Stel nou die volgende volgorde voor: - name: Step that may fail run: whatever - name: Execute unit tests run: ./mvnw -B test #1 - name: Test Summary if: ${{ always() }} uses: test-summary/action@31493c7 #2 Running unit tests genereer ook JUnit-verslae Gebruik die gegenereerde JUnit-verslae om 'n stapverslag te skryf As die eerste stap misluk, die opsomming uitvoer ongeag of toetse uitgevoer is of nie. As hulle nie, sou dit misluk. Om dit te vermy, moet ons die toestand verder verfyn sodat die opsomming stap slegs loop as die eenheid toets stap gedoen het. - name: Step that may fail run: whatever - name: Execute unit tests id: test #1 run: ./mvnw -B test - name: Test Summary if: ${{ always() && steps.test.conclusion == 'success'}} #2 uses: test-summary/action@31493c7 Skep die stap se ID Run slegs as die toets stap suksesvol loop Dit is net 'n eenvoudige voorbeeld, maar dit bied interessante opsies. Die tip: En gebruik dit vir jou voordeel. Know workflows' lifecycle Lokale toets Baie organisasies handhaaf streng GitHub reëls. Die mees algemene een is dat jy nie kan dryf om : Elke komitee moet deur 'n trekverzoek gaan. Terwyl dit sin maak vir gevestigde projekte, voorkom dit dat projekte vinnig begin, terwyl die komitee geskiedenis bewaar word. master Kom die akte projek: “Dink globaal, optree plaaslik” Voer jou GitHub-aktiwiteite plaaslik uit! Waarom wil jy dit doen? - Rather than having to commit/push every time you want to test out the changes you are making to your files (or for any changes to embedded GitHub actions), you can use act to run the actions locally. The environment variables and filesystem are all configured to match what GitHub provides. Fast Feedback .github/workflows/ - I love make. However, I also hate repeating myself. With , you can use the GitHub Actions defined in your to replace your ! Local Task Runner act .github/workflows/ Makefile • Inleiding tot die optrede “Dink globaal, optree plaaslik” Voer jou GitHub-aktiwiteite plaaslik uit! Waarom wil jy dit doen? Vinnig Feedback - In plaas daarvan om elke keer dat jy wil om te toets uit die veranderinge wat jy maak aan jou .github/werkstrome/ lêers (of vir enige veranderinge aan ingebedde GitHub aksie), kan jy gebruik om die aksie plaaslik uit te voer. Lokale Task Runner - Ek hou daarvan om te maak. Maar ek haat ook om myself te herhaal. Met aksie, kan jy die GitHub-aksie gebruik wat in jou .github/workflows/ gedefinieer is om jou Makefile te vervang! • Inleiding tot die optrede het 'n GitHub CLI-integrasie wat die werkstroom volgens die korrekte gebeurtenis veroorsaak. act gh act push Hier is die uitvoer wanneer die beelde en aksies reeds afgelaai is: INFO[0000] Using docker host 'unix:///var/run/docker.sock', and daemon socket 'unix:///var/run/docker.sock' [workflow.yml/test] ⭐ Run Set up job [workflow.yml/test] 🚀 Start image=catthehacker/ubuntu:act-22.04 [workflow.yml/test] 🐳 docker pull image=catthehacker/ubuntu:act-22.04 platform= username= forcePull=true [workflow.yml/test] 🐳 docker create image=catthehacker/ubuntu:act-22.04 platform= entrypoint=["tail" "-f" "/dev/null"] cmd=[] network="host" [workflow.yml/test] 🐳 docker run image=catthehacker/ubuntu:act-22.04 platform= entrypoint=["tail" "-f" "/dev/null"] cmd=[] network="host" [workflow.yml/test] 🐳 docker exec cmd=[node --no-warnings -e console.log(process.execPath)] user= workdir= [workflow.yml/test] ✅ Success - Set up job [workflow.yml/test] ☁ git clone 'https://github.com/actions/setup-java' # ref=v4 [workflow.yml/test] ⭐ Run Main actions/checkout@v4 [workflow.yml/test] 🐳 docker cp src=/Users/nico/projects/act-sample/. dst=/Users/nico/projects/act-sample [workflow.yml/test] ✅ Success - Main actions/checkout@v4 [9.211777902s] [workflow.yml/test] ⭐ Run Main Setup JDK [workflow.yml/test] 🐳 docker cp src=/home/nico/.cache/act/actions-setup-java@v4/ dst=/var/run/act/actions/actions-setup-java@v4/ [workflow.yml/test] 🐳 docker exec cmd=[/opt/acttoolcache/node/18.20.8/x64/bin/node /var/run/act/actions/actions-setup-java@v4/dist/setup/index.js] user= workdir= [workflow.yml/test] ❓ ::group::Installed distributions | Resolved Java 21.0.8+9.0.LTS from tool-cache | Setting Java 21.0.8+9.0.LTS as the default | Creating toolchains.xml for JDK version 21 from temurin | Writing to /root/.m2/toolchains.xml | | Java configuration: | Distribution: temurin | Version: 21.0.8+9.0.LTS | Path: /opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/21.0.8-9.0.LTS/x64 | [workflow.yml/test] ❓ ::endgroup:: [workflow.yml/test] ❓ add-matcher /run/act/actions/actions-setup-java@v4/.github/java.json | Creating settings.xml with server-id: github | Writing to /root/.m2/settings.xml [workflow.yml/test] ⚙ *** | Cache Size: ~50 MB (52710428 B) | [command]/usr/bin/tar -xf /tmp/c8ef4803-85c1-4867-ac2d-442dbce79755/cache.tzst -P -C /Users/nico/projects/act-sample --use-compress-program unzstd | Cache restored successfully | Cache restored from key: setup-java-linux-x64-maven-ef0e54e9035c18b60db7ea0af5e2f0c4cc5445dd6a2a2a672b91e14f14e7e4c2 [workflow.yml/test] ✅ Success - Main Setup JDK [2.514565962s] [workflow.yml/test] ⚙ ::set-env:: JAVA_HOME=/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/21.0.8-9.0.LTS/x64 [workflow.yml/test] ⚙ ::set-env:: JAVA_HOME_21_X64=/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/21.0.8-9.0.LTS/x64 [workflow.yml/test] ⚙ ::set-output:: distribution=Temurin-Hotspot [workflow.yml/test] ⚙ ::set-output:: path=/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/21.0.8-9.0.LTS/x64 [workflow.yml/test] ⚙ ::set-output:: version=21.0.8+9.0.LTS [workflow.yml/test] ⚙ ::set-output:: cache-hit=false [workflow.yml/test] ⚙ ::add-path:: /opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/21.0.8-9.0.LTS/x64/bin [workflow.yml/test] ⭐ Run Main Run "fast" tests [workflow.yml/test] 🐳 docker exec cmd=[bash -e /var/run/act/workflow/2] user= workdir= | [INFO] Scanning for projects... | [INFO] | [INFO] ----< ch.frankel.blog:act-sample >----- | [INFO] Building act-sample 1.0-SNAPSHOT | [INFO] from pom.xml | [INFO] ------------------------[ jar ]------------------------- | [INFO] | [INFO] --- resources:3.3.1:resources (default-resources) @ act-sample --- | [INFO] Copying 1 resource from src/main/resources to target/classes | [INFO] | [INFO] --- compiler:3.14.0:compile (default-compile) @ act-sample --- | [INFO] Recompiling the module because of changed source code. | [INFO] Compiling 5 source files with javac [debug target 21] to target/classes | [INFO] | [INFO] --- resources:3.3.1:testResources (default-testResources) @ act-sample --- | [INFO] Copying 2 resources from src/test/resources to target/test-classes | [INFO] | [INFO] --- compiler:3.14.0:testCompile (default-testCompile) @ act-sample --- | [INFO] Recompiling the module because of changed dependency. | [INFO] Compiling 1 source file with javac [debug target 21] to target/test-classes | [INFO] | [INFO] --- surefire:3.2.5:test (default-test) @ act-sample --- | [INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider | [INFO] | [INFO] ------------------------------------------ | [INFO] T E S T S | [INFO] ------------------------------------------ | [INFO] Running ch.frankel.blog.ActSampleTest | [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.120 s -- in ch.frankel.blog.ActSampleTest | [INFO] | [INFO] Results: | [INFO] | [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 | [INFO] | [INFO] ------------------------------------------------------ | [INFO] BUILD SUCCESS | [INFO] ------------------------------------------------------ | [INFO] Total time: 3.318 s | [INFO] Finished at: 2025-08-22T10:26:29Z | [INFO] ------------------------------------------------------ [workflow.yml/test] ✅ Success - Main Run "fast" tests [20.920776212s] [workflow.yml/test] ⭐ Run Post Setup JDK [workflow.yml/test] 🐳 docker exec cmd=[/opt/acttoolcache/node/18.20.8/x64/bin/node /var/run/act/actions/actions-setup-java@v4/dist/cleanup/index.js] user= workdir= | [command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /Users/nico/projects/act-sample --files-from manifest.txt --use-compress-program zstdmt | Cache Size: ~50 MB (52701753 B) | Cache saved successfully | Cache saved with the key: setup-java-Linux-x64-maven-ef0e54e9035c18b60db7ea0af5e2f0c4cc5445dd6a2a2a672b91e14f14e7e4c2 [workflow.yml/test] ✅ Success - Post Setup JDK [1.01412383s] [workflow.yml/test] ⭐ Run Complete job [workflow.yml/test] Cleaning up container for job test [workflow.yml/test] ✅ Success - Complete job [workflow.yml/test] 🏁 Job succeeded Ek kan 'n paar poste op Ek sal jou laat die dokumentasie lees. act Die tip: Verminder die tyd van jou feedback siklus. Test your workflows locally Samenvatting Gebruik die korrekte semantiek, onderskei tussen werkstrome en aksie. Verkies GitHub-aksie oor ad-hoc bevele. Wees net so versigtig in die keuse van 'n GitHub-aksie as in die keuse van enige ander afhanklikheid. Lees die dokumentasie van elke aksie wat jy gebruik. Pin aksies na 'n spesifieke commit. Gebruik GitHub-werkopsomming om die ontwikkelingservaring te verbeter. Ken die lewenscyklus van werkstrome. Testeer jou werkstrome lokaal. To go further: Oor werkstrome GitHub aksies GitHub Aktiewe Markte Runner foto's Voeg 'n werkverslag Status verifikasie funksies Inleiding tot akte