How do I prevent a gitlab ci pipeline being triggered when I add a git tag? I'm running this command locally (as opposed to within a gitlab-ci job)
git tag -a "xyz"
and then pushing the tag; and this triggers various pipelines. I want to exclude some of those pipelines from running.
I'm trying variations on ideas from questions such as this; that question is using only, I'm wanting to exclude, so I'm trying except. The answers there have two variants, one with refs one without.
build:
# ... my work here ...
except:
- tags
build:
# ... my work here ...
except:
refs:
- tags
Neither seem to have any effect; I add a tag, the build still happens.
My understanding may be completely awry here as there seem to be three possible meanings of the word tags and when reading docs or examples I'm not always sure which meaning is applicable:
I'm interested in controlling what happens if the first case. It does seem clear from comments so far that "except: -tags" is not relevant to my case, so is there any approach that does work?
These are scripts that you choose to be run before the job is executed or after the job is executed. These can also be defined at the top level of the YAML file (where jobs are defined) and they'll apply to all jobs in the . gitlab-ci. yml file.
Set a runner to run untagged jobsGo to the project's Settings > CI/CD and expand the Runners section. Find the runner you want to pick untagged jobs and make sure it's enabled. Click the pencil button. Check the Run untagged jobs option.
Tagging is generally used to capture a point in history that is used for a marked version release (i.e. v1. 0.1). A tag is like a branch that doesn't change. Unlike branches, tags, after being created, have no further history of commits.
It looks like GitLab recommends using rules
instead of except
as per the documentation
only and except are not being actively developed. rules is the preferred keyword to control when to add jobs to pipelines.
So it'd be
your_job:
stage: your_stage
script:
- echo "Hello"
rules:
- if: $CI_COMMIT_TAG
when: never
- when: always
Except tags
is exactly what you should use if you want to skip build for tags.
You need to be sure to understand commit vs branches vs tags
To illustrate what happens when you push tagged commit to gitlab I did as follows:
.gitlab-ci.yml
with following content:tests_always_run:
script:
- echo I should always execute
tests_except_tags:
script:
- echo I skip tagged triggers
except:
- tags
--follow-tags
to make sure tag is also propagated to server:git add .gitlab-ci.yml
git commit -m 'my great yml with except tags'
git tag -a "abc" -m "Test tag"
git push --follow-tags
Ilustrated results:
If you want to skip CI for selected commit then you could use git push -o ci.skip, inspired by this article
(note : this a formatted comment more than an answer)
In order to debug the conditions that trigger your pipeline :
gitlab's doc mentions several variables which are set when running a CI job, among which :
CI_COMMIT_REF_NAME
: The branch or tag name for which project is builtCI_COMMIT_BRANCH
: The commit branch name. Present only when building branches.CI_COMMIT_TAG
: The commit tag name. Present only when building tags.
Have your build job output some of these variables (e.g : echo "triggered by ref : " $CI_COMMIT_REF_NAME
) to view what triggered your job.
I was in the same situation, my solution was this:
Before::
After:
Both stages are configured in my .gitlab-ci.yml file, with different name The "Dev-UnitTests" , it only executes when someone commits to the repository, no effect on tags y the branch "test"
Dev-UnitTests:
stage: pruebas
script:
- mvn $MAVEN_CLI_OPTS test
artifacts:
when: always
reports:
junit:
- target/surefire-reports/*Test.xml
- target/failsafe-reports/*Test.xml
cobertura: target/site/jacoco/jacoco.xml
tags:
- shell
except:
- test
- tags
The Unit Tests , only run when a merge is done on the branch test
Unit Tests:
stage: pruebas
script:
- mvn $MAVEN_CLI_OPTS test
artifacts:
when: always
reports:
junit:
- target/surefire-reports/*Test.xml
- target/failsafe-reports/*Test.xml
cobertura: target/site/jacoco/jacoco.xml
tags:
- shell
only:
- test
That did not run again any pipeline when creating a tag, I hope it helps you.
The key is:
...
except:
- tags
...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With