Dans mon pipeline, j'aimerais avoir un travail exécuté uniquement si la branche cible Merge Requests est une certaine branche, par exemple master ou release.
Est-ce possible?
J'ai lu https://docs.gitlab.com/ee/ci/variables/ et à moins que j'ai raté quelque chose, je ne vois rien qui puisse aider.
Gitlab CI est agnostique des demandes de fusion (pour l'instant). Étant donné que le pipeline s'exécute sur la branche d'origine, vous ne pourrez pas récupérer la destination.
Mise à jour: 2019-03-21
GitLab a des variables pour les informations de demande de fusion depuis la version 11.6 ( https://docs.gitlab.com/ce/ci/variables/ voir les variables commencent par CI_MERGE_REQUEST_
). Mais, ces variables ne sont disponibles que dans merge request pipelines
. ( https://docs.gitlab.com/ce/ci/merge_request_pipelines/index.html )
Pour configurer un travail CI pour une demande de fusion, nous devons définir only: merge_request
sur nos jobs pour demande de fusion. Et puis nous pouvons utiliser CI_MERGE_REQUEST_*
variables dans ces emplois.
Le plus gros écueil ici est only: merge_request
a un comportement complètement différent de la normale only/except
paramètres.
habituel only/except
paramètres: ( https://docs.gitlab.com/ce/ci/yaml/README.html#onlyexcept-basic )
only
définit les noms des branches et des balises pour lesquelles le travail sera exécuté.except
définit les noms des branches et des balises pour lesquelles le travail ne sera pas exécuté.
only: merge_request
: ( https://docs.gitlab.com/ce/ci/merge_request_pipelines/index.html#excluding-certain-jobs )
Le comportement du
only: merge_requests
le paramètre est tel que seuls les travaux avec ce paramètre sont exécutés dans le contexte d'une demande de fusion; aucun autre travail ne sera exécuté.
J'ai eu du mal à réorganiser les emplois pour les faire fonctionner comme avant avec only: merge_request
existe sur n'importe quel travail. Ainsi, j'utilise toujours le one-liner dans ma réponse d'origine pour obtenir des informations MR dans un travail CI.
Réponse originale:
Non.
Mais GitLab a un plan pour cette fonctionnalité au deuxième trimestre 2019: https://gitlab.com/gitlab-org/gitlab-ce/issues/23902#final-assumptions
Actuellement, nous pouvons utiliser une solution de contournement pour y parvenir. La méthode est telle que la réponse de Rekovni l'a décrite, et elle fonctionne réellement.
Il y a une simple ligne, obtenez la branche cible d'un MR à partir de la branche actuelle:
script: # in any script section of gitlab-ci.yml
- 'CI_TARGET_BRANCH_NAME=$(curl -LsS -H "PRIVATE-TOKEN: $AWESOME_GITLAB_API_TOKEN" "https://my.gitlab-instance.com/api/v4/projects/$CI_PROJECT_ID/merge_requests?source_branch=$CI_COMMIT_REF_NAME" | jq --raw-output ".[0].target_branch")'
Explication:
CI_TARGET_BRANCH_NAME
est une variable nouvellement définie qui stocke le nom de branche cible résolu. La définition d'une variable n'est pas nécessaire pour diverses utilisations.
AWESOME_GITLAB_API_TOKEN
est la variable configurée dans la configuration des variables CI/CD du référentiel. Il s'agit d'un jeton d'accès personnel GitLab (créé dans les paramètres utilisateur) avec une portée api
.
À propos des options de curl
: -L
rend curl conscient des redirections HTTP. -sS
rend la boucle silencieuse (-s
) mais afficher (-S
) les erreurs. -H
spécifie les informations d'autorité accédant à l'API GitLab.
L'API utilisée pourrait être fondée en https://docs.gitlab.com/ce/api/merge_requests.html#list-project-merge-requests . Nous utilisons le source_branch
attribut pour déterminer sur quel pipeline actuel MR s'exécute. Ainsi, si une branche source a plusieurs MR vers une branche cible différente, vous souhaiterez peut-être changer la partie après |
et faites votre propre logique.
À propos de jq
( https://stedolan.github.io/jq/ ), il s'agit d'un simple outil CLI pour gérer les choses JSON (ce que l'API GitLab renvoie). Vous pouvez utiliser node -p
ou toute méthode que vous souhaitez.
Si c'est ce que vous recherchez vraiment, il pourrait y avoir un moyen extrêmement compliqué (non testé) que vous pouvez atteindre en utilisant API de demande de fusion et variables CI .
Avec une étape de workflow/build quelque chose comme:
feature/test
à master
CI_PROJECT_ID
variable et filtrer par source_branch
et target_branch
.source_branch
et target_branch
étant feature/test
et master
respectivement, continuez avec la construction, sinon sautez simplement le reste de la construction.Pour utiliser l'API, je ne pense pas que vous puissiez utiliser le CI_JOB_TOKEN
variable à authentifier, vous devrez donc probablement créer votre propre jeton d'accès personnel et le stocker en tant que variable CI à utiliser dans le travail de génération.
J'espère que cela t'aides!
Depuis GitLab 11.6, il y a CI_MERGE_REQUEST_TARGET_BRANCH_NAME
.