6
votes

Comment faire déclencher une tâche gitlab CI uniquement manuellement sur les branches et toujours automatiquement sur master?

J'ai un travail de pages que je souhaite exécuter manuellement sur les branches, mais qui est automatiquement déclenché sur le maître:

  only:
    - branches
  except:
    - master
  when: manual

Je souhaite donc une combinaison de:

  only:
    - master
  when: always


0 commentaires

3 Réponses :


-1
votes

Vous devrez définir deux étapes. vous pouvez copier / coller ou utiliser des ancres:

.deploy_stage: &deploy_stage
  stage: deploy
  cache:
    paths:
      - public
  script:
    - scripts/pages.sh
  artifacts:
    paths:
      - public
    expire_in: 2 days

deploy_manual:
  <<: *deploy_stage
  only:
    - branches
  when: manual

deploy_master:
  <<: *deploy_stage
  only:
    - master


1 commentaires

Je pense que cela ne fonctionne pas, car le travail doit être appelé "pages" pour que gitlab le récupère comme un déploiement de pages.



5
votes

Cela devrait être possible si vous utilisez les règles GitLab CI . Voici un exemple où le shell est PowerShell et il montre l'heure actuelle et le nom de la branche / balise:

    - if: '$CI_COMMIT_BRANCH == null'
      when: never

GitLab correspond à chaque règle individuelle de haut en bas. Si la branche est nommée «maître», le travail est marqué avec quand: toujours . Si le nom de la branche est nul, il s'agit d'une balise et le travail est marqué avec jamais. S'il ne s'agit pas d'une branche nommée master , ni d'une balise, il s'agit d'une branche normale, et le travail est marqué d'un manuel.

Comme Aleksey Tsalolikhin l'a décrit, vous pouvez supprimer cette règle:

pages:
  script:
    - mkdir public
    - date > public\index.html
    - $CI_COMMIT_REF_NAME >> public\index.html
  artifacts:
    paths:
      - public
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'
      when: always
    - if: '$CI_COMMIT_BRANCH == null'
      when: never
    - when: manual

Vous aurez alors la possibilité d'exécuter également le pipeline pour vos balises, comme ceci:

Règles pour le travail manuel pour les balises et les branches, sauf la branche principale

Si c'est ce que vous voulez ou non, c'est à vous de décider.

p >


3 commentaires

Cela vous dérange-t-il si je donne la prime à Aleksey? Il a beaucoup expliqué sur la base que vous avez ici et amélioré certains détails et effectué des tests. Cependant, il était principalement basé sur cette réponse, donc si vous voulez la prime, vous pouvez l'avoir. Aleksey a fait du bon travail et est un nouveau contributeur, alors ...


J'ai regardé à travers les documents avant et je n'ai pas vu les règles. Doit avoir été aveugle. Sucré. Ouais, cela a beaucoup de sens.


GitLab CI est devenu assez grand, il est donc facile de rater des choses! Quant aux points Internet magiques, ce n'est pas si important :-)



3
votes

J'ai modifié la réponse de MrBerta - la troisième commande manquait la commande echo .

J'ai également changé les barres obliques inverses en barres obliques normales afin que je puisse utiliser le shell Linux plutôt que Powershell.

Cela fonctionne maintenant.

Voici le fichier gitlab-ci.yml - avec crédit à MrBerta.

pages:
  script:
    - mkdir public
    - date > public/index.html
    - echo $CI_COMMIT_REF_NAME >> public/index.html
  artifacts:
    paths:
      - public
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'
      when: always
    - when: manual

J'ai essayé de pousser vers master et le contenu de mes pages GitLab a été mis à jour comme prévu; et j'ai essayé de pousser vers une branche de fonctionnalité, et le bouton manuel "Play" est apparu dans l'interface utilisateur du pipeline CI / CD.

Quand j'ai poussé une balise (avec la tête détachée, c'est-à-dire, pas sur une branche) , Je n'ai pas pu le tester - GitLab CI n'a pas exécuté de pipeline automatiquement, et lorsque j'ai essayé d'exécuter le pipeline et choisi ma balise, GitLab a généré une erreur: "Le formulaire contient l'erreur suivante: Aucune étape / tâche pour ce pipeline . "

Donc, je simplifierais ceci en:

pages:
  script:
    - mkdir public
    - date > public/index.html
    - echo $CI_COMMIT_REF_NAME >> public/index.html
  artifacts:
    paths:
      - public
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'
      when: always
    - if: '$CI_COMMIT_BRANCH == null'
      when: never
    - when: manual

Ce travail de pages s'exécute manuellement sur les branches (et les balises mais je n'ai pas pu le tester) , mais déclenché automatiquement sur le maître, comme l'a demandé l'affiche originale.


1 commentaires

Merci d'avoir montré un exemple avec bash! Si vous supprimez le if: '$ CI_COMMIT_BRANCH == null': when: never , vous obtiendrez alors une option pour exécuter le travail de pages si vous poussez une balise. Si la balise est détachée et fait référence à un commit que vous n'avez pas poussé, je considérerais cette balise comme une erreur.