Semantic Release¶
Overview¶
El objetivo principal de este apartado es enseñar cómo usar correctamente semantic-release
.
¿Qué es Semantic-Release?¶
Semantic-Release es una herramienta de gestión de versiones y lanzamientos automatizados que sigue los principios de Semantic Versioning (SemVer). Su objetivo es simplificar el proceso de lanzamiento de software al automatizar el incremento de números de versión y la generación de notas de lanzamiento basadas en los commits realizados en un repositorio.
Principios de Semantic Versioning (SemVer)¶
Semantic Versioning es un sistema para asignar números de versión a software que sigue una estructura específica:
MAJOR.MINOR.PATCH: La versión se compone de tres partes principales.
MAJOR: Incrementar el número mayor indica cambios incompatibles con la librería o proyecto.
MINOR: Incrementar el número menor indica la adición de funcionalidad compatible con versiones anteriores.
PATCH: Incrementar el número de parche indica correcciones de errores compatibles con versiones anteriores.
Conventional Commits¶
Para el uso correcto de los Conventional Commits y ejemplos de los mismos, así como su estructura, pueden dirigirse a Conventional Commits que se encuentra en la sección GitOps
de la documentación.
Como implementar semantic-release en net 6¶
Para implementar semantic-release en nuestro proyecto debemos crear el archivo release.yml
dentro de la ruta /.github/workflows
y agregar el siguiente código:
name: Build
on:
push:
branches:
- main
- beta
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
# to allow bypass branch restrictions
token: ${{ secrets.ARQUITECTURA_DEPLOY }}
- uses: architecture-it/actions@release-dotnet
with:
github_username: ${{ secrets.ARQUITECTURA_USER }}
github_token: ${{ secrets.ARQUITECTURA_DEPLOY }}
branches: '["main", { name: "beta", prerelease: "beta" }]'
.csproj
:
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PackageId>ProjectName</PackageId>
<Version>1.0.0</Version>
<IsPackable>true</IsPackable>
<PackageProjectUrl>UrlRepo</PackageProjectUrl>
<RepositoryUrl>UrlRepo</RepositoryUrl>
<PropertyGroup>
Esta acción se dispara cuando se realiza un push a la rama main
o beta
(nuestra rama de prerelease) y a su vez llama a una acción que tenemos publicada en el repositorio architecture-it/actions
. Esta acción primero verifica si tenemos o no Conventional Commits
y determina el tipo de cambio que se debe realizar en la versión, en base a los commits. En caso afirmativo, crea un release de nuestro proyecto y luego crea y publica el NuGet con la misma versión del release.
Warning
Con semantic-release no es necesario tocar la versión del proyecto manualmente, ya que se encarga del manejo correcto de versiones en base a nuestros commits
Como crear un prerelease¶
Para crear un prerelease debemos crear un pull request de la rama que contenga los cambios a nuestra rama beta
utilizando Conventional Commits
. En base a esto, se creará y publicará una versión x.x.x-beta.1
de nuestro proyecto.
Warning
Una vez que trabajamos con un prerelease, no importa el tipo de Conventional Commit
que se realice, solo se incrementará el número detrás de beta
(1.0.0-beta.x). Por ejemplo, si estamos en la versión 1.0.0-beta.1
, entonces pasará a ser 1.0.0-beta.2
.
Warning
Siempre debemos trabajar creando nuevas ramas a partir de beta
, Sin embargo, cuando queremos crear un nuevo prerelease, debemos merguear la ultima versión de main
en la rama que estemos trabajando antes de crear un pull request hacia beta
, de lo contrario se generan problemas de versiones.
Como crear un release¶
Para crear un release basta con utilizar los conventionals commits y crear un pull request hacia main
desde la rama que contiene los nuevos cambios.
Crear un release a partir de un prerelease¶
Para pasar de una versión beta
a una estable, solo debemos hacer un pull request desde la rama beta
hacia main
y semantic-release se encargará del resto.
Para obtener más información sobre semantic-release
, puedes dirigirte a Semantic-Release.