Aquests apunts recullen diferents exemples d'automatitzacions en projectes de naturalesa diversa,
per a mostrar com es combinen les opcions de GitHub Actions en casos reals.
Publicació d'un lloc web estàtic generat amb ProperDocs a GitHub Pages¶
Exemple en el repositori d'aquesta documentació: curs-git
L'automatització següent permet generar aquest lloc web amb ProperDocs
i publicar-lo a GitHub Pages.
S'executa sempre que es publiquen canvis nous en la branca main, i també es pot executar manualment.
Els passos que la componen són els següents:
Compila el lloc web estàtic amb ProperDocs.
Copia els fitxers del repositori amb l'acció predefinida actions/checkout.
Instal·la les dependències necessàries per a executar ProperDocs.
Compila el lloc web amb l'ordre properdocs build.
Emmagatzema el directori amb la documentació generada (site/) com a artefacte per a la tasca
següent, amb l'acció predefinida actions/upload-pages-artifact.
Publica el lloc web a GitHub Pages.
Només s'executa si la tasca anterior ha acabat correctament.
Publica l'artefacte generat en la tasca anterior amb l'acció predefinida actions/deploy-pages.
.github/workflows/deploy.yml
name:deploy# Nom de l'automatitzacióon:# Events que disparen l'automatitzaciópush:branches:-main# Quan es fa un push a la branca mainworkflow_dispatch:permissions:# Permisos que es concedeixen a l'automatitzaciócontents:readpages:writeid-token:writeconcurrency:group:github-pagescancel-in-progress:truejobs:# Llista de tasques a executarbuild:# Nom de la tascaruns-on:ubuntu-latest# Sistema operatiu on s'executarà la tascasteps:# Passos a executar-uses:actions/checkout@v6# Acció per clonar i còpiar el repositori a l'entorn d'execuciówith:fetch-depth:0-uses:actions/setup-python@v6# Acció per configurar Pythonwith:python-version:3.xcache:'pip'-name:Install dependencies# Acció per instal·lar les dependènciesrun:pip install -r requirements.txt-name:Build# Acció per compilar la documentaciórun:properdocs build --clean-name:Upload static files as artifact# Acció per pujar els fitxers estàtics com a artefacteuses:actions/upload-pages-artifact@v5with:path:./site/# Ruta dels fitxers estàtics generats per MkDocsdeploy:# Nom de la tascaenvironment:name:github-pagesurl:${{ steps.deployment.outputs.page_url }}runs-on:ubuntu-latest# Sistema operatiu on s'executarà la tascaneeds:build# Aquesta tasca depèn de la tasca "build"steps:# Passos a executar-name:Deploy to GitHub Pages# Acció per desplegar a GitHub Pagesid:deploymentuses:actions/deploy-pages@v5
Exemple en el repositori d'aquesta documentació: curs-git
Aquest flux de treball comprova l'ortografia de la documentació del repositori
amb el programa pyspelling. S'executa quan es crea una Pull Request sobre la branca main
o quan es marca com a llesta per a revisió.
El flux de treball es compon de dues tasques. S'ha dividit d'aquesta manera perquè la correcció ortogràfica
només s'execute quan s'han modificat fitxers de documentació i no es faça innecessàriament
quan es modifiquen altres fitxers.
changed-files: comprova si cal fer la correcció ortogràfica.
Comprova si s'han modificat fitxers de documentació (*.md) respecte de la branca main.
Emmagatzema el resultat en la variable EXIST_CHANGED_FILES.
spellcheck: en cas afirmatiu, comprova l'ortografia dels fitxers modificats.
Només s'executa si needs.changed-files.outputs.EXIST_CHANGED_FILES == 1.
Instal·la les dependències.
Descarrega els diccionaris necessaris.
Executa la correcció ortogràfica amb pyspelling.
.github/workflows/spellcheck.yml
name:spellcheck# Nom de l'automatitzacióon:# Events que disparen l'automatitzaciópull_request:# Tipus d'events sobre la pull requesttypes:['opened','edited','reopened','synchronize','ready_for_review']branches:-'main'# Quan s'obri un pull request a la branca 'main'jobs:# Llista de tasques a executarchanged-files:# Nom de la tascaif:github.event.pull_request.draft == false# Condició per executar la tascaruns-on:ubuntu-latest# Sistema operatiu on s'executarà la tascaoutputs:EXIST_CHANGED_FILES:${{ steps.get-changed-files.outputs.EXIST_CHANGED_FILES }}steps:# Passos a executar-uses:actions/checkout@v4# Acció per clonar i còpiar el repositori a l'entorn d'execuciówith:fetch-depth:0-name:Get changed filesid:get-changed-filesrun:|CHANGED_FILES=$(git diff --name-only origin/main HEAD | grep 'docs/.*\.md$' || true)EXIST_CHANGED_FILES=0if [ -n "$CHANGED_FILES" ]; thenEXIST_CHANGED_FILES=1fiecho "EXIST_CHANGED_FILES=$EXIST_CHANGED_FILES" >> $GITHUB_OUTPUTspellcheck:# Nom de la tascaneeds:changed-files# Tasca que s'executarà abansif:github.event.pull_request.draft == false && needs.changed-files.outputs.EXIST_CHANGED_FILES == '1'# Condició per executar la tascaruns-on:ubuntu-latest# Sistema operatiu on s'executarà la tascaenv:# Variables d'entornDICPATH:.hunspell/CHANGED_FILES:${{ needs.changed-files.outputs.CHANGED_FILES }}steps:# Passos a executar-uses:actions/checkout@v4# Acció per clonar i còpiar el repositori a l'entorn d'execuciówith:fetch-depth:0-uses:actions/setup-python@v5# Acció per configurar Pythonwith:python-version:3.xcache:'pip'-name:Install dependencies# Acció per instal·lar les dependènciesrun:pip install -U -r requirements.txt-name:Install pyspelling# Acció per instal·lar el paquet pyspellingrun:pip install pyspelling-name:Install hunspell# Acció per instal·lar el corrector ortogràfic hunspellrun:|sudo apt updatesudo apt install hunspell -y-name:Build documents# Acció per compilar la documentaciórun:CI=false properdocs build --clean-name:Download dictionary# Acció per descarregar el diccionari que s'utilitzarà en el corrector ortogràficrun:|mkdir -p .hunspellcurl -L https://raw.githubusercontent.com/Softcatala/catalan-dict-tools/refs/heads/master/resultats/hunspell/catalan-valencia.dic -o .hunspell/ca_ES_valencia.diccurl -L https://raw.githubusercontent.com/Softcatala/catalan-dict-tools/refs/heads/master/resultats/hunspell/catalan-valencia.aff -o .hunspell/ca_ES_valencia.affhunspell -D-name:Spell check# Acció per comprovar l'ortografia dels documentsrun:|CHANGED_FILES=$(git diff --name-only origin/main HEAD | grep 'docs/.*\.md$' | sed 's/\/index//' | sed 's/docs/site/' | sed 's/.md$/\/index.html/')echo "CHANGED_FILES=$CHANGED_FILES"for FILE in $(echo "$CHANGED_FILES"); doif [ -f $FILE ]; thenSOURCES="$SOURCES -S $FILE"fidoneecho "SOURCES=$SOURCES"if [ -z "$SOURCES" ]; thenecho "No files to check"exit 0fiSPELL_ARGS="$SPELL_ARGS --name docs $SOURCES"pyspelling $SPELL_ARGS
Execució de proves unitàries i d'integració en un projecte Java amb Maven¶
En els commits posteriors, una vegada marcada la Pull Request com a llesta per a revisió,
sí que s'han executat les proves.
Aquest flux de treball s'executa cada vegada que es publiquen canvis en la branca main
o quan es crea o s'actualitza una pull request cap a les branques main o dev.
Es basa en dues tasques:
unit-tests: executa les proves unitàries del projecte.
Configura l'entorn amb JDK 21.
Executa les proves unitàries amb l'ordre mvn test.
integration-tests: executa les proves d'integració del projecte.
Només s'executa si la tasca unit-tests ha acabat correctament.
Configura l'entorn amb JDK 21.
Executa les proves d'integració amb l'ordre mvn verify, sense tornar a executar les proves unitàries.
.github/workflows/tests.yml
name:Testson:pull_request:branches:-dev-maintypes:[opened,synchronize,reopened,ready_for_review]jobs:unit-tests:name:Tests Unitarisruns-on:ubuntu-latest# Evitar executar en PR en draftif:github.event.pull_request.draft == falsesteps:-name:Checkout del codiuses:actions/checkout@v4-name:Configurar Java 21uses:actions/setup-java@v4with:java-version:'21'distribution:'temurin'cache:'maven'-name:Executar tests unitarisrun:mvn clean testintegration-tests:name:Tests d'Integracióruns-on:ubuntu-latestneeds:unit-testsif:github.event.pull_request.draft == falsesteps:-name:Checkout del codiuses:actions/checkout@v4-name:Configurar Java 21uses:actions/setup-java@v4with:java-version:'21'distribution:'temurin'cache:'maven'-name:Executar tests d'integraciórun:mvn clean verify -Dskip.unit.tests=true
pom.xml
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.2</version><relativePath/></parent><groupId>com.example</groupId><artifactId>task-management-api</artifactId><version>1.0.0</version><name>TaskManagementAPI</name><description>SpringBootRESTAPIforTaskManagement</description><properties><java.version>21</java.version><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><skip.unit.tests>false</skip.unit.tests></properties><dependencies><!-- Spring Boot Web Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Data JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- H2 Database --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><!-- Spring Boot Validation --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><!-- Spring Boot DevTools (optional) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><!-- Spring Boot Test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!-- Surefire Plugin for Unit Tests --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><skip>${skip.unit.tests}</skip><argLine>-XX:+EnableDynamicAgentLoading</argLine><includes><include>**/*Test.java</include></includes><excludes><exclude>**/*IT.java</exclude></excludes></configuration></plugin><!-- Failsafe Plugin for Integration Tests --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-failsafe-plugin</artifactId><configuration><argLine>-XX:+EnableDynamicAgentLoading</argLine><includes><include>**/*IT.java</include></includes></configuration><executions><execution><goals><goal>integration-test</goal><goal>verify</goal></goals></execution></executions></plugin></plugins></build></project>
Aquest flux de treball compila i publica les distribucions d'un paquet de Python
a PyPI cada vegada que es publica una etiqueta (tag) nova en el repositori.
name:Publish Python 🐍 distributions 📦 to PyPIon:push:tags:-"*"jobs:build-n-publish:runs-on:ubuntu-latestname:Build and publish Python 🐍 distributions 📦 to PyPIenvironment:name:pypiurl:https://pypi.org/p/mkdocs-data-pluginpermissions:id-token:write# IMPORTANT: this permission is mandatory for trusted publishingsteps:-name:Set up Python 3uses:actions/checkout@v6-name:Set up Python 3uses:actions/setup-python@v6with:python-version:3.x-name:Install pypa/buildrun:>-python -mpip installbuild--user-name:Build a binary wheel and a source tarballrun:>-python -mbuild--sdist--wheel--outdir dist/-name:Publish package distributions to PyPIuses:pypa/gh-action-pypi-publish@release/v1
Aquest flux de treball s'executa cada vegada que es publica en el repositori una etiqueta
nova amb el format v*.*.*. També es pot executar manualment, ja que està configurat amb workflow_dispatch.
Consisteix en una única tasca que fa els passos següents:
Copia el repositori en l'entorn d'execució amb l'acció predefinida actions/checkout.