🎈 Publication automatique de ğcli

D’aprùs le modùle de bounty

Titre Publication automatique de ğcli
Lien https://git.duniter.org/clients/rust/gcli-v2s/-/issues/16
Émetteur @HugoTrentesaux
Montant estimĂ© 200 DUĞ1
Montant validé [
]
Attribué à ???

L’intĂ©rĂȘt de ĞCli est d’ĂȘtre un utilitaire versatile facile Ă  utiliser et “clĂ© en main” dans lequel on peut ajouter des nouvelles fonctionnalitĂ©s ou corriger des bugs rapidement. Cela implique de pouvoir publier rapidement des mises-Ă -jour sans que l’utilisateur ait Ă  recompiler le programme. Voici les fonctionnalitĂ©s :

  • dĂ©clencher automatiquement la compilation de ğcli suite Ă  une opĂ©ration simple comme un tag git par exemple avec la CI GitLab
  • publier automatiquement le binaire compilĂ© sur une plateforme de confiance comme par exemple le registry GitLab
  • (optionnel) ajouter une commande gcli update pour que gcli se mette Ă  jour automatiquement (et optionnellement gcli update --version 3.1.4)

Commentaire : Je ne souhaite pas forcer l’utilisation de la CI GitLab pour laisser libre cours aux autres solutions qui peuvent exister (webhook et scripts exĂ©cutĂ©s sur une autre machine qu’un gitlab runner
). Il faut quand mĂȘme que la solution soit reproductible et raisonnablement sĂ©curisĂ©e. Ne pas hĂ©siter Ă  demander plus d’informations et nĂ©gocier le montant avant de se lancer :slight_smile:

2 Likes

L’objectif est de publier, lorsqu’un tag protĂ©gĂ© est publiĂ©, une release sur Releases · clients / Rust / Ğcli-v2s · GitLab contenant l’exĂ©cutable construit dans le job prĂ©cĂ©dent ?

Je connaissais pas cette instruction “artifacts”, je vais essayer.

C’est une liste donc tu peux mettre plusieurs fichiers si tu le souhaites.

  artifacts:
    paths:
      - ci/appimage/Sakia_x86_64.AppImage
      - build/target/my_executable.exe
1 Like

En fait j’utilisais dĂ©jĂ  ce mot clĂ© artifacts dans ma tentative de CI pour ğcli : .gitlab-ci.yml · master · clients / Rust / Ğcli-v2s · GitLab

Mais ce qui me manque c’est l’étape pour faire une page de release avec le lien vers le binaire. J’ai l’impression que ça ne fait pas partie du vocabulaire de gitlabci et qu’il faut utiliser un autre outil pour soumettre une page comme le fait le cargo xtask release-runtime sur Duniter. Mais j’ai pas envie de tout redĂ©velopper, je veux juste une solution simple, et idĂ©alement quelqu’un qui s’en occupe parce que ce n’est pas mon dada :laughing:

Il y a toujours ma tentative WIP try to release with CI (5ba8cbc7) · Commits · clients / Rust / Ğcli-v2s · GitLab mais ça n’a pas abouti et je n’ai pas envie de remettre le nez dedans.

On peut toujours tĂ©lĂ©charger les artefacts directement https://git.duniter.org/clients/rust/gcli-v2s/-/jobs/125527/artifacts/raw/target/release/gcli?inline=false mais c’est pas pratique

On est en 2024:

#!/bin/bash

# Vérifiez si le token d'accÚs privé GitLab est défini
if [ -z "$GITLAB_PRIVATE_TOKEN" ]; then
    echo "Token d'accĂšs privĂ© GitLab non dĂ©fini. ArrĂȘt du script."
    exit 1
fi

# Variables
PROJECT_ID="604"
RELEASE_NAME="Release $CI_COMMIT_TAG"
RELEASE_DESCRIPTION="Description de la release $CI_COMMIT_TAG"
ARTIFACT_PATH="target/release/gcli"
GITLAB_API_URL="https://git.duniter.org/api/v4"

