Release please et le plaisir de l'automatisation
Tags: sre, devops, programming, github
Published: 2023-02-24 16:58:01


Cela fait un moment que je voulais tester [release-please](https://github.com/googleapis/release-please) dans le but de me faciliter la vie avec la génération de changelog et de tags sur des projets.

Je vais utiliser un de mes [projets](https://github.com/bdronneau/memoriesbox/). Certes pour moins de 1000 lignes de code cela va être surfait, mais il faut bien s'amuser.


## Prérequis

- Connaître les [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/)
- Connaître les [github actions](https://github.com/features/actions)

## Mise en place de release please

Tout d'abord on créé le [fichier](https://github.com/bdronneau/memoriesbox/commit/b3e1c2e3b09a0ae475ddb11d59c39db69dd55ab0) `.github/workflows/release-please.yml` qui va contenir notre github action.

```yaml
---
name: Release-Please
on:
  push:
    branches:
      - main
jobs:
  release-please:
    runs-on: ubuntu-latest
    steps:
      - uses: google-github-actions/release-please-action@v3
        with:
          release-type: go
          default-branch: main
```
[Source](https://github.com/google-github-actions/release-please-action#setting-up-this-action)

Une fois en place, une pull request est ouverte par le github-actions bot:

![pull request release](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vjvqs4lt8x9xgbyyrsrq.png)
L'action remplie les fichiers `CHANGELOG.md` et `.release-please-manifest.json` avec les différentes informations trouvées dans les messages de commits. La version est incrémentée en fonction des [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/). Ce comportement est inhérent au fait que j'utilise la clé `release-type` positionné à `go` (voir les autres [types](https://github.com/googleapis/release-please#strategy-language-types-supported)).

Et voilà on commence à génèrer des releases github de façon programmatique.

Après le merge notre première release est créée
![release 1.0.0](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c1emhs2dts6xq5ofqnxm.png)

## Release et intégration continue

Avec cette version lors de la création de la release et du tag associé, il n'y aura pas de github action qui sera déclenchée (plus de lecture par ici sur le [`GITHUB_TOKEN`](https://docs.github.com/en/actions/security-guides/automatic-token-authentication#about-the-github_token-secret)).
Dans mon cas, lors d'une nouvelle release je souhaite qu'un conteneur soit construit. J'injecte donc un token personnel via la directive `token` de l'action.

_Note_: au 20/02/2023 il faut utiliser un token personnel ([pat](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token#creating-a-personal-access-token-classic)), on ne peut pas utiliser les [tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token#creating-a-fine-grained-personal-access-token) avec des droits fins.

```yaml
...
    steps:
      - uses: google-github-actions/release-please-action@v3
        with:
          release-type: go
          default-branch: main
          token: ${{ secrets.RELEASE_PLEASE }}
...
```

Pour avoir un token valide il faut les droits suivants
![droit token github](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cqtn2rbw61borba6zgil.png)

Cela me permet donc d'avoir la github action suivante qui se déclenche sur génération de tag github:

```yaml
---
name: Docker

on:
  push:
    tags:
      - '*'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    # build stuff
...
```
[Source](https://github.com/bdronneau/memoriesbox/blob/cff8fad2e55da93e1b647196a4ea047b6c074640/.github/workflows/docker.yaml)

## Fashion formating

On peut par la suite via la directive `changelog-types` ajouter du shiny sur nos releases:

```yaml
...
    steps:
      - uses: google-github-actions/release-please-action@v3
        with:
...
          changelog-types: |
            [
              {"type":"feat","section":"🚀 Features","hidden":false},
              {"type":"change","section":"🚀 Features","hidden":false},
              {"type":"deprecate","section":"⚠️ Changes","hidden":false},
              {"type":"remove","section":"⚠️ Changes","hidden":false},
              {"type":"fix","section":"🐞 Bug Fixes","hidden":false},
              {"type":"revert","section":"🐞 Bug Fixes","hidden":false},
              {"type":"security","section":"🐞 Bug Fixes","hidden":false},
              {"type":"perf","section":"✨ Polish","hidden":false},
              {"type":"refactor","section":"✨ Polish","hidden":false},
              {"type":"style","section":"✨ Polish","hidden":false},
              {"type":"build","section":"🧰 Other","hidden":false},
              {"type":"chore","section":"🧰 Other","hidden":false},
              {"type":"deps","section":"🧰 Other","hidden":true},
              {"type":"ci","section":"🧰 Other","hidden":true},
              {"type":"test","section":"🧪 Tests","hidden":false},
              {"type":"docs","section":"📚 Documentation","hidden":false}
            ]
```
[Source](https://github.com/google-github-actions/release-please-action/issues/686)

Le rendu est le suivant

![github release 1.3.0 shiny format](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2cm4y5n4zvbqw5co6aka.png)

## Conclusion

Et voilà, on a des releases et des conteneurs automatiques, derrière cela s'intègre dans des mises à jour via [dependabot](https://docs.github.com/en/code-security/dependabot/working-with-dependabot) ou [renovate](https://docs.renovatebot.com/) ou dans l'[image updater](https://fluxcd.io/flux/guides/image-update/) de [fluxcd](https://fluxcd.io/).

## Notes

Tous les `type` commits ne déclenchent pas une release, par exemple si vous faite un commit de type `refactor`, l'action n'ouvrira pas de pull request contrairement à `feat` et `fix` ([plus d'informations](https://github.com/google-github-actions/release-please-action#how-should-i-write-my-commits))

## Credits
- Cover image [link](https://unsplash.com/fr/photos/bE1cbMqqjhs)