Bitbucket Pipelines Notes
Bitbucket Pipelines document is fragmented everywhere. It always makes me search for a while every time I write a new one for CI/CD. So I'll make a few notes here.
Tips and tricks
Bitbucket Validator Tool
You can validate the bitbucket-pipelines.yml YAML format by using this tool: https://bitbucket-pipelines.atlassian.io/validator
   
Skip trigger the pipelines
  You can include [skip ci] or [ci skip] anywhere in your commit message of the HEAD commit.
  Any commits that include [skip ci] or [ci skip] in the message are ignored by Pipelines.
Ref: https://support.atlassian.com/bitbucket-cloud/docs/bitbucket-pipelines-faqs/
Configure bitbucket-pipelines.yml
Build on branch
pipelines:
  branches: # Pipelines that run automatically on a commit to a branch
    staging:
      - step:
          script:
            - ...
Pull Requests
pipelines:
  pull-requests:
    '**': #this runs as default for any branch not elsewhere defined
      - step:
          script:
            - ...
    feature/*: #any branch with a feature prefix
      - step:
          script:
            - ...
Parallel
pipelines:
  branches:
    master:
      - step: # non-parallel step
          name: Build
          script:
            - ./build.sh
      - parallel: # these 2 steps will run in parallel
          - step:
              name: Integration 1
              script:
                - ./integration-tests.sh --batch 1
          - step:
              name: Integration 2
              script:
                - ./integration-tests.sh --batch 2
Reuse steps
definitions:
  steps:
    - step: &build-test
        name: Build and test
        script:
          - yarn && yaml build
pipelines:
  branches:
    develop:
      - step: *build-test
    main:
      - step: *build-test
    master:
      - step:
        <<: *build-test
        name: Testing on master
Override values
definitions:
  steps:
    - step: &build-test
        name: Build and test
        script:
          - yarn && yaml build
pipelines:
  branches:
    develop:
      - step:
        <<: *build-test
        name: Testing on master
Reuse scripts
definitions:
  scripts:
    - script: &script-build-and-test |-
        yarn
        yarn test
pipelines:
  branches:
    develop:
      - step:
          name: Build and test and deploy
          script:
            - export NODE_ENV=develop
            - *script-build-and-test
Script multiple lines
Using literal style block scalar:
pipelines:
  branches:
    develop:
      - step:
          name: Build and test and deploy
          script:
            - |
              export NODE_ENV=develop DEBUG=false
              yarn
              yarn test
              yarn build
pipelines:
  branches:
    develop:
      - step:
          name: Build and test and deploy
          script:
            - >
              export NODE_ENV=develop DEBUG=false
              yarn
              yarn test
              yarn build
Using service for one step
pipelines:
  branches:
    develop:
      - step:
        <<: *build-test
        name: Testing on master
        caches: [docker]
        services: [docker]
Increase Docker memory
The Docker-in-Docker daemon used for Docker operations in Pipelines is treated as a service container, and so has a default memory limit of 1024 MB
This can also be adjusted to any value between 128 MB and 3072 or 7128 MB (2x - 8192 MB total, 1024 MB reserved).
definitions:
  services:
    docker:
      memory: 2048
2x for all steps
options:
  size: 2x
definitions:
  services:
    docker:
      memory: 7128
pipelines:
  branches:
    develop:
      - step:
        <<: *build-test
        name: Testing on master
        caches: [docker]
        services: [docker]
2x for one step
pipelines:
  branches:
    develop:
      - step:
        <<: *build-test
        name: Testing on master
        caches: [docker]
        services: [docker]
        size: 2x
Environment Variables
Pipelines provides a set of default variables that are available for builds, and can be used in scripts: https://support.atlassian.com/bitbucket-cloud/docs/variables-and-secrets/