Repositorio centralizado de workflows reutilizables y composite actions de GitHub Actions para el ecosistema de librerías Java de pe.edu.nova.
Estos workflows proporcionan un pipeline de CI/CD estandarizado con variantes dedicadas para Maven y Gradle KTS, lo que permite un caché de dependencias nativo y pipelines más limpios sin pasos condicionales.
| Workflow | Archivo | Descripción |
|---|---|---|
| Build y Tests (Maven) | reusable-build-maven.yml |
Compilación, lint (Checkstyle), tests y JavaDoc con Maven |
| SonarCloud (Maven) | reusable-sonarcloud-maven.yml |
Cobertura JaCoCo y análisis SonarCloud con Maven |
| Versionado Semántico (Maven) | reusable-version-bump-maven.yml |
Incremento automático de versión para proyectos Maven |
| Publicación (Maven) | reusable-publish-maven.yml |
Publicación de artefactos JAR en GitHub Packages con Maven |
| Workflow | Archivo | Descripción |
|---|---|---|
| Build y Tests (Gradle) | reusable-build-gradle.yml |
Compilación, lint (Checkstyle), tests y JavaDoc con Gradle |
| SonarCloud (Gradle) | reusable-sonarcloud-gradle.yml |
Cobertura JaCoCo y análisis SonarCloud con Gradle |
| Versionado Semántico (Gradle) | reusable-version-bump-gradle.yml |
Incremento automático de versión para proyectos Gradle |
| Publicación (Gradle) | reusable-publish-gradle.yml |
Publicación de artefactos JAR en GitHub Packages con Gradle |
| Workflow | Archivo | Descripción |
|---|---|---|
| Conventional Commits Lint | reusable-commitlint.yml |
Enforce Conventional Commits en un rango de commits |
| Release Please | reusable-release-please.yml |
Orquestador de release automático basado en release-please |
| Generador de CHANGELOG | reusable-changelog.yml |
Auto-generación de CHANGELOG.md con conventional-changelog-cli |
| Release Publish (Sprint 3) | reusable-release-publish.yml |
Publish al dispararse un tag vX.Y.Z creado por release-please |
Workflows de publish con soporte para multiples registries (GitHub Packages, Maven Central, Nexus). Todos usan la composite action nova-setup-java y soportan visibility / dry-run inputs.
| Workflow | Archivo | Descripción |
|---|---|---|
| Multi-Registry Gradle | reusable-publish-gradle-multi-registry.yml |
Publica a GitHub Packages y Maven Central en 1 run |
| Multi-Registry Maven | reusable-publish-maven-multi-registry.yml |
Publica a GitHub Packages y Maven Central en 1 run |
| Maven Central Gradle | reusable-publish-gradle-maven-central.yml |
Solo Maven Central (GPG requerido) |
| Maven Central Maven | reusable-publish-maven-maven-central.yml |
Solo Maven Central (GPG requerido) |
| Nexus Gradle | reusable-publish-gradle-nexus.yml |
Solo Nexus on-premise (GPG opcional) |
| Nexus Maven | reusable-publish-maven-nexus.yml |
Solo Nexus on-premise (GPG opcional) |
Al separar los workflows por herramienta de build, cada variante configura actions/setup-java@v4 con el parámetro cache correspondiente ('maven' o 'gradle'). Esto habilita el caché nativo de dependencias de GitHub Actions, reduciendo significativamente los tiempos de ejecución en pipelines subsecuentes.
Las composite actions de setup (nova-setup-java, nova-setup-node) extienden este patrón con caché de node_modules y gradle.properties configurable.
Composite actions reutilizables (en .github/actions/):
| Composite Action | Descripción |
|---|---|
nova-setup-java |
Setup Java 25 + cache Gradle/Maven + validación de build files |
nova-setup-node |
Setup Node.js + cache node_modules + npm ci para commitlint |
nova-setup-gpg |
Import GPG key (preparado, clave aún no generada) |
Workflow reutilizable que compila el proyecto Maven, ejecuta los tests, verifica el estilo de código con Checkstyle y genera la documentación JavaDoc.
| Parámetro | Tipo | Requerido | Default | Descripción |
|---|---|---|---|---|
java-version |
string |
no | '25' |
Versión de Java a usar |
Ninguno.
| Artefacto | Descripción |
|---|---|
test-reports |
Reportes de tests (Surefire) |
javadoc |
Documentación JavaDoc generada |
| Paso | Comando |
|---|---|
| Compilación y Tests | mvn verify |
| Lint (Checkstyle) | mvn checkstyle:check |
| JavaDoc | mvn javadoc:javadoc |
jobs:
build:
uses: <org>/nova-devops/.github/workflows/reusable-build-maven.yml@main
with:
java-version: '25'Workflow reutilizable que genera el reporte de cobertura con JaCoCo y ejecuta el análisis de calidad de código en SonarCloud para proyectos Maven.
| Parámetro | Tipo | Requerido | Default | Descripción |
|---|---|---|---|---|
java-version |
string |
no | '25' |
Versión de Java a usar |
sonar-org |
string |
sí | — | Organización en SonarCloud |
sonar-project-key |
string |
sí | — | Clave del proyecto en SonarCloud |
| Secreto | Descripción |
|---|---|
SONAR_TOKEN |
Token de autenticación de SonarCloud |
| Paso | Comando |
|---|---|
| Cobertura JaCoCo | mvn verify jacoco:report |
| Análisis SonarCloud | mvn org.sonarsource.scanner.maven:sonar-maven-plugin:sonar |
jobs:
sonar:
uses: <org>/nova-devops/.github/workflows/reusable-sonarcloud-maven.yml@main
with:
sonar-org: mi-organizacion
sonar-project-key: mi-organizacion_nova-mask-utils
secrets:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}Workflow reutilizable que determina el tipo de incremento de versión a partir de las labels del PR fusionado, calcula la nueva versión semántica, actualiza el pom.xml, crea un commit y un tag de Git.
Ninguno.
| Secreto | Descripción |
|---|---|
GH_PAT |
Token de acceso personal con permisos de push para crear commits y tags |
| Output | Descripción |
|---|---|
new-version |
La nueva versión semántica calculada (ej: 1.2.0) |
El tipo de incremento se determina por las labels del PR:
| Label del PR | Tipo de Incremento | Ejemplo |
|---|---|---|
major |
MAJOR + 1, MINOR = 0, PATCH = 0 | 1.2.3 → 2.0.0 |
minor |
MINOR + 1, PATCH = 0 | 1.2.3 → 1.3.0 |
patch |
PATCH + 1 | 1.2.3 → 1.2.4 |
| Sin label | patch por defecto |
1.2.3 → 1.2.4 |
| Paso | Comando |
|---|---|
| Leer versión actual | mvn help:evaluate -Dexpression=project.version -q -DforceStdout |
| Actualizar versión | mvn versions:set -DnewVersion=<versión> -DgenerateBackupPoms=false |
jobs:
version-bump:
uses: <org>/nova-devops/.github/workflows/reusable-version-bump-maven.yml@main
secrets:
GH_PAT: ${{ secrets.GH_PAT }}Workflow reutilizable que publica el artefacto JAR de la librería Maven en GitHub Packages. Soporta visibility configurable (public/private) y dry-run.
| Parámetro | Tipo | Requerido | Default | Descripción |
|---|---|---|---|---|
java-version |
string |
no | '25' |
Versión de Java a usar |
visibility |
string |
no | vars.NOVA_PACKAGE_VISIBILITY o 'public' |
Visibilidad del paquete (public / private) |
dry-run |
string |
no | 'false' |
Si es 'true', hace deploy a file:///tmp/maven-dry-run |
| Secreto | Descripción |
|---|---|
GITHUB_TOKEN |
Token para autenticarse con GitHub Packages |
| Paso | Comando |
|---|---|
| Publicación | mvn deploy -DskipTests -Dvisibility=$VISIBILITY |
- Usa la composite action
nova-setup-java(sprint 1) que validapom.xmly configura caché de Maven. - Valida que la visibilidad del paquete sea compatible con la visibilidad del repo.
- Genera
~/.m2/settings.xmlcon la credencial de GitHub Packages.
El pom.xml debe incluir la sección distributionManagement:
<distributionManagement>
<repository>
<id>github</id>
<name>GitHub Packages</name>
<url>https://maven.pkg.github.com/OWNER/nombre-repositorio</url>
</repository>
</distributionManagement>jobs:
publish:
needs: version-bump
uses: <org>/nova-devops/.github/workflows/reusable-publish-maven.yml@main
secrets:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}Workflow reutilizable que compila el proyecto Gradle, ejecuta los tests, verifica el estilo de código con Checkstyle y genera la documentación JavaDoc.
| Parámetro | Tipo | Requerido | Default | Descripción |
|---|---|---|---|---|
java-version |
string |
no | '25' |
Versión de Java a usar |
Ninguno.
| Artefacto | Descripción |
|---|---|
test-reports |
Reportes de tests (HTML) |
javadoc |
Documentación JavaDoc generada |
| Paso | Comando |
|---|---|
| Compilación y Tests | ./gradlew build |
| Lint (Checkstyle) | ./gradlew checkstyleMain checkstyleTest |
| JavaDoc | ./gradlew javadoc |
jobs:
build:
uses: <org>/nova-devops/.github/workflows/reusable-build-gradle.yml@mainWorkflow reutilizable que genera el reporte de cobertura con JaCoCo y ejecuta el análisis de calidad de código en SonarCloud para proyectos Gradle.
| Parámetro | Tipo | Requerido | Default | Descripción |
|---|---|---|---|---|
java-version |
string |
no | '25' |
Versión de Java a usar |
sonar-org |
string |
sí | — | Organización en SonarCloud |
sonar-project-key |
string |
sí | — | Clave del proyecto en SonarCloud |
| Secreto | Descripción |
|---|---|
SONAR_TOKEN |
Token de autenticación de SonarCloud |
| Paso | Comando |
|---|---|
| Cobertura JaCoCo | ./gradlew build jacocoTestReport |
| Análisis SonarCloud | ./gradlew sonar |
jobs:
sonar:
uses: <org>/nova-devops/.github/workflows/reusable-sonarcloud-gradle.yml@main
with:
sonar-org: mi-organizacion
sonar-project-key: mi-organizacion_nova-date-utils
secrets:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}Workflow reutilizable que determina el tipo de incremento de versión a partir de las labels del PR fusionado, calcula la nueva versión semántica, actualiza el build.gradle.kts, crea un commit y un tag de Git.
Ninguno.
| Secreto | Descripción |
|---|---|
GH_PAT |
Token de acceso personal con permisos de push para crear commits y tags |
| Output | Descripción |
|---|---|
new-version |
La nueva versión semántica calculada (ej: 1.2.0) |
El tipo de incremento se determina por las labels del PR:
| Label del PR | Tipo de Incremento | Ejemplo |
|---|---|---|
major |
MAJOR + 1, MINOR = 0, PATCH = 0 | 1.2.3 → 2.0.0 |
minor |
MINOR + 1, PATCH = 0 | 1.2.3 → 1.3.0 |
patch |
PATCH + 1 | 1.2.3 → 1.2.4 |
| Sin label | patch por defecto |
1.2.3 → 1.2.4 |
| Paso | Comando |
|---|---|
| Leer versión actual | grep/sed sobre build.gradle.kts |
| Actualizar versión | sed sobre build.gradle.kts |
jobs:
version-bump:
uses: <org>/nova-devops/.github/workflows/reusable-version-bump-gradle.yml@main
secrets:
GH_PAT: ${{ secrets.GH_PAT }}Workflow reutilizable que publica el artefacto JAR de la librería Gradle en GitHub Packages. Soporta visibility configurable (public/private) y dry-run.
| Parámetro | Tipo | Requerido | Default | Descripción |
|---|---|---|---|---|
java-version |
string |
no | '25' |
Versión de Java a usar |
visibility |
string |
no | vars.NOVA_PACKAGE_VISIBILITY o 'public' |
Visibilidad del paquete (public / private) |
dry-run |
string |
no | 'false' |
Si es 'true', usa gradle publishToMavenLocal |
| Secreto | Descripción |
|---|---|
GITHUB_TOKEN |
Token para autenticarse con GitHub Packages |
| Paso | Comando |
|---|---|
| Publicación | ./gradlew publish -Pvisibility=$VISIBILITY |
| Dry-run | ./gradlew publishToMavenLocal -Pvisibility=$VISIBILITY |
- Usa la composite action
nova-setup-java(sprint 1) que validagradle.propertiesy configuragradle/actions/setup-gradle@v4. - Valida que la visibilidad del paquete sea compatible con la visibilidad del repo.
- La propiedad Gradle
-Pvisibility=$VISIBILITYpermite que elbuild.gradle.ktsajuste la configuracion segun la visibilidad.
El build.gradle.kts debe incluir el bloque publishing:
publishing {
publications {
create<MavenPublication>("mavenJava") {
from(components["java"])
}
}
repositories {
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/OWNER/nombre-repositorio")
credentials {
username = System.getenv("GITHUB_ACTOR")
password = System.getenv("GITHUB_TOKEN")
}
}
}
}jobs:
publish:
needs: version-bump
uses: <org>/nova-devops/.github/workflows/reusable-publish-gradle.yml@main
secrets:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}Workflow reutilizable que publica una libreria Gradle a GitHub Packages y Maven Central en una sola ejecucion. Salta Maven Central si no se proporcionan las credenciales (MAVEN_USERNAME + MAVEN_TOKEN).
| Parametro | Tipo | Requerido | Default | Descripcion |
|---|---|---|---|---|
java-version |
string |
no | '25' |
Version de Java |
visibility |
string |
no | vars.NOVA_PACKAGE_VISIBILITY o 'public' |
Visibilidad para GitHub Packages |
dry-run |
string |
no | 'false' |
Si es 'true', usa gradle publishDryRun |
gpg-key-id |
string |
no | '' |
Fingerprint GPG (pasado como input) |
gpg-key |
string |
no | '' |
Clave privada GPG (pasada como input) |
gpg-password |
string |
no | '' |
Passphrase GPG (opcional) |
| Secreto | Requerido | Descripcion |
|---|---|---|
GITHUB_TOKEN |
si | Para autenticarse con GitHub Packages |
MAVEN_USERNAME |
no | Sonatype OSSRH username (sin el, salta Maven Central) |
MAVEN_TOKEN |
no | Sonatype OSSRH token (sin el, salta Maven Central) |
- Usa
nova-setup-java(composite action) ynova-setup-gpgconfail-on-missing='false'. - Detecta automaticamente si hay credenciales de Maven Central y decide a cual(es) registry(s) publicar.
- Para que funcione end-to-end, el
build.gradle.ktsdebe tener publications/repositories configurados para cada target.
Igual al #12 pero para proyectos Maven. Publica a GitHub Packages y Maven Central. Genera ~/.m2/settings.xml automaticamente con las credenciales de ambos.
Igual que #12.
| Secreto | Requerido | Descripcion |
|---|---|---|
GITHUB_TOKEN |
si | Para autenticarse con GitHub Packages |
MAVEN_USERNAME |
no | Sonatype OSSRH username (sin el, salta Maven Central) |
MAVEN_TOKEN |
no | Sonatype OSSRH token (sin el, salta Maven Central) |
- El
pom.xmldebe tener profiles separados (github-publish,maven-central-publish) para cada registry.
Workflow reutilizable que publica solo a Maven Central (Sonatype OSSRH). GPG es REQUERIDO (firma obligatoria de Maven Central).
| Parametro | Tipo | Requerido | Default | Descripcion |
|---|---|---|---|---|
java-version |
string |
no | '25' |
Version de Java |
gpg-key-id |
string |
si | — | Fingerprint GPG |
gpg-key |
string |
si | — | Clave privada GPG ASCII-armored |
gpg-password |
string |
no | '' |
Passphrase GPG |
dry-run |
string |
no | 'false' |
Si es 'true', usa --dry-run |
| Secreto | Descripcion |
|---|---|
MAVEN_USERNAME |
Sonatype OSSRH username |
MAVEN_TOKEN |
Sonatype OSSRH token |
- Usa
nova-setup-gpgconfail-on-missing='true'(falla si no hay clave). - Prereq (NOVA-SEMVER-14): crear el namespace
pe.edu.novaen Sonatype OSSRH. - Prereq (NOVA-SEMVER-29): generar la clave GPG real (backlog).
Igual al #14 pero para proyectos Maven. Genera settings.xml con la credencial de Sonatype.
Igual que #14.
Igual que #14.
- El
pom.xmldebe tener un profilemaven-central-publishconfigurado.
Workflow reutilizable que publica a un Nexus on-premise. GPG opcional (depende de la politica del Nexus).
| Parametro | Tipo | Requerido | Default | Descripcion |
|---|---|---|---|---|
java-version |
string |
no | '25' |
Version de Java |
nexus-url |
string |
si | — | URL base del Nexus (ej: https://nexus.example.com) |
nexus-repository |
string |
si | — | Nombre del repo (ej: nova-releases, nova-snapshots) |
gpg-key-id |
string |
no | '' |
Fingerprint GPG (opcional) |
gpg-key |
string |
no | '' |
Clave GPG (opcional) |
gpg-password |
string |
no | '' |
Passphrase GPG |
dry-run |
string |
no | 'false' |
Si es 'true', usa --dry-run |
| Secreto | Descripcion |
|---|---|
NEXUS_USERNAME |
Nexus username |
NEXUS_PASSWORD |
Nexus password o token |
- El
build.gradle.ktsdebe tener unaMavenPublicationllamadanovacon unmaven { url = ... }repository configurable vianexus.urlynexus.repositoryGradle properties.
Igual al #16 pero para proyectos Maven. Genera settings.xml con la credencial de Nexus.
Igual que #16.
Igual que #16.
- El
pom.xmldebe tener un profilenexus-publishcon<distributionManagement>configurable vianexus.urlynexus.repositorysystem properties.
Workflow reutilizable que se ejecuta al hacer push de un tag vX.Y.Z (formato semver estricto). Suplanta el antiguo par version-bump + publish con una cadena determinista de un solo paso.
on: workflow_call(llamado desdepublish-on-tag.yml).- El workflow llamador debe configurarse con
on: push: tags: ['v[0-9]+.[0-9]+.[0-9]+'].
- Validate tag format: verifica que el tag cumpla
^v[0-9]+\.[0-9]+\.[0-9]+$. - Sync version from tag to gradle.properties: escribe
version=<version-sin-v>engradle.properties. - Nova Setup Java: composite action con Java 25 + caché Gradle.
- Resolve package visibility: prioridad
input > vars.NOVA_PACKAGE_VISIBILITY > "public". - Validate visibility compatibility: rechaza combinaciones inválidas (public repo + private package).
- Publish to GitHub Packages:
./gradlew publish -Pvisibility=....
Antes (NO recomendado):
publish:
if: github.event_name == 'push'
needs: version-bump
uses: ahincho/nova-devops/.github/workflows/reusable-publish-gradle.yml@mainAhora:
# publish-on-tag.yml
on:
push:
tags: ['v[0-9]+.[0-9]+.[0-9]+']
jobs:
publish:
uses: ahincho/nova-devops/.github/workflows/reusable-release-publish.yml@main
secrets: inherit- Este workflow deprecó
reusable-version-bump-{gradle,maven}.ymlyreusable-publish-{gradle,maven}.ymlpara el flujo de release. Estos quedan como legacy para migraciones graduales pero no se usan en los repos migrados a Sprint 3.
A continuación se muestra un ejemplo completo de un workflow llamador que orquesta todos los workflows reutilizables. Este archivo se coloca en cada repositorio de librería en .github/workflows/ci.yml.
Flujo de release oficial (a partir de Sprint 3 — NOVA-SEMVER-13): el versionado se delega a
release-please, que crea un PR con el bump propuesto y, al hacer merge, genera un tagvX.Y.Z. El tag dispara el publish. El push directo amainya no bumpea versión.
.github/
workflows/
ci.yml # PR + build + sonar
release-please.yml # push a main → PR de release
publish-on-tag.yml # tag vX.Y.Z → publish
.release-please-config.json
.release-please-manifest.json
name: CI/CD Pipeline
on:
pull_request:
branches: [main]
types: [opened, synchronize, reopened]
push:
branches: [main]
jobs:
build:
if: github.event_name == 'pull_request'
uses: ahincho/nova-devops/.github/workflows/reusable-build-gradle.yml@main
secrets: inherit
sonar:
if: github.event_name == 'pull_request'
uses: ahincho/nova-devops/.github/workflows/reusable-sonarcloud-gradle.yml@main
with:
sonar-org: ahincho
sonar-project-key: ahincho_nova-java-spring-boot-<nombre-corto>
secrets: inheritname: Release Please
on:
push:
branches: [main]
jobs:
release-please:
uses: ahincho/nova-devops/.github/workflows/reusable-release-please.yml@main
secrets:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}name: Publish on Tag
on:
push:
tags: ['v[0-9]+.[0-9]+.[0-9]+']
jobs:
publish:
uses: ahincho/nova-devops/.github/workflows/reusable-release-publish.yml@main
secrets: inherit{
"packages": {
".": {
"package-name": "nova-java-spring-boot-<nombre-corto>",
"release-type": "java",
"bump-minor-pre-major": true,
"bump-patch-for-minor-pre-major": true,
"draft": false,
"prerelease": false
}
}
}{
".": "0.1.0"
}El manifest se actualiza automáticamente en cada release PR. Inicialmente contiene la versión de partida (
0.1.0).
Si tu ci.yml actual tiene la estructura version-bump + publish con needs:, debes:
- Eliminar
version-bumpypublishdeci.yml. - Crear
release-please.ymlypublish-on-tag.yml. - Crear
.release-please-config.jsony.release-please-manifest.json. - Hacer commit + push.
- A partir de ahí, cada push a
maindispararelease-please. Cuando cree un PR, mergearlo → tag + release + publish automático.
| Librería | Repositorio | Build Tool | Sonar Project Key |
|---|---|---|---|
| mask-utils | nova-mask-utils |
Maven | <org>_nova-mask-utils |
| api-standard | nova-api-standard |
Gradle KTS | <org>_nova-api-standard |
| date-utils | nova-date-utils |
Gradle KTS | <org>_nova-date-utils |
| mapper-utils | nova-mapper-utils |
Gradle KTS | <org>_nova-mapper-utils |
Cada repositorio de librería debe tener configurados los siguientes secretos (los marcados como opcional solo se requieren si se usa el workflow que los consume):
| Secreto | Usado por | Descripción |
|---|---|---|
SONAR_TOKEN |
reusable-sonarcloud-maven.yml / reusable-sonarcloud-gradle.yml |
Token de autenticación de SonarCloud |
GH_PAT |
reusable-version-bump-maven.yml / reusable-version-bump-gradle.yml |
Token de acceso personal con permisos de push |
GITHUB_TOKEN |
reusable-publish-maven.yml / reusable-publish-gradle.yml / reusable-publish-{...}-multi-registry.yml / reusable-release-please.yml |
Token automático de GitHub (disponible por defecto) |
MAVEN_USERNAME (opcional) |
reusable-publish-{...}-multi-registry.yml / reusable-publish-{...}-maven-central.yml |
Sonatype OSSRH username (requerido para Maven Central) |
MAVEN_TOKEN (opcional) |
reusable-publish-{...}-multi-registry.yml / reusable-publish-{...}-maven-central.yml |
Sonatype OSSRH token (requerido para Maven Central) |
NEXUS_USERNAME (opcional) |
reusable-publish-{...}-nexus.yml |
Nexus username (solo para on-premise) |
NEXUS_PASSWORD (opcional) |
reusable-publish-{...}-nexus.yml |
Nexus password o token (solo para on-premise) |
GPG_SIGNING_KEY_ID (opcional) |
workflows que publican a Maven Central | Fingerprint de la clave GPG (pasado como input a nova-setup-gpg) |
GPG_SIGNING_KEY (opcional) |
workflows que publican a Maven Central | Clave privada GPG ASCII-armored |
GPG_SIGNING_PASSWORD (opcional) |
workflows que publican a Maven Central | Passphrase de la clave GPG |
| Variable | Usado por | Default | Descripción |
|---|---|---|---|
NOVA_PACKAGE_VISIBILITY |
reusable-publish-{gradle,maven}.yml |
'public' |
Visibilidad por defecto del paquete (puede ser sobreescrita por el input visibility del workflow) |
Workflow reutilizable que valida que los mensajes de commit en un rango sigan el estándar Conventional Commits usando commitlint con la config @commitlint/config-conventional.
| Parámetro | Tipo | Requerido | Default | Descripción |
|---|---|---|---|---|
base-ref |
string |
sí | — | SHA, branch o tag base (ej: main o un SHA) |
head-ref |
string |
no | HEAD |
SHA, branch o tag head |
node-version |
string |
no | '20' |
Versión de Node.js |
config-file |
string |
no | 'commitlint.config.js' |
Path al config de commitlint |
Ninguno obligatorio. GH_TOKEN opcional para feedback en PR.
# .github/workflows/commitlint.yml (en cada repo)
name: Commitlint
on:
pull_request:
branches: [main]
types: [opened, synchronize, reopened]
jobs:
commitlint:
uses: ahincho/nova-devops/.github/workflows/reusable-commitlint.yml@main
with:
base-ref: ${{ github.event.pull_request.base.sha }}
head-ref: ${{ github.event.pull_request.head.sha }}- Usa la composite action
nova-setup-nodeque cacheanode_modulesy ejecutanpm ci. - Falla con exit code 1 si algún commit no cumple la convención.
- El
verbosemode muestra qué regla falló por commit.
Workflow reutilizable que ejecuta release-please de Google para automatizar releases basados en Conventional Commits. Crea PRs de release que bumpean la versión, actualizan CHANGELOG.md, y al mergear crean GitHub Releases + tags.
| Parámetro | Tipo | Requerido | Default | Descripción |
|---|---|---|---|---|
release-type |
string |
no | 'java' |
Tipo de release: java, gradle, maven, python, node, go, rust, php, ruby, elixir |
package-name |
string |
no | repo name | Nombre del paquete (para multi-package repos) |
config-file |
string |
no | '.release-please-config.json' |
Path al config de release-please |
manifest-file |
string |
no | '' |
Path al manifest (para multi-repo coordination) |
node-version |
string |
no | '20' |
Versión de Node.js |
target-branch |
string |
no | 'main' |
Branch target para los PRs de release |
| Secreto | Descripción |
|---|---|
GH_TOKEN |
Token con permisos contents:write y pull-requests:write |
Cada repo Java debe tener su propio config:
{
"packages": {
".": {
"release-type": "java",
"package-name": "nova-java-spring-boot-mask-utils",
"bump-minor-pre-major": true,
"bump-patch-for-minor-pre-major": true
}
}
}# .github/workflows/release-please.yml (en cada repo)
name: Release Please
on:
push:
branches: [main]
permissions:
contents: write
pull-requests: write
jobs:
release-please:
uses: ahincho/nova-devops/.github/workflows/reusable-release-please.yml@main
secrets:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}- No usa
nova-setup-nodeporquegoogleapis/release-please-action@v4trae su propio setup de Node. - Compatible con manifest mode para multi-repo coordination (un repo coordina releases de varios).
- Ver
docs/06-semantic-versioning-en-java.mdsección 8.6 para más detalles.
Workflow reutilizable que genera CHANGELOG.md desde el historial de commits usando conventional-changelog-cli. Útil como fallback para proyectos que aún no usan release-please o para regenerar el changelog manualmente.
| Parámetro | Tipo | Requerido | Default | Descripción |
|---|---|---|---|---|
from-ref |
string |
no | '' |
SHA/branch/tag inicial (vacío = desde el inicio del proyecto) |
to-ref |
string |
no | 'HEAD' |
SHA/branch/tag final |
output-file |
string |
no | 'CHANGELOG.md' |
Path del archivo de salida |
preset |
string |
no | 'angular' |
Preset de conventional-changelog (angular, standard, conventionalcommits) |
node-version |
string |
no | '20' |
Versión de Node.js |
commit-changes |
string |
no | 'false' |
Si es 'true', hace commit + push del CHANGELOG (solo workflow_dispatch) |
Ninguno obligatorio (necesita contents:write solo si commit-changes='true').
# .github/workflows/changelog.yml (en cada repo)
name: Generate Changelog
on:
workflow_dispatch: # ejecucion manual
push:
branches: [main]
paths-ignore: ['CHANGELOG.md']
jobs:
changelog:
uses: ahincho/nova-devops/.github/workflows/reusable-changelog.yml@main
with:
preset: angular
commit-changes: 'true'- Usa la composite action
nova-setup-nodepara cache + install. - Instala
conventional-changelog-cliyconventional-changelog-config-specconnpm install --no-save. - Sube el CHANGELOG.md generado como artifact
changelog. - Si
commit-changes='true'y el archivo cambió, hace commit automático congithub-actions[bot].
Las composite actions se invocan desde los reusable workflows o directamente desde workflows llamadores. Se referencian con la sintaxis:
- uses: ahincho/nova-devops/.github/actions/<nombre>@<ref>Donde <ref> puede ser main (para desarrollo) o un tag SemVer (ej: v1.0.0) para releases inmutables.
Setup de Java con caché de Gradle/Maven siguiendo convenciones de Nova.
Inputs:
| Input | Default | Descripción |
|---|---|---|
java-version |
'25' |
Versión de Java |
build-tool |
'gradle' |
Build tool: maven o gradle |
distribution |
'temurin' |
Distribución JDK |
Pasos internos:
actions/setup-java@v4concache: gradle|mavensegúnbuild-tool.- Validación: falla si no existe ni
gradle.propertiesnipom.xml. gradle/actions/setup-gradle@v4(solo sibuild-tool=gradle) concache-read-onlyen PRs.
Ejemplo:
- uses: ahincho/nova-devops/.github/actions/nova-setup-java@v1
with:
java-version: '25'
build-tool: gradleSetup de Node.js con caché de node_modules e instalación de dependencias.
Inputs:
| Input | Default | Descripción |
|---|---|---|
node-version |
'20' |
Versión de Node.js |
package-manager |
'npm' |
Package manager: npm, pnpm, yarn |
cache-key-prefix |
'' |
Prefijo para la key del cache (útil en monorepos) |
Pasos internos:
actions/setup-node@v4.actions/cache@v4paranode_modulesy.npm.npm ci(si haypackage-lock.json) onpm install.
Ejemplo:
- uses: ahincho/nova-devops/.github/actions/nova-setup-node@v1
with:
node-version: '20'Import de clave GPG para firma de artefactos (preparado, clave aún no generada — ver docs/06-semantic-versioning-en-java.md sección 10.3).
Aclaración técnica: las composite actions NO tienen acceso a
secrets.*de GitHub Actions. Los secrets deben pasarse comoinputsdesde el workflow que invoca la action.
Inputs:
| Input | Default | Descripción |
|---|---|---|
gpg-signing-key-id |
'' |
Fingerprint de la clave GPG |
gpg-signing-key |
'' |
Clave privada ASCII-armored (pasada como input) |
gpg-signing-password |
'' |
Passphrase (si aplica) |
fail-on-missing |
'false' |
Si es true, falla cuando los inputs están vacíos |
Outputs:
| Output | Descripción |
|---|---|
gpg-key-imported |
true/false — si la clave fue importada |
gpg-key-skipped |
true/false — si se saltó la configuración |
Uso desde un reusable workflow (que SÍ tiene acceso a secrets):
steps:
- uses: ahincho/nova-devops/.github/actions/nova-setup-gpg@v1
with:
gpg-signing-key-id: ${{ secrets.GPG_SIGNING_KEY_ID }}
gpg-signing-key: ${{ secrets.GPG_SIGNING_KEY }}
gpg-signing-password: ${{ secrets.GPG_SIGNING_PASSWORD }}
fail-on-missing: 'true' # obligatorio para Maven CentralComportamiento por defecto (fail-on-missing='false'): si los inputs están vacíos, emite un ::notice:: y continúa sin error. Esto permite que el mismo workflow reusable funcione tanto para GitHub Packages (sin GPG) como para Maven Central (con GPG).
Las composite actions siguen el mismo patrón SemVer que las librerías Java:
v1.0.0— primera versión estable- Breaking changes en la API de inputs/outputs → bump major
- Nuevos inputs opcionales → bump minor
- Bugfixes internos → bump patch
Hasta que se genere el primer tag, se pueden referenciar con @main (HEAD) o @<commit-sha> (inmutable).