diff --git a/.forgejo/workflows/release-pipeline.yml b/.forgejo/workflows/prerelease.yml similarity index 76% rename from .forgejo/workflows/release-pipeline.yml rename to .forgejo/workflows/prerelease.yml index aad37ff..e648f9b 100644 --- a/.forgejo/workflows/release-pipeline.yml +++ b/.forgejo/workflows/prerelease.yml @@ -1,23 +1,15 @@ -name: Release Pipeline +name: Pre Release Workflow -# Un seul pipeline pour les préversions et les releases finales : les cinq jobs -# (cible, build, assets, manifeste, publication) sont identiques dans les deux -# cas, seul le drapeau `prerelease` change. Le dupliquer dans un second fichier -# recopierait tout pour une ligne de différence. -# -# Le filtre `[0-9]*` couvre les deux formes de tag (0.1.0, 0.1.0rc016) tout en -# ignorant les tags de travail qui ne commencent pas par un chiffre. on: push: tags: - - '[0-9]*' + - '*rc*' jobs: set-release-target: runs-on: docker outputs: release_cible: ${{ steps.setvar.outputs.release_cible }} - prerelease: ${{ steps.setvar.outputs.prerelease }} steps: - name: Déterminer la release cible id: setvar @@ -31,18 +23,8 @@ jobs: echo "release_cible=unknown" >> $GITHUB_OUTPUT fi - # Un tag contenant « rc » est une préversion ; tout le reste est une - # release finale, qui exige des notes (cf. release.yml). - if [[ "${GITHUB_REF#refs/tags/}" == *rc* ]]; then - echo "prerelease=true" >> $GITHUB_OUTPUT - else - echo "prerelease=false" >> $GITHUB_OUTPUT - fi - - name: Afficher la variable - run: | - echo "Release cible = ${{ steps.setvar.outputs.release_cible }}" - echo "Prerelease = ${{ steps.setvar.outputs.prerelease }}" + run: echo "Release cible = ${{ steps.setvar.outputs.release_cible }}" build: needs: [set-release-target] strategy: @@ -115,7 +97,7 @@ jobs: with: name: SHA256SUMS-${{ needs.set-release-target.outputs.release_cible }} path: SHA256SUMS - publish: + prerelease: # Tous les producteurs d'artefacts sont dans les needs : sans ça, le job # release peut appeler download-artifact avant la fin des uploads et publier # une release incomplète (assets ou manifeste manquants de façon non @@ -124,5 +106,4 @@ jobs: uses: ./.forgejo/workflows/release.yml with: tag: ${{ needs.set-release-target.outputs.release_cible }} - prerelease: ${{ needs.set-release-target.outputs.prerelease }} secrets: inherit diff --git a/.forgejo/workflows/release.yml b/.forgejo/workflows/release.yml index 8372c80..efc7694 100644 --- a/.forgejo/workflows/release.yml +++ b/.forgejo/workflows/release.yml @@ -4,9 +4,6 @@ on: tag: required: true type: string - prerelease: - required: true - type: string jobs: release: @@ -14,9 +11,7 @@ jobs: env: TOKEN: ${{ secrets.RELEASE }} TAG: ${{ inputs.tag }} - PRERELEASE: ${{ inputs.prerelease }} steps: - - uses: actions/checkout@v3 - name: Download all build artifacts uses: actions/download-artifact@v3 with: @@ -27,50 +22,21 @@ jobs: run: | apt-get update apt-get install -y jq - - name: Préparer les notes de version + - name: Create prerelease run: | - NOTES="release_notes/${TAG}.md" - if [[ -f "${NOTES}" ]] - then - echo "notes trouvées : ${NOTES}" - cp "${NOTES}" body.md - elif [[ "${PRERELEASE}" == "true" ]] - then - echo "aucune note pour ${TAG}, texte générique (préversion)" - echo "Prerelease automatique générée par la CI" > body.md - else - echo "release finale ${TAG} sans notes de version" >&2 - echo "créer ${NOTES} avant de pousser le tag" >&2 - exit 1 - fi - echo "--- body ---"; cat body.md - - name: Create release - run: | - jq -n \ - --arg tag "${TAG}" \ - --rawfile body body.md \ - --argjson prerelease "${PRERELEASE}" \ - '{ - tag_name: $tag, - name: $tag, - body: $body, - draft: false, - prerelease: $prerelease, - hide_archive_links: true - }' > payload.json - cat payload.json | jq -c '.body |= (.[0:60] + "…")' - - # Code HTTP vérifié explicitement plutôt qu'avec --fail-with-body, qui - # exige curl >= 7.76 : sans ça un échec (409 tag déjà publié, 401 token - # invalide) passerait inaperçu et la release resterait sans assets. - HTTP=$(curl -sS -o resp.json -w '%{http_code}' -X POST \ - -H "Authorization: token ${TOKEN}" \ + curl -X POST \ + -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" \ "https://git.g3e.fr/api/v1/repos/${{ github.repository }}/releases" \ - -d @payload.json) - echo "HTTP ${HTTP}" - cat resp.json; echo - [[ "${HTTP}" == 2* ]] || { echo "création de la release échouée" >&2; exit 1; } + -d @- <&2; exit 1; } ls dist | while read tmp do FILE=$(ls "./dist/${tmp}") @@ -91,4 +53,4 @@ jobs: -H "Content-Type: application/octet-stream" \ --data-binary @dist/${tmp}/${FILE} \ "https://git.g3e.fr/api/v1/repos/${{ github.repository }}/releases/${RELEASE_ID}/assets?name=${FILE}" - done + done \ No newline at end of file diff --git a/release_notes/0.1.0.md b/release_notes/0.1.0.md deleted file mode 100644 index b31bde9..0000000 --- a/release_notes/0.1.0.md +++ /dev/null @@ -1,52 +0,0 @@ -Première version stable de **syonad/two**, orchestrateur réseau et VM mono-nœud. - -## Fonctionnalités - -**API et cycle de vie** - -- API HTTP `/vpcs`, `/subnets`, `/vms` : création et suppression asynchrones (202 + état en base) -- États unifiés pour les trois types de ressource : `creating` → `running` → `deleting` → `deleted`, - avec `error` en cas d'échec d'exécution ; suppression autorisée depuis `running` et `error` -- Migration au démarrage de l'agent : toute ressource restée dans un état transitoire est - basculée en `error`, la file de travail étant en mémoire - -**Réseau** - -- VPC isolés par network namespace, subnets en mode `vxlan` ou `bridge` -- DHCP par subnet via instances `dnsmasq@` dédiées, entrées ip→mac en base -- Route par défaut et route du VPC distribuées par DHCP (`default_route` par subnet) -- Isolation du DHCP par ebtables, redirection du service de metadata par iptables - -**Machines virtuelles** - -- Démarrage QEMU/KVM avec plusieurs disques et ordre de démarrage explicite -- Amorçage UEFI optionnel (OVMF), avec magasin de variables par VM -- Serveur de metadata cloud-init par VM (`metadata@`), sans base de données dans le processus -- Les VMs survivent à l'arrêt de l'agent : QEMU est lancé hors de son cgroup via `systemd-run` - -**Exploitation** - -- Métriques Prometheus : nombre de VPC, subnets et VMs par état -- `deploy.sh` avec profils d'host (`kvm`), préparation système déléguée à `bootstrap_kvm.sh` -- Units systemd et scripts publiés comme assets de release, avec manifeste `SHA256SUMS` - vérifié au déploiement - -## Périmètre et limites connues - -- Un seul nœud : pas d'ordonnanceur ni de placement entre hyperviseurs -- Pas de rollback en cas d'échec partiel d'une création — les ressources réseau orphelines - ne sont pas nettoyées automatiquement -- API destinée à un appelant logiciel : la validation de cohérence des entrées (CIDR, VXLAN - ID, format des noms) est à la charge de l'appelant -- Les packages `internal/netns`, `netif`, `qemu`, `vm`, `iptables` et `ebtables` ne - fonctionnent que sous Linux - -## Installation - -``` -curl -O https://git.g3e.fr/syonad/two/raw/branch/main/scripts/deploy.sh -bash ./deploy.sh -t 0.1.0 -i # -i : préparation de l'host (paquets, kernel, bridges) -``` - -`deploy.sh` se vérifie lui-même contre la branche et télécharge les binaires, les units et -le manifeste depuis cette release.