# Création de la release
echo "Création de la release $RELEASE_NAME..."
curl --header "PRIVATE-TOKEN: $GITLAB_PRIVATE_TOKEN" \
     --data "name=$RELEASE_NAME&tag_name=$CI_COMMIT_TAG&description=$RELEASE_DESCRIPTION" \
     "$GITLAB_API_URL/projects/$PROJECT_ID/releases"

# Construction de l'URL de l'artéfact
ARTIFACT_URL="$CI_PROJECT_URL/-/jobs/artifacts/$CI_COMMIT_TAG/raw/$ARTIFACT_PATH?job=build"

# Ajout de l'artéfact à la release
echo "Ajout de l'artéfact à la release..."
curl --header "PRIVATE-TOKEN: $GITLAB_PRIVATE_TOKEN" \
     --data-urlencode "url=$ARTIFACT_URL" \
     --data-urlencode "name=$(basename $ARTIFACT_PATH)" \
     "$GITLAB_API_URL/projects/$PROJECT_ID/releases/$CI_COMMIT_TAG/assets/links"

echo "Script terminé."
image: "rust:latest"

stages:
  - build
  - release

build:
  stage: build
  script:
    - cargo build --release
  artifacts:
    paths:
      - target/release/gcli
  cache:
    key:
      files:
        - Cargo.lock
    paths:
      - target/release
  only:
    - tags

release:
  stage: release
  image: rust
  script:
    - chmod +x .ci/release_script.sh
    - .ci/release_script.sh
  only:
    - tags
  dependencies:
    - build
  • Variables d’Environnement : GITLAB_PRIVATE_TOKEN doit ĂȘtre dĂ©fini dans les variables CI/CD de votre projet GitLab. Ce token doit avoir les permissions nĂ©cessaires.
  • Placement du Script : Le script release_script.sh doit ĂȘtre placĂ© dans le rĂ©pertoire .ci/ de votre dĂ©pĂŽt Git et doit ĂȘtre rendu exĂ©cutable.
1 Like

Oui, bah il faut utilise GPT pour gĂ©nĂ©rer le contenu de release-script.sh maintenant. Mais ça m’aurait arrangĂ© que Gitlab intĂšgre ça Ă  son format .yml pour qu’on n’ait pas Ă  Ă©crire un script avec curl par exemple. Ou release-cli comme j’ai essayĂ© de le faire ici.

Je suis bien d’accords c’est bizarre de devoir passer par l’API gitlab.
Le contenu du script release-script.sh est présent dans mon message.

Du coup j’ai droit aux 200DU/ğ1 ? :slight_smile:

Oui, si tu fais la MR et que ça marche.

VoilĂ : Releases · clients / Rust / Ğcli-v2s · GitLab

J’ai juste ajoutĂ© une condition au dĂ©but pour bien verrouiller mais c’est tout:

if [ -z "$CI_COMMIT_TAG" ]; then
    echo "This script should only be run on a tag."
    exit 1
fi
3 Likes

Et voilĂ , c’est un bounty gagnĂ© par poka ! Releases · clients / Rust / Ğcli-v2s · GitLab

la release est awesome, mais il va falloir attendre le rĂ©seau de test pour la tester ! elle s’appuie sur la derniĂšre version du runtime (mais pas encore sur la derniĂšre version de duniter-squid, j’attends qu’on finisse !4 pour ça)

@Tchois, est-ce que tu voudrais bien gĂ©rer le paiement des bounty en Ğ1 ? (cf le tag bounty)

2 Likes

Ah oui et je suis l’auteur de la release car c’est moi qui ai fait le jeton d’accĂšs, il faudrait le gĂ©nĂ©rer avec un autre compte plus lĂ©gitime, le tiens ou je ne sais pas si il y a un user gitlab ?


Si apparemment il y a 4, dont 3 n’ont jamais Ă©tĂ© utilisĂ©s. Je pense qu’il faudrait crĂ©er un user juste pour ça, et lui donner les droits nĂ©cessaires sur le dĂ©pĂŽt. Ca Ă©viterait d’utiliser un token admin.

