aboutsummaryrefslogtreecommitdiff
path: root/.cirrus.yml
blob: 3c59e41a134c7a33d61473c5af4f22324d152d8e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
env:  # Global defaults
  CIRRUS_CLONE_DEPTH: 1
  PACKAGE_MANAGER_INSTALL: "apt-get update && apt-get install -y"
  MAKEJOBS: "-j10"
  TEST_RUNNER_PORT_MIN: "14000"  # Must be larger than 12321, which is used for the http cache. See https://cirrus-ci.org/guide/writing-tasks/#http-cache
  CI_FAILFAST_TEST_LEAVE_DANGLING: "1"  # Cirrus CI does not care about dangling processes and setting this variable avoids killing the CI script itself on error
  CCACHE_MAXSIZE: "200M"
  CCACHE_DIR: "/tmp/ccache_dir"
  CCACHE_NOHASHDIR: "1"  # Debug info might contain a stale path if the build dir changes, but this is fine

# https://cirrus-ci.org/guide/persistent-workers/
#
# It is possible to select a specific persistent worker by label. Refer to the
# Cirrus CI docs for more details.
#
# Generally, a persistent worker must run Ubuntu 23.04+ or Debian 12+.
# Specifically,
# - apt-get is required due to PACKAGE_MANAGER_INSTALL
# - podman-docker-4.1+ is required due to the use of `podman` when
#   RESTART_CI_DOCKER_BEFORE_RUN is set and 4.1+ due to the bugfix in 4.1
#   (https://github.com/bitcoin/bitcoin/pull/21652#issuecomment-1657098200)
# - The ./ci/ depedencies (with cirrus-cli) should be installed:
#
#   ```
#   apt update && apt install git screen python3 bash podman-docker curl -y && curl -L -o cirrus "https://github.com/cirruslabs/cirrus-cli/releases/latest/download/cirrus-linux-$(dpkg --print-architecture)" && mv cirrus /usr/local/bin/cirrus && chmod +x /usr/local/bin/cirrus
#   ```
#
# - There are no strict requirements on the hardware, because having less CPUs
#   runs the same CI script (maybe slower). To avoid rare and intermittent OOM
#   due to short memory usage spikes, it is recommended to add (and persist)
#   swap:
#
#   ```
#   fallocate -l 16G /swapfile_ci && chmod 600 /swapfile_ci && mkswap /swapfile_ci && swapon /swapfile_ci && ( echo '/swapfile_ci none swap sw 0 0' | tee -a /etc/fstab )
#   ```
#
# - To register the persistent worker, open a `screen` session and run:
#
#   ```
#   RESTART_CI_DOCKER_BEFORE_RUN=1 screen cirrus worker run --labels type=todo_fill_in_type --token todo_fill_in_token
#   ```
#
# The following specific types should exist, with the following requirements:
# - small: For an x86_64 machine, recommended to have 2 CPUs and 8 GB of memory.
# - medium: For an x86_64 machine, recommended to have 4 CPUs and 16 GB of memory.
# - noble: For a machine running the Linux kernel shipped with exaclty Ubuntu Noble 24.04. The machine is recommended to have 4 CPUs and 16 GB of memory.
# - arm64: For an aarch64 machine, recommended to have 2 CPUs and 8 GB of memory.

# https://cirrus-ci.org/guide/tips-and-tricks/#sharing-configuration-between-tasks
filter_template: &FILTER_TEMPLATE
  skip: $CIRRUS_REPO_FULL_NAME == "bitcoin-core/gui" && $CIRRUS_PR == ""  # No need to run on the read-only mirror, unless it is a PR. https://cirrus-ci.org/guide/writing-tasks/#conditional-task-execution
  stateful: false  # https://cirrus-ci.org/guide/writing-tasks/#stateful-tasks

base_template: &BASE_TEMPLATE
  << : *FILTER_TEMPLATE
  merge_base_script:
    # Unconditionally install git (used in fingerprint_script).
    - git --version || bash -c "$PACKAGE_MANAGER_INSTALL git"
    - if [ "$CIRRUS_PR" = "" ]; then exit 0; fi
    - git fetch --depth=1 $CIRRUS_REPO_CLONE_URL "pull/${CIRRUS_PR}/merge"
    - git checkout FETCH_HEAD  # Use merged changes to detect silent merge conflicts
                               # Also, the merge commit is used to lint COMMIT_RANGE="HEAD~..HEAD"

main_template: &MAIN_TEMPLATE
  timeout_in: 120m  # https://cirrus-ci.org/faq/#instance-timed-out
  ci_script:
    - ./ci/test_run_all.sh

global_task_template: &GLOBAL_TASK_TEMPLATE
  << : *BASE_TEMPLATE
  << : *MAIN_TEMPLATE

