aboutsummaryrefslogtreecommitdiff
path: root/.cirrus.yml
blob: 4dbc2f5f3a6395a3591a26c16e3a14f7db1abbc0 (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
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
env:  # Global defaults
  PACKAGE_MANAGER_INSTALL: "apt-get update && apt-get install -y"
  MAKEJOBS: "-j4"
  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
  CCACHE_SIZE: "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

cirrus_ephemeral_worker_template_env: &CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV
  DANGER_RUN_CI_ON_HOST: "1"  # Containers will be discarded after the run, so there is no risk that the ci scripts modify the system

persistent_worker_template_env: &PERSISTENT_WORKER_TEMPLATE_ENV
  RESTART_CI_DOCKER_BEFORE_RUN: "1"

persistent_worker_template: &PERSISTENT_WORKER_TEMPLATE
  persistent_worker: {}  # https://cirrus-ci.org/guide/persistent-workers/

# 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) and set the
    # default git author name (used in verify-commits.py)
    - bash -c "$PACKAGE_MANAGER_INSTALL git"
    - git config --global user.email "ci@ci.ci"
    - git config --global user.name "ci"
    - if [ "$CIRRUS_PR" = "" ]; then exit 0; fi
    - git fetch $CIRRUS_REPO_CLONE_URL $CIRRUS_BASE_BRANCH
    - git merge FETCH_HEAD  # Merge base to detect silent merge conflicts

main_template: &MAIN_TEMPLATE
  timeout_in: 120m  # https://cirrus-ci.org/faq/#instance-timed-out
  container:
    # https://cirrus-ci.org/faq/#are-there-any-limits
    # Each project has 16 CPU in total, assign 2 to each container, so that 8 tasks run in parallel
    cpu: 2
    memory: 8G  # Set to 8GB to avoid OOM. https://cirrus-ci.org/guide/linux/#linux-containers
  ccache_cache:
    folder: "/tmp/ccache_dir"
  depends_built_cache:
    folder: "depends/built"
    fingerprint_script: echo $CIRRUS_TASK_NAME $(git rev-list -1 HEAD ./depends)
  ci_script:
    - ./ci/test_run_all.sh

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

depends_sdk_cache_template: &DEPENDS_SDK_CACHE_TEMPLATE
  depends_sdk_cache:
    folder: "depends/sdk-sources"

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 [bionic]'
  << : *BASE_TEMPLATE
  container:
    image: ubuntu:bionic  # For python 3.6, oldest supported version according to doc/dependencies.md
    cpu: 1
    memory: 1G
  # For faster CI feedback, immediately schedule the linters
  << : *CREDITS_TEMPLATE
  lint_script:
    - ./ci/lint_run_all.sh
  env:
    << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV

task:
  name: "Win64 native [msvc]"
  << : *FILTER_TEMPLATE
  windows_container:
    cpu: 4
    memory: 8G
    image: cirrusci/windowsservercore:visualstudio2019
  timeout_in: 120m
  env:
    PATH: 'C:\jom;C:\Python39;C:\Python39\Scripts;C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin;%PATH%'
    PYTHONUTF8: 1
    CI_VCPKG_TAG: '2021.05.12'
    QT_DOWNLOAD_URL: 'https://download.qt.io/official_releases/qt/5.12/5.12.11/single/qt-everywhere-src-5.12.11.zip'
    QT_LOCAL_PATH: 'C:\qt-everywhere-src-5.12.11.zip'
    QT_SOURCE_DIR: 'C:\qt-everywhere-src-5.12.11'
    QTBASEDIR: 'C:\Qt_static'
    x64_NATIVE_TOOLS: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvars64.bat"'
    IgnoreWarnIntDirInTempDetected: 'true'
  merge_script:
    - git config --global user.email "ci@ci.ci"
    - git config --global user.name "ci"
    # Windows filesystem loses the executable bit, and all of the executable
    # files are considered "modified" now. It will break the following `git merge`
    # command. The next two commands make git ignore this issue.
    - git config core.filemode false
    - git reset --hard
    - PowerShell -NoLogo -Command if ($env:CIRRUS_PR -ne $null) { git fetch $env:CIRRUS_REPO_CLONE_URL $env:CIRRUS_BASE_BRANCH; git merge FETCH_HEAD; }
  msvc_qt_built_cache:
    folder: "%QTBASEDIR%"
    reupload_on_changes: false
    fingerprint_script:
      - echo %QT_DOWNLOAD_URL%
      - msbuild -version
    populate_script:
      - curl -L -o C:\jom.zip http://download.qt.io/official_releases/jom/jom.zip
      - mkdir C:\jom
      - tar -xf C:\jom.zip -C C:\jom
      - curl -L -o %QT_LOCAL_PATH% %QT_DOWNLOAD_URL%
      - tar -xf %QT_LOCAL_PATH% -C C:\
      - '%x64_NATIVE_TOOLS%'
      - cd %QT_SOURCE_DIR%
      - mkdir build
      - cd build
      - ..\configure -release -silent -opensource -confirm-license -opengl desktop -no-shared -static -static-runtime -mp -qt-zlib -qt-pcre -qt-libpng -no-libjpeg -nomake examples -nomake tests -nomake tools -no-dbus -no-libudev -no-icu -no-gtk -no-opengles3 -no-angle -no-sql-sqlite -no-sql-odbc -no-sqlite -no-libudev -no-vulkan -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdeclarative -skip qtdoc -skip qtgamepad -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtmacextras -skip qtmultimedia -skip qtnetworkauth -skip qtpurchasing -skip qtquickcontrols -skip qtquickcontrols2 -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtx11extras -skip qtxmlpatterns -no-openssl -no-feature-sql -no-feature-sqlmodel -prefix %QTBASEDIR%
      - jom
      - jom install
  vcpkg_binary_cache:
    folder: 'C:\Users\ContainerAdministrator\AppData\Local\vcpkg\archives'
  install_python_script:
    - choco install --yes --no-progress python3 --version=3.9.6
    - pip install zmq
    - python -VV
  install_vcpkg_script:
    - cd ..
    - git clone --quiet https://github.com/microsoft/vcpkg.git
    - cd vcpkg
    - git -c advice.detachedHead=false checkout %CI_VCPKG_TAG%
    - .\bootstrap-vcpkg -disableMetrics
    - echo set(VCPKG_BUILD_TYPE release) >> triplets\x64-windows-static.cmake
    - .\vcpkg integrate install
    - .\vcpkg version
  build_script:
    - cd %CIRRUS_WORKING_DIR%
    - python build_msvc\msvc-autogen.py
    - msbuild build_msvc\bitcoin.sln -property:Configuration=Release -maxCpuCount -verbosity:minimal -noLogo
  unit_tests_script:
    - src\test_bitcoin.exe -l test_suite
    - src\bench_bitcoin.exe > NUL
    - python test\util\test_runner.py
    - python test\util\rpcauth-test.py
  functional_tests_script:
    # Increase the dynamic port range to the maximum allowed value to mitigate "OSError: [WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted".
    # See: https://docs.microsoft.com/en-us/biztalk/technical-guides/settings-that-can-be-modified-to-improve-network-performance
    - netsh int ipv4 set dynamicport tcp start=1025 num=64511
    - netsh int ipv6 set dynamicport tcp start=1025 num=64511
    # Exclude feature_dbcrash for now due to timeout
    - python test\functional\test_runner.py --nocleanup --ci --quiet --combinedlogslen=4000 --jobs=4 --timeout-factor=8 --failfast --extended --exclude feature_dbcrash

task:
  name: 'ARM [unit tests, no functional tests] [bullseye]'
  << : *GLOBAL_TASK_TEMPLATE
  arm_container:
    image: debian:bullseye
    cpu: 2
    memory: 8G
  env:
    << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV
    FILE_ENV: "./ci/test/00_setup_env_arm.sh"
    QEMU_USER_CMD: ""  # Disable qemu and run the test natively

task:
  name: 'Win64 [unit tests, no gui tests, no boost::process, no functional tests] [focal]'
  << : *GLOBAL_TASK_TEMPLATE
  container:
    image: ubuntu:focal
  env:
    << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV
    FILE_ENV: "./ci/test/00_setup_env_win64.sh"

task:
  name: '32-bit + dash [gui] [CentOS 8]'
  << : *GLOBAL_TASK_TEMPLATE
  container:
    image: centos:8
  env:
    << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV
    PACKAGE_MANAGER_INSTALL: "yum install -y"
    FILE_ENV: "./ci/test/00_setup_env_i686_centos.sh"

task:
  name: '[previous releases, uses qt5 dev package and some depends packages, DEBUG] [unsigned char] [bionic]'
  previous_releases_cache:
    folder: "releases"
  << : *GLOBAL_TASK_TEMPLATE
  << : *PERSISTENT_WORKER_TEMPLATE
  env:
    << : *PERSISTENT_WORKER_TEMPLATE_ENV
    FILE_ENV: "./ci/test/00_setup_env_native_qt5.sh"

task:
  name: '[depends, sanitizers: thread (TSan), no gui] [hirsute]'
  << : *GLOBAL_TASK_TEMPLATE
  container:
    image: ubuntu:hirsute
    cpu: 6  # Increase CPU and Memory to avoid timeout
    memory: 24G
  env:
    << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV
    MAKEJOBS: "-j8"
    FILE_ENV: "./ci/test/00_setup_env_native_tsan.sh"

task:
  name: '[depends, sanitizers: memory (MSan)] [focal]'
  << : *GLOBAL_TASK_TEMPLATE
  container:
    image: ubuntu:focal
  env:
    << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV
    FILE_ENV: "./ci/test/00_setup_env_native_msan.sh"

task:
  name: '[no depends, sanitizers: address/leak (ASan + LSan) + undefined (UBSan) + integer] [hirsute]'
  << : *GLOBAL_TASK_TEMPLATE
  container:
    image: ubuntu:hirsute
  env:
    << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV
    FILE_ENV: "./ci/test/00_setup_env_native_asan.sh"

task:
  name: '[no depends, sanitizers: fuzzer,address,undefined,integer] [focal]'
  only_if: $CIRRUS_BRANCH == $CIRRUS_DEFAULT_BRANCH || $CIRRUS_BASE_BRANCH == $CIRRUS_DEFAULT_BRANCH
  << : *GLOBAL_TASK_TEMPLATE
  container:
    image: ubuntu:focal
    cpu: 4  # Increase CPU and memory to avoid timeout
    memory: 16G
  env:
    << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV
    MAKEJOBS: "-j8"
    FILE_ENV: "./ci/test/00_setup_env_native_fuzz.sh"

task:
  name: '[multiprocess, i686, DEBUG] [focal]'
  << : *GLOBAL_TASK_TEMPLATE
  container:
    image: ubuntu:focal
    cpu: 4
    memory: 16G  # The default memory is sometimes just a bit too small, so double everything
  env:
    << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV
    MAKEJOBS: "-j8"
    FILE_ENV: "./ci/test/00_setup_env_i686_multiprocess.sh"

task:
  name: '[no wallet] [bionic]'
  << : *GLOBAL_TASK_TEMPLATE
  container:
    image: ubuntu:bionic
  env:
    << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV
    FILE_ENV: "./ci/test/00_setup_env_native_nowallet.sh"

task:
  name: 'macOS 10.15 [gui, no tests] [focal]'
  << : *DEPENDS_SDK_CACHE_TEMPLATE
  << : *GLOBAL_TASK_TEMPLATE
  container:
    image: ubuntu:focal
  env:
    << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV
    FILE_ENV: "./ci/test/00_setup_env_mac.sh"

task:
  name: 'macOS 11 native [gui] [no depends]'
  brew_install_script:
    - brew install boost libevent berkeley-db4 qt@5 miniupnpc libnatpmp ccache zeromq qrencode sqlite libtool automake pkg-config gnu-getopt
  << : *GLOBAL_TASK_TEMPLATE
  osx_instance:
    # Use latest image, but hardcode version to avoid silent upgrades (and breaks)
    image: big-sur-xcode-12.5  # https://cirrus-ci.org/guide/macOS
  env:
    << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV
    CI_USE_APT_INSTALL: "no"
    PACKAGE_MANAGER_INSTALL: "echo"  # Nothing to do
    FILE_ENV: "./ci/test/00_setup_env_mac_host.sh"

task:
  name: 'ARM64 Android APK [focal]'
  << : *DEPENDS_SDK_CACHE_TEMPLATE
  << : *BASE_TEMPLATE
  depends_sources_cache:
    folder: "depends/sources"
    fingerprint_script: git rev-list -1 HEAD ./depends
  << : *MAIN_TEMPLATE
  container:
    image: ubuntu:focal
  env:
    << : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV
    FILE_ENV: "./ci/test/00_setup_env_android.sh"