🔨 [devops] Scripts para la publicación de crates
This commit is contained in:
parent
b4cbfc4775
commit
54cc741c1d
4 changed files with 261 additions and 0 deletions
67
.cargo/cliff.toml
Normal file
67
.cargo/cliff.toml
Normal file
|
@ -0,0 +1,67 @@
|
|||
# cliff.toml
|
||||
|
||||
[changelog]
|
||||
header = """
|
||||
# CHANGELOG
|
||||
|
||||
Este archivo documenta los cambios más relevantes realizados en cada versión. El formato está basado
|
||||
en [Keep a Changelog](https://keepachangelog.com/es-ES/1.0.0/), y las versiones se numeran siguiendo
|
||||
las reglas del [Versionado Semántico](https://semver.org/lang/es/).
|
||||
|
||||
Resume la evolución del proyecto para usuarios y colaboradores, destacando nuevas funcionalidades,
|
||||
correcciones, mejoras durante el desarrollo o cambios en la documentación. Cambios menores o
|
||||
internos pueden omitirse si no afectan al uso del proyecto.
|
||||
"""
|
||||
trim = true
|
||||
render_always = true
|
||||
|
||||
body = """
|
||||
{% if version %}
|
||||
## {{ version | trim_start_matches(pat="v") }} ({{ timestamp | date(format="%Y-%m-%d") }})
|
||||
{% else %}
|
||||
## Pendiente de publicación
|
||||
{% endif %}\
|
||||
{% set base = "https://git.cillero.es/manuelcillero/pagetop" %}\
|
||||
{% for group, commits in commits | group_by(attribute="group") %}
|
||||
### {{ group | upper_first }}
|
||||
{% for commit in commits %}
|
||||
{%- set msg = commit.message
|
||||
| split(pat="\n")
|
||||
| first
|
||||
| replace(from="✨ ", to="")
|
||||
| replace(from="🐛 ", to="")
|
||||
| replace(from="⬆️ ", to="")
|
||||
| replace(from="🚧 ", to="")
|
||||
| replace(from="♻️ ", to="")
|
||||
| replace(from="✏️ ", to="")
|
||||
| replace(from="🏷️ ", to="")
|
||||
| replace(from="🧑💻 ", to="")
|
||||
| replace(from="🍱 ", to="")
|
||||
| replace(from="📝 ", to="")
|
||||
| replace(from="💡 ", to="")
|
||||
-%}
|
||||
{% set sha7 = commit.id | truncate(length=7, end="") %}
|
||||
- {{ msg | trim }} ([{{ sha7 }}]({{ base }}/commit/{{ commit.id }}){% if commit.author.name != "Manuel Cillero" %} - {{ commit.author.name }}{% endif %})
|
||||
{% endfor %}{% endfor %}
|
||||
"""
|
||||
|
||||
[git]
|
||||
conventional_commits = false
|
||||
filter_unconventional = false
|
||||
topo_order_commits = true
|
||||
sort_commits = "oldest"
|
||||
|
||||
commit_parsers = [
|
||||
{ message = "^✨", group = "Añadido" },
|
||||
{ message = "^🐛", group = "Corregido" },
|
||||
{ message = "^🚧", group = "Cambiado" },
|
||||
{ message = "^♻️", group = "Cambiado" },
|
||||
{ message = "^✏️", group = "Cambiado" },
|
||||
{ message = "^🏷️", group = "Cambiado" },
|
||||
{ message = "^🧑💻", group = "Cambiado" },
|
||||
{ message = "^🍱", group = "Cambiado" },
|
||||
{ message = "^⬆️", group = "Dependencias" },
|
||||
{ message = "^📝", group = "Documentado" },
|
||||
{ message = "^💡", group = "Documentado" },
|
||||
{ message = "^.*", group = "Otros cambios" },
|
||||
]
|
45
.cargo/release.toml
Normal file
45
.cargo/release.toml
Normal file
|
@ -0,0 +1,45 @@
|
|||
# release.toml
|
||||
|
||||
# Etiqueta por crate: `pagetop-macros-v0.2.0`
|
||||
tag-prefix = "{{crate_name}}-v"
|
||||
|
||||
# Confirmaciones firmadas (no requeridas)
|
||||
sign-commit = false
|
||||
sign-tag = false
|
||||
|
||||
# Empuja etiquetas y commits
|
||||
push = true
|
||||
|
||||
# Publica en crates.io (puedes desactivarlo para pruebas)
|
||||
publish = true
|
||||
|
||||
# Actualiza todos los dependientes internos
|
||||
update-dependencies = true
|
||||
|
||||
# Solo permite publicar estos crates (los que forman parte del workspace)
|
||||
allow-branch = ["main"]
|
||||
consolidate-commits = false
|
||||
consolidate-pushes = true
|
||||
|
||||
# Mensaje personalizado para el commit de versión
|
||||
pre-release-commit-message = "🔖 Prepara publicación de {{crate_name}} {{version}}"
|
||||
|
||||
[workspace]
|
||||
# Lista de crates que se pueden publicar dentro del workspace
|
||||
# Puedes añadir extensiones más adelante
|
||||
allow-publish = [
|
||||
"pagetop",
|
||||
"pagetop-build",
|
||||
"pagetop-macros"
|
||||
]
|
||||
|
||||
# Opcional: ordena la publicación de dependencias internas
|
||||
publish-order = [
|
||||
"pagetop-build",
|
||||
"pagetop-macros",
|
||||
"pagetop"
|
||||
]
|
||||
|
||||
pre-release-hook = [
|
||||
"./tools/changelog.sh", "{{crate_name}}", "{{version}}", "--stage"
|
||||
]
|
101
tools/changelog.sh
Executable file
101
tools/changelog.sh
Executable file
|
@ -0,0 +1,101 @@
|
|||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Script para generar el archivo de cambios del crate indicado.
|
||||
# Uso:
|
||||
# ./tools/changelog.sh <crate> <version> [--stage]
|
||||
# Ejemplo:
|
||||
# ./tools/changelog.sh pagetop-macros 0.1.0 # Sólo genera archivo
|
||||
# ./tools/changelog.sh pagetop 0.1.0 --stage # Prepara archivo para commit
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
# Configuración
|
||||
CRATE="${1:-}"
|
||||
VERSION="${2:-}"
|
||||
STAGE="${3:-}"
|
||||
CLIFF_CONFIG=".cargo/cliff.toml"
|
||||
|
||||
# Comprobaciones
|
||||
if [[ -z "$CRATE" || -z "$VERSION" ]]; then
|
||||
echo "Usage: $0 <crate> <version> [--stage]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Dependencias
|
||||
command -v git-cliff >/dev/null || {
|
||||
echo "Error: git-cliff is not installed. Use: cargo install git-cliff"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Cambia al directorio del espacio
|
||||
cd "$(dirname "$0")/.." || exit 1
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Determina ruta del archivo y ámbito de los archivos afectados para el crate
|
||||
# ------------------------------------------------------------------------------
|
||||
case "$CRATE" in
|
||||
pagetop)
|
||||
CHANGELOG_FILE="CHANGELOG.md"
|
||||
PATH_FLAGS=(
|
||||
--exclude-path "helpers/pagetop-macros/**/*"
|
||||
--exclude-path "helpers/pagetop-build/**/*"
|
||||
)
|
||||
;;
|
||||
pagetop-macros)
|
||||
CHANGELOG_FILE="helpers/pagetop-macros/CHANGELOG.md"
|
||||
PATH_FLAGS=(--include-path "helpers/pagetop-macros/**/*")
|
||||
;;
|
||||
pagetop-build)
|
||||
CHANGELOG_FILE="helpers/pagetop-build/CHANGELOG.md"
|
||||
PATH_FLAGS=(--include-path "helpers/pagetop-build/**/*")
|
||||
;;
|
||||
*)
|
||||
echo "Error: unsupported crate '$CRATE'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Obtiene la última etiqueta del crate
|
||||
# ------------------------------------------------------------------------------
|
||||
LAST_TAG="$(git tag --list "${CRATE}-v*" --sort=-v:refname | head -n 1)"
|
||||
|
||||
if [[ -n "$LAST_TAG" ]]; then
|
||||
echo "Generating CHANGELOG for '$CRATE' from last tag '$LAST_TAG'"
|
||||
CLIFF_ARGS=(--unreleased --tag "$VERSION")
|
||||
else
|
||||
echo "Generating initial CHANGELOG for '$CRATE'"
|
||||
CLIFF_ARGS=(--tag "$VERSION")
|
||||
fi
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Genera el CHANGELOG para el crate correspondiente
|
||||
# ------------------------------------------------------------------------------
|
||||
git-cliff --config "$CLIFF_CONFIG" "${PATH_FLAGS[@]}" "${CLIFF_ARGS[@]}" -o "$CHANGELOG_FILE" -u
|
||||
echo "CHANGELOG generated at '$CHANGELOG_FILE'"
|
||||
|
||||
# Pregunta por la revisión del archivo de cambios generado
|
||||
read -p "Do you want to review the changelog before continuing? (y/n) " -n 1 -r || exit 1
|
||||
echo
|
||||
if [[ "$REPLY" =~ ^[Yy]$ ]]; then
|
||||
${EDITOR:-nano} "$CHANGELOG_FILE"
|
||||
fi
|
||||
read -p "Do you want to proceed with the release of $CRATE? (y/n) " -n 1 -r || exit 1
|
||||
echo
|
||||
if [[ ! "$REPLY" =~ ^[Yy]$ ]]; then
|
||||
echo "Aborting release process." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Si hay cambios y procede, añade al stage (cargo-release hará el commit)
|
||||
if ! git diff --quiet -- "$CHANGELOG_FILE"; then
|
||||
if [[ "$STAGE" == "--stage" ]]; then
|
||||
git add "$CHANGELOG_FILE"
|
||||
echo "Staged $CHANGELOG_FILE for commit"
|
||||
else
|
||||
echo "Changes detected in '$CHANGELOG_FILE', but not staged (no --stage flag)"
|
||||
fi
|
||||
else
|
||||
echo "No changes in '$CHANGELOG_FILE', skipping staging"
|
||||
fi
|
48
tools/release.sh
Executable file
48
tools/release.sh
Executable file
|
@ -0,0 +1,48 @@
|
|||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Script para publicar un crate individual del workspace con cargo-release.
|
||||
# Uso:
|
||||
# ./tools/release.sh <crate> [patch|minor|major] [--execute]
|
||||
# Ejemplos:
|
||||
# ./tools/release.sh pagetop-macros patch # Dry run (por defecto)
|
||||
# ./tools/release.sh pagetop minor --execute # Publicación real
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
# Configuración
|
||||
CRATE="${1:-}"
|
||||
LEVEL="${2:-patch}"
|
||||
EXECUTE="${3:-}"
|
||||
CONFIG=".cargo/release.toml"
|
||||
|
||||
# Comprobaciones
|
||||
if [[ -z "$CRATE" ]]; then
|
||||
echo "Usage: $0 <crate> [patch|minor|major] [--execute]"
|
||||
exit 1
|
||||
fi
|
||||
if [[ ! "$LEVEL" =~ ^(patch|minor|major)$ ]]; then
|
||||
echo "Error: invalid level '$LEVEL'. Use: patch, minor, or major"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Dependencias
|
||||
command -v cargo-release >/dev/null || {
|
||||
echo "Error: cargo-release is not installed. Use: cargo install cargo-release"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Cambia al directorio del espacio
|
||||
cd "$(dirname "$0")/.." || exit 1
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# DRY-RUN (por defecto) o ejecución real con --execute
|
||||
# ------------------------------------------------------------------------------
|
||||
if [[ "$EXECUTE" != "--execute" ]]; then
|
||||
echo "Running dry-run (default mode). Add --execute to publish"
|
||||
CARGO_RELEASE_CONFIG="$CONFIG" cargo release --package "$CRATE" "$LEVEL" --dry-run
|
||||
else
|
||||
echo "Releasing $CRATE ($LEVEL)…"
|
||||
CARGO_RELEASE_CONFIG="$CONFIG" cargo release --package "$CRATE" "$LEVEL" --execute
|
||||
echo "Release completed."
|
||||
fi
|
Loading…
Add table
Add a link
Reference in a new issue