99 votes

Comment utiliser la condition if-else sur gitlabci

Comment utiliser la condition if else dans le gitlab-CI.

J'ai le code ci-dessous :

deploy-dev:
  image: testimage
  environment: dev
  tags:
    - kubectl
  script:
   - kubectl apply -f demo1 --record=true
   - kubectl apply -f demo2 --record=true

Maintenant, je veux ajouter une condition comme celle-ci

script:
    - (if [ "$flag" == "true" ]; then kubectl apply -f demo1 --record=true; else kubectl apply -f demo2 --record=true);

Quelqu'un pourrait-il fournir la syntaxe correcte pour la même chose ? Existe-t-il une documentation pour les conditions (if-else, boucle for) dans gitlabci ?

0 votes

Pourquoi avez-vous mis des parenthèses autour du if ligne ?

203voto

Xavier D Points 11

Voici trois options syntaxiques pour ce type de déclaration. De gitlab-ci documentation :

Utilisation de la variable shell

deploy-dev:
image: testimage
environment: dev
tags:
 - kubectl
script:
 - if [ "$flag" == "true" ]; then MODULE="demo1"; else MODULE="demo2"; fi
 - kubectl apply -f ${MODULE} --record=true

Utilisation d'une variable shell avec un bloc multiligne yaml

deploy-dev:
image: testimage
environment: dev
tags:
  - kubectl
script:
  - >
    if [ "$flag" == "true" ]; then
      kubectl apply -f demo1 --record=true
    else
      kubectl apply -f demo2 --record=true
    fi

Utilisation des règles de gitlab

workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
      when: never
    - if: '$CI_PIPELINE_SOURCE == "push"'
      when: never
    - when: always

Utilisation des modèles et des variables de gitlab

demo1-deploy-dev:
  extends: .deploy-dev
  only:
    variables: [ $flag == "true" ]
  variables:
    MODULE: demo1

demo2-deploy-dev:
  extends: .deploy-dev
  only:
    variables: [ $flag == "false" ]
  variables:
    MODULE: demo2

.deploy-dev:
image: testimage
environment: dev
tags:
  - kubectl
script:
  - kubectl apply -f ${MODULE} --record=true

0 votes

Dans le dernier exemple, comment vérifiez-vous la valeur de $flag ?

0 votes

@RogerCollAumatell : c'est-à-dire en utilisant only: variables: [ $flag == "true" ]

1 votes

@XavierD : Je n'arrive pas à comprendre le dernier exemple. Il semble qu'une variable soit définie pour MODULE, qui est utilisée dans .deploy-dev, qui est basé sur $flag, mais qu'est-ce qui fait que .deploy-dev est lancé ? (Je pensais que le préfixe '.' signifiait que la section était sautée (cachée) ?

14voto

VonC Points 414372

Notez qu'avec GitLab 13.3 (août 2020), la syntaxe de la règle if-else a été améliorée :

Règles CI/CD : si support des expressions logiques avec parenthèses

Si vous utilisez le rules mot-clé avec if il est maintenant encore plus puissant, avec la prise en charge des expressions entre parenthèses évaluées par le processeur pipeline.

Vous pouvez utiliser un ET plus complexe et plus efficace ( && ) / OU ( || ), ce qui rend les règles de vos pipelines plus logiques, plus puissantes et plus faciles à gérer.

Voir Documentation y Numéro .


Et, avec GitLab 13.8 (janvier 2021)

Variables de support pour les règles de pipeline

Auparavant, le rules était limité dans sa portée et déterminait uniquement si un travail devait être inclus ou exclu des pipelines. Dans cette version, vous pouvez désormais décider si certaines conditions sont remplies et, par la suite, remplacer les variables dans les travaux, ce qui vous offre une plus grande flexibilité lors de la configuration de vos pipelines.

https://about.gitlab.com/images/13_8/var.png -- Support variables for pipeline rules

Voir Documentation y Numéro .


Con GitLab 13.12 (mai 2021) :

Support des variables dans le pipeline CI/CD 'workflow:rules'.

Auparavant, le rules Le mot clé avait une portée limitée et ne déterminait que si un travail devait être inclus ou exclu des pipelines. En 13.8 nous avons ajouté la possibilité d'utiliser l'option variables mot-clé avec rules pour définir les valeurs variables d'un travail en fonction de la règle à laquelle il correspond.

Dans cette version, nous avons étendu cette capacité à workflow: rules Vous pouvez ainsi définir des valeurs variables pour l'ensemble du pipeline si certaines conditions sont remplies.
Cela vous permet de rendre vos pipelines encore plus flexibles.

https://about.gitlab.com/images/13_12/variable.png -- Support variables in CI/CD pipeline 'workflow:rules'

Voir Documentation y Numéro .

5voto

Amina Mansour Points 111

Je pense que vous devez simplement ajouter un point-virgule et un "fi" de fermeture à la fin. Je n'ai pas trouvé de lien vers la documentation.

script:
    - (if [ "$flag" == "true" ]; then kubectl apply -f demo1 --record=true; else kubectl apply -f demo2 --record=true; fi);

4voto

Arihant Godha Points 1219

Vous pouvez envisager de vérifier règles

Il permet d'évaluer une liste d'objets de règle individuels dans l'ordre, jusqu'à ce que l'un d'eux corresponde et fournisse dynamiquement des attributs à la tâche.

Les clauses de règles disponibles comprennent :

  • if (similaire à only:variables)
  • changes (identique à only:changes)
  • existe

Exemple :

job:
  script: "echo Hello, Rules!"
  rules:
    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
      when: always
    - if: '$VAR =~ /pattern/'
      when: manual
    - when: on_success

0 votes

L'utilisation du filtrage =~ est vraiment utile. Soyez simplement conscient des limites de cette correspondance de motifs regex si vous décidez d'utiliser le motif dans une variable : gitlab.com/gitlab-org/gitlab/-issues/35438

1voto

Pixadelic Points 31

En outre, dans le cas d'un bloc multiligne, si vous voulez ou devez préserver les sauts de ligne, vous pouvez utiliser le caractère pipe :

script: |
    if [ "$flag" == "true" ]; then
      kubectl apply -f demo1 --record=true
    else
      kubectl apply -f demo2 --record=true
    fi

Pour aller plus loin, visitez https://yaml-multiline.info/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X