compute_credits_template: &CREDITS_TEMPLATE
  # https://cirrus-ci.org/pricing/#compute-credits
  # Only use credits for pull requests to the main repo
  use_compute_credits: $CIRRUS_REPO_FULL_NAME == 'bitcoin/bitcoin' && $CIRRUS_PR != ""

task:
  name: 'lint'
  << : *BASE_TEMPLATE
  container:
    image: debian:bookworm
    cpu: 1
    memory: 1G
  # For faster CI feedback, immediately schedule the linters
  << : *CREDITS_TEMPLATE
  test_runner_cache:
    folder: "/lint_test_runner"
    fingerprint_script: echo $CIRRUS_TASK_NAME $(git rev-parse HEAD:test/lint/test_runner)
  python_cache:
    folder: "/python_build"
    fingerprint_script: cat .python-version /etc/os-release
  unshallow_script:
    - git fetch --unshallow --no-tags
  lint_script:
    - ./ci/lint_run_all.sh

task:
  name: 'tidy'
  << : *GLOBAL_TASK_TEMPLATE
  persistent_worker:
    labels:
      type: medium
  env:
    FILE_ENV: "./ci/test/00_setup_env_native_tidy.sh"

task:
  name: 'ARM, unit tests, no functional tests'
  << : *GLOBAL_TASK_TEMPLATE
  persistent_worker:
    labels:
      type: arm64  # Use arm64 worker to sidestep qemu and avoid a slow CI: https://github.com/bitcoin/bitcoin/pull/28087#issuecomment-1649399453
  env:
    FILE_ENV: "./ci/test/00_setup_env_arm.sh"

task:
  name: 'Win64, unit tests, no gui tests, no functional tests'
  << : *GLOBAL_TASK_TEMPLATE
  persistent_worker:
    labels:
      type: small
  env:
    FILE_ENV: "./ci/test/00_setup_env_win64.sh"

task:
  name: '32-bit CentOS, dash, gui'
  << : *GLOBAL_TASK_TEMPLATE
  persistent_worker:
    labels:
      type: small
  env:
    FILE_ENV: "./ci/test/00_setup_env_i686_centos.sh"

task:
  name: 'previous releases, depends DEBUG'
  << : *GLOBAL_TASK_TEMPLATE
  persistent_worker:
    labels:
      type: small
  env:
    FILE_ENV: "./ci/test/00_setup_env_native_previous_releases.sh"

task:
  name: 'TSan, depends, gui'
  << : *GLOBAL_TASK_TEMPLATE
  persistent_worker:
    labels:
      type: medium
  env:
    FILE_ENV: "./ci/test/00_setup_env_native_tsan.sh"

task:
  name: 'MSan, depends'
  << : *GLOBAL_TASK_TEMPLATE
  persistent_worker:
    labels:
      type: small
  timeout_in: 300m  # Use longer timeout for the *rare* case where a full build (llvm + msan + depends + ...) needs to be done.
  env:
    FILE_ENV: "./ci/test/00_setup_env_native_msan.sh"

task:
  name: 'ASan + LSan + UBSan + integer, no depends, USDT'
  enable_bpfcc_script:
    # In the image build step, no external environment variables are available,
    # so any settings will need to be written to the settings env file:
    - sed -i "s|\${CIRRUS_CI}|true|g" ./ci/test/00_setup_env_native_asan.sh
  << : *GLOBAL_TASK_TEMPLATE
  persistent_worker:
    labels:
      type: noble  # Must use this specific worker (needed for USDT functional tests)
  env:
    FILE_ENV: "./ci/test/00_setup_env_native_asan.sh"

task:
  name: 'fuzzer,address,undefined,integer, no depends'
  << : *GLOBAL_TASK_TEMPLATE
  persistent_worker:
    labels:
      type: medium
  env:
    FILE_ENV: "./ci/test/00_setup_env_native_fuzz.sh"

task:
  name: 'multiprocess, i686, DEBUG'
  << : *GLOBAL_TASK_TEMPLATE
  persistent_worker:
    labels:
      type: medium
  env:
    FILE_ENV: "./ci/test/00_setup_env_i686_multiprocess.sh"

task:
  name: 'no wallet, libbitcoinkernel'
  << : *GLOBAL_TASK_TEMPLATE
  persistent_worker:
    labels:
      type: small
  env:
    FILE_ENV: "./ci/test/00_setup_env_native_nowallet_libbitcoinkernel.sh"

task:
  name: 'macOS-cross, gui, no tests'
  << : *GLOBAL_TASK_TEMPLATE
  persistent_worker:
    labels:
      type: small
  env:
    FILE_ENV: "./ci/test/00_setup_env_mac_cross.sh"