Is there a way to skip a pipeline when there are markdown changes only?

Viewed 1441

Goal

The release pipeline should start a deployment for specific branches.
This should not happen (skip the job), if there are only documentation changes. (*.md files)

The problem

If you change multiple files, but only one file ends in .md, the build job is still skipped. The job does not run for any of the files.

https://docs.gitlab.com/ee/ci/jobs/job_control.html#onlychanges--exceptchanges-examples

So, is it even possible to specifcy a rule as mentioned above?

What I tried so far (an excerpt)

So, if "*.md" doesn't work, is it possible to revert it?
"**/!(*.md)" # Every file except *.md

This does not execute anything

  rules:
    - if: $CI_COMMIT_BRANCH == "main"
      changes:
      - "**/!(*.md)" # Every file except *.md

This executes always

  rules:
    - if: $CI_COMMIT_BRANCH == "main"
    - changes:
      - "**/!(*.md)"

Question

Do I have to use custom variables to solve this problem or is there a simpler way?

3 Answers

A colleague of mine explored the globbing syntax used for making these rules of exclusion, and discovered that you can provide a list of conditions, that are evaluated in an AND-style of conditional logic. Consider the following:

.other_files_rule: &other_files_rule
  # Check if any files (not MD) changed
  # Glob syntax that checks for changes in all files except files that end with .md extension.
  # (Glob syntax tester: https://toools.cloud/miscellaneous/glob-tester)
  - changes:
      - "**/{.*,!(*.md)}"
    # If any non-MD files changed, always run the pipeline.
    when: always

# What happens if I updated CHANGELOG.md and some python file?
.md_only_rule: &md_only_rule
  # Check if any MD files changed
  # Glob syntax that checks for changes in files ending with .md extension.
  # (Glob syntax tester: https://toools.cloud/miscellaneous/glob-tester)
  - changes:
      - "**/*.md"
    # If any MD files changed, don't run the pipeline.
    when: manual
    # Allow failure must be true, else manual pipelines can never be successful without running the manual jobs.
    allow_failure: true

You need both rules, one to exclude MD files, and one to handle MD files.

Below is the more elegant solution and is documented on the GitLab docs.

So there are two approaches.

  1. To push a commit without triggering a pipeline, add ci skip or skip ci, using any capitalization, to your commit message.

  2. Alternatively, if you are using Git 2.10 or later, use the ci.skip Git push option. The ci.skip push option does not skip merge request pipelines.

    git push --push-option=ci.skip for GL version 2.18 and later, even the short version

    git push -o ci.skip

Reference:

Related