'GitLab CI Pipeline on specific branch only
I'm trying to implement GitLab CI Pipelines to build and deploy an Angular app. In our project we have two general branches: master (for production only) and develop. For development we create feature/some-feature branches from develop branch. When development finished, we create merge request from feature/some-feature to develop. When merge request approved and merged into develop branch I want to run a Pipeline in order to build application and deploy the build on some environment.
I use the following setup in .gitlab-ci.yml:
image: node:7.5-configured
stages:
- build
- deploy
build_job:
stage: build
only:
- develop
script:
- /bin/bash <some script here>
...
The problem is that Pipeline executed every time I push into any feature/some-feature branch. What's wrong with my setup? How can I force the Pipeline to be executed only when push performed into develop branch directly?
Solution
It was my mistake - I had two different .gitlab-ci.yml files in develop branch and feature/some-feature branch.
Solution 1:[1]
It was my mistake - I had two different .gitlab-ci.yml files in develop branch and feature/some-feature branch and that's why the Pipeline was executed for all branches.
Solution 2:[2]
Although it has been passed much time on this discussion I would like to suggest an opinion, which I am using most of the time.
rules:
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"'
when: on_success
changes:
- folder/some_folder/**/*
- if: '$CI_PIPELINE_SOURCE == "web" && $CI_COMMIT_BRANCH == "development"'
when: manual
changes:
- folder/some_other_folder/**/*
This structure solved my various problems, I hope it helps you to!
Regards.
Solution 3:[3]
You should add the .gitlab-ci.yml file in the branch you need to run the CI on.
Solution 4:[4]
You can also define the rule at the global level instead of job if you want
Here is the example for that
image: python:3.8
stages:
- test
workflow:
rules:
- if: $CI_COMMIT_BRANCH == "development" || ($CI_PIPELINE_SOURCE == 'merge_request_event' && ( $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "development" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" ))
unit_test:
stage: test
services:
- postgres:13.4
before_script:
- export PYTHONPATH=$PWD
script:
- export AWS_DEFAULT_REGION=us-west-2
- python -c "import sys;print(sys.path)"
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | ProximaCygni |
| Solution 2 | Onur Gürdoğan |
| Solution 3 | el3ankaboot |
| Solution 4 | Karthikeyan Balusamy |
