ci: Refactor Windows CI into script

This makes it easier to:

* Run the exact command of any CI type and step locally
* Re-Run older CI tasks on GHA and using the latest merged config.
  (.github/ci-windows.py is merged with master on re-runs, but
  .github/workflows/ci.yml is NOT)

Also, writing it in Python has benefits:

* Any developer (even non-Windows ones) can read and modify the script.
* Python is already required for tests, so no new dependency is needed.
This commit is contained in:
MarcoFalke
2026-02-04 09:23:49 +01:00
parent 9ec1ae0e98
commit fabdd4e823
2 changed files with 72 additions and 3 deletions

71
.github/ci-windows.py vendored Executable file
View File

@@ -0,0 +1,71 @@
#!/usr/bin/env python3
# Copyright (c) The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or https://opensource.org/license/mit/.
import argparse
import os
import shlex
import subprocess
import sys
def run(cmd, **kwargs):
print("+ " + shlex.join(cmd), flush=True)
kwargs.setdefault("check", True)
try:
return subprocess.run(cmd, **kwargs)
except Exception as e:
sys.exit(str(e))
GENERATE_OPTIONS = {
"standard": [
"-DBUILD_BENCH=ON",
"-DBUILD_KERNEL_LIB=ON",
"-DBUILD_UTIL_CHAINSTATE=ON",
"-DCMAKE_COMPILE_WARNING_AS_ERROR=ON",
],
"fuzz": [
"-DVCPKG_MANIFEST_NO_DEFAULT_FEATURES=ON",
"-DVCPKG_MANIFEST_FEATURES=wallet",
"-DBUILD_GUI=OFF",
"-DWITH_ZMQ=OFF",
"-DBUILD_FOR_FUZZING=ON",
"-DCMAKE_COMPILE_WARNING_AS_ERROR=ON",
],
}
def generate(ci_type):
toolchain_file = os.path.join(
os.environ["VCPKG_INSTALLATION_ROOT"],
"scripts",
"buildsystems",
"vcpkg.cmake",
)
command = [
"cmake",
"-B",
"build",
"-Werror=dev",
"--preset",
"vs2022",
f"-DCMAKE_TOOLCHAIN_FILE={toolchain_file}",
] + GENERATE_OPTIONS[ci_type]
run(command)
def main():
parser = argparse.ArgumentParser(description="Utility to run Windows CI steps.")
parser.add_argument("ci_type", choices=GENERATE_OPTIONS, help="CI type to run.")
steps = ["generate"]
parser.add_argument("step", choices=steps, help="CI step to perform.")
args = parser.parse_args()
if args.step == "generate":
generate(args.ci_type)
if __name__ == "__main__":
main()

View File

@@ -218,10 +218,8 @@ jobs:
job-type: [standard, fuzz]
include:
- job-type: standard
generate-options: '-DBUILD_BENCH=ON -DBUILD_KERNEL_LIB=ON -DBUILD_UTIL_CHAINSTATE=ON -DCMAKE_COMPILE_WARNING_AS_ERROR=ON'
job-name: 'Windows native, VS 2022'
- job-type: fuzz
generate-options: '-DVCPKG_MANIFEST_NO_DEFAULT_FEATURES=ON -DVCPKG_MANIFEST_FEATURES="wallet" -DBUILD_GUI=OFF -DWITH_ZMQ=OFF -DBUILD_FOR_FUZZING=ON -DCMAKE_COMPILE_WARNING_AS_ERROR=ON'
job-name: 'Windows native, fuzz, VS 2022'
steps:
@@ -272,7 +270,7 @@ jobs:
- name: Generate build system
run: |
cmake -B build -Werror=dev --preset vs2022 -DCMAKE_TOOLCHAIN_FILE="${VCPKG_INSTALLATION_ROOT}/scripts/buildsystems/vcpkg.cmake" ${{ matrix.generate-options }}
py -3 .github/ci-windows.py ${{ matrix.job-type }} generate
- name: Save vcpkg binary cache
uses: actions/cache/save@v4