Bon j’ai pas trop compris ce que c’est qu’un bounty, moi j’étais restĂ© Ă  la barre chocolatĂ© (est-ce que j’ai la bonne rĂ©fĂ©rence? :grin:).
Et c’est pas la derniĂšre discussion sur les drapeaux qui m’a aidĂ© :open_mouth:.
Si tu veux on en parle ce week-end, on trouvera bien 5mn, pour que j’en sache plus.

un bounty c’est une prime.

1 Like

Si je trouve une solution plus simple, je rĂ©cupĂšre le bounty ou pas (j’adore les bounty, mĂȘme si la noix de coco se coince entre les dents
). :rofl:

J’ai fait une recherche sur l’historique du .gitlab-ci.yml de Sakia et Tikka. Et j’ai utilisĂ© aussi la technique de @Poka pour publier une version compilĂ©e de Tikka. Mais les commandes API Gitlab servaient Ă  transfĂ©rer l’artefact que je stockais dans la registry de GitLab. Un systĂšme compliquĂ© que j’ai abandonnĂ©.

De mĂ©moire, une Release est crĂ©Ă© automatiquement lorsqu’on crĂ©e un Jalon (Milestone). En cherchant un peu dans la doc, j’ai dĂ©couvert le mot clef release. J’ai l’impression qu’on peut cumuler les mots clefs artifacts et release dans la CI.

Tant que le sujet est chaud, @poka tu peux peut-ĂȘtre ne plus faire appel Ă  l’API avec ces exemples :

Hope it helps !

3 Likes

hey non j’ai mĂȘme rajouter une MR avec une commande gcli pour publish automatiquement le tag avec la bonne version: Add publish command (!19) · Merge requests · clients / Rust / Ğcli-v2s · GitLab

Et si tu espÚres avoir la moindre chance de voir le bout de ce bounty, il faut que tu fasses la MR et que ça marche.
Mais j’y crois pas parceque ce bounty, il est à moi, j’en ai chier pour l’obtenir, à la sueur de mon gpt.

1 Like

Et voilĂ  j’ai ajoutĂ© un commit qui fait exactement ce que tu proposes : add vit proposition to publish artefact without gitlab API (de184b29) · Commits · clients / Rust / Ğcli-v2s · GitLab

J’ai Ă©tĂ© plus rapide que toi, il fallait le faire toi mĂȘme si tu voulais me voler mon bounty. C’est con hein ? J’espĂšre que ça marche pas comme ça j’aurais pas fait mon script pour rien.

1 Like

Bon et bien je dois l’avouer, @vit avait raison, je m’avoue vaincu :person_fencing:
La derniĂšre version de la CI dans ma derniĂšre MR permet de parfaitement publiĂ© la release avec son artefact: Releases · clients / Rust / Ğcli-v2s · GitLab

Je me suis Ă©galement permis d’ajouter les derniers commits depuis la derniĂšre release en desciption.
Le tout, sans utilisation de l’api gitlab, et sans mĂȘme besoin de script bash externe.

Voici ce que ça donne en dĂ©finitif dans le .gitlab-ci.yml: .gitlab-ci.yml · add-publish-command · clients / Rust / Ğcli-v2s · GitLab

De ce fait et par ma grande bontĂ©, j’accepte exceptionnellement de partager mon :coconut: avec @vit ici prĂ©sent, en gage de reconnaissance pour sa remarque ayant dĂ©jouĂ© le cours de l’histoire toute entiĂšre.

4 Likes

Je te laisse le bounty la gloire et les filles. Tu as fait tout le boulot plusieurs fois ! Tu as l’humilitĂ© des sages qui se remettent en question, tu mĂ©rites largement plus que moi d’avoir de la noix de coco coincĂ©e entre les dents !

FĂ©licitations, et je suis heureux d’avoir modestement donnĂ© une piste d’amĂ©lioration.

Tout seul on va plus vite, mais ensemble on est plus forts !

5 Likes