<commit_before>image: "ubuntu:bionic"

variables:
  DOCKER_DRIVER: overlay2
  FAST_MODE: "false" # when "true", only run linter on arm and unit/functional tests on linux64, skip everything else

workflow:
  rules:
    - when: always

stages:
  - builder-image
  - build-depends
  - build
  - test

builder-image:
  stage: builder-image
  image: docker:19.03.5
  services:
    - docker:19.03.5-dind
  variables:
    DOCKER_HOST: "tcp://docker:2375"
    DOCKER_DRIVER: overlay2
    DOCKER_TLS_CERTDIR: ""
  before_script:
    - echo $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin $CI_REGISTRY
  script:
    - cd contrib/containers/ci
    - docker pull $CI_REGISTRY_IMAGE:builder-$CI_COMMIT_REF_SLUG || true
    - docker pull $CI_REGISTRY_IMAGE:builder-develop || true
    - docker build --cache-from $CI_REGISTRY_IMAGE:builder-$CI_COMMIT_REF_SLUG --cache-from $CI_REGISTRY_IMAGE:builder-develop -t $CI_REGISTRY_IMAGE:builder-$CI_COMMIT_REF_SLUG -f Dockerfile .
    - docker push $CI_REGISTRY_IMAGE:builder-$CI_COMMIT_REF_SLUG

.build-depends-template:
  stage: build-depends
  image: $CI_REGISTRY_IMAGE:builder-$CI_COMMIT_REF_SLUG
  variables:
    SDK_URL: https://bitcoincore.org/depends-sources/sdks
    XCODE_VERSION: "12.1"
    XCODE_BUILD_ID: 12A7403
    MAKEJOBS: -j4
  before_script:
    - echo HOST=$HOST
    - |
      if [ "$HOST" = "x86_64-apple-darwin19" ]; then
        mkdir -p depends/SDKs
        mkdir -p depends/sdk-sources
        OSX_SDK_BASENAME="Xcode-${XCODE_VERSION}-${XCODE_BUILD_ID}-extracted-SDK-with-libcxx-headers.tar.gz"
        OSX_SDK_PATH="depends/sdk-sources/${OSX_SDK_BASENAME}"
        if [ ! -f "$OSX_SDK_PATH" ]; then
          echo "Downloading MacOS SDK"
          curl --location --fail "${SDK_URL}/${OSX_SDK_BASENAME}" -o "$OSX_SDK_PATH"
        fi
        if [ -f "$OSX_SDK_PATH" ]; then
          echo "Extracting MacOS SDK"
          tar -C depends/SDKs -xf "$OSX_SDK_PATH"
        fi
      fi
  script:
    - make $MAKEJOBS -C depends HOST=$HOST $DEP_OPTS
  cache:
    # Let all branches share the same cache, which is ok because the depends subsystem is able to handle this properly (it works with hashes of all scripts)
    key:
      files:
        - contrib/containers/ci/Dockerfile
      prefix: ${CI_JOB_NAME}
    paths:
      - depends/built
      - depends/sdk-sources
  artifacts:
    name: depends
    when: on_success
    paths:
      - depends/$HOST
      - depends/SDKs

.base-template:
  image: $CI_REGISTRY_IMAGE:builder-$CI_COMMIT_REF_SLUG
  before_script:
    - export CACHE_DIR=$CI_PROJECT_DIR/cache
    - echo BUILD_TARGET=$BUILD_TARGET
    - source ./ci/dash/matrix.sh

    # Setup some environment variables
    - |
      if [ "$CI_EXTERNAL_PULL_REQUEST_IID" != "" ]; then
        export PULL_REQUEST="true"
      else
        # CI_EXTERNAL_PULL_REQUEST_IID is false every time until https://gitlab.com/gitlab-org/gitlab/issues/5667 is done
        # Until then, we're using https://github.com/brndnmtthws/labhub atm to mirror Github pull requests as branches into Gitlab,
        # which allows us to use Gitlab CI for Github. The following check detects such mirrored branches.
        if [[ $CI_COMMIT_REF_NAME =~ ^pr-[^/]*/[^/]*/[^/]*/[^/]*$ ]]; then
          export PULL_REQUEST="true"
          # CI_COMMIT_BEFORE_SHA is also invalid until #5667 is implemented, so we need to figure it out by ourself
          git fetch origin develop
          export CI_COMMIT_BEFORE_SHA="$(git merge-base origin/develop HEAD)"
        else
          export PULL_REQUEST="false"
        fi
      fi
    - export COMMIT_RANGE="$CI_COMMIT_BEFORE_SHA..$CI_COMMIT_SHA"
    - export JOB_NUMBER="$CI_JOB_ID"
    - export HOST_SRC_DIR=$CI_PROJECT_DIR
    - echo PULL_REQUEST=$PULL_REQUEST COMMIT_RANGE=$COMMIT_RANGE HOST_SRC_DIR=$HOST_SRC_DIR CACHE_DIR=$CACHE_DIR
    - echo "Commit log:" && git log --format=fuller -1

.build-template:
  stage: build
  extends: .base-template
  script:
    - ./ci/dash/build_src.sh
    - ./ci/dash/test_unittests.sh # Run unit tests in build stage to avoid creating too many parallel jobs
  cache:
    # Let all branches share the same cache, which is ok because ccache is able to handle it
    key:
      files:
        - contrib/containers/ci/Dockerfile
      prefix: ${CI_JOB_NAME}
    paths:
      - cache/ccache
  artifacts:
    name: binaries
    when: always
    paths:
      - build-ci
    # Exclude some less important binaries to reduce the size of the artifacts
    exclude:
      - build-ci/dashcore-$BUILD_TARGET/src/bench/bench_dash
      - build-ci/dashcore-$BUILD_TARGET/src/bench/bench_dash.exe
      - build-ci/dashcore-$BUILD_TARGET/src/qt/test/test_dash-qt
      - build-ci/dashcore-$BUILD_TARGET/src/qt/test/test_dash-qt.exe
      - build-ci/dashcore-$BUILD_TARGET/src/test/test_dash
      - build-ci/dashcore-$BUILD_TARGET/src/test/test_dash.exe
    expire_in: 3 days

.test-template:
  stage: test
  extends: .base-template
  variables:
    INTEGRATION_TESTS_ARGS: "--extended --exclude feature_pruning,feature_dbcrash"
  script:
    - echo "INTEGRATION_TESTS_ARGS=${INTEGRATION_TESTS_ARGS}"
    - ./ci/dash/test_integrationtests.sh $INTEGRATION_TESTS_ARGS
  after_script:
    - mkdir -p $CI_PROJECT_DIR/testlogs
  artifacts:
    name: testlogs
    when: always
    paths:
      - testlogs
    expire_in: 3 days

.skip-in-fast-mode-template:
  rules:
    - if: '$FAST_MODE == "true"'
      when: never
    - when: always

###

arm-linux-gnueabihf:
  extends: .build-depends-template
  variables:
    HOST: arm-linux-gnueabihf

x86_64-w64-mingw32:
  extends:
    - .build-depends-template
    - .skip-in-fast-mode-template
  variables:
    HOST: x86_64-w64-mingw32

i686-pc-linux-gnu:
  extends:
    - .build-depends-template
    - .skip-in-fast-mode-template
  variables:
    HOST: i686-pc-linux-gnu

x86_64-unknown-linux-gnu-debug:
  extends: .build-depends-template
  variables:
    HOST: x86_64-unknown-linux-gnu
    DEP_OPTS: "DEBUG=1"

x86_64-unknown-linux-gnu-nowallet:
  extends:
    - .build-depends-template
    - .skip-in-fast-mode-template
  variables:
    HOST: x86_64-unknown-linux-gnu
    DEP_OPTS: "NO_WALLET=1"

x86_64-unknown-linux-gnu-release:
  extends:
    - .build-depends-template
    - .skip-in-fast-mode-template
  variables:
    HOST: x86_64-unknown-linux-gnu
    DEP_OPTS: "NO_UPNP=1"

x86_64-apple-darwin19:
  extends:
    - .build-depends-template
    - .skip-in-fast-mode-template
  variables:
    HOST: x86_64-apple-darwin19

###

arm-linux-build:
  extends: .build-template
  needs:
    - arm-linux-gnueabihf
  variables:
    BUILD_TARGET: arm-linux

win64-build:
  extends:
    - .build-template
    - .skip-in-fast-mode-template
  needs:
    - x86_64-w64-mingw32
  variables:
    BUILD_TARGET: win64

linux32-build:
  extends:
    - .build-template
    - .skip-in-fast-mode-template
  needs:
    - i686-pc-linux-gnu
  variables:
    BUILD_TARGET: linux32

linux32_ubsan-build:
  extends:
    - .build-template
    - .skip-in-fast-mode-template
  needs:
    - i686-pc-linux-gnu
  variables:
    BUILD_TARGET: linux32_ubsan

linux64-build:
  extends: .build-template
  needs:
    - x86_64-unknown-linux-gnu-debug
  variables:
    BUILD_TARGET: linux64

linux64_cxx20-build:
  extends: .build-template
  needs:
    - x86_64-unknown-linux-gnu-debug
  variables:
    BUILD_TARGET: linux64_cxx20

linux64_fuzz-build:
  extends: .build-template
  needs:
    - x86_64-unknown-linux-gnu-debug
  variables:
    BUILD_TARGET: linux64_fuzz

linux64_tsan-build:
  extends:
    - .build-template
    - .skip-in-fast-mode-template
  needs:
    - x86_64-unknown-linux-gnu-debug
  variables:
    BUILD_TARGET: linux64_tsan

linux64_nowallet-build:
  extends:
    - .build-template
    - .skip-in-fast-mode-template
  needs:
    - x86_64-unknown-linux-gnu-nowallet
  variables:
    BUILD_TARGET: linux64_nowallet

linux64_release-build:
  extends:
    - .build-template
    - .skip-in-fast-mode-template
  needs:
    - x86_64-unknown-linux-gnu-release
  variables:
    BUILD_TARGET: linux64_release

mac-build:
  extends:
    - .build-template
    - .skip-in-fast-mode-template
  needs:
    - x86_64-apple-darwin19
  variables:
    BUILD_TARGET: mac

###

linux32-test:
  extends:
    - .test-template
    - .skip-in-fast-mode-template
  needs:
    - linux32-build
  variables:
    BUILD_TARGET: linux32

linux32_ubsan-test:
  extends:
    - .test-template
    - .skip-in-fast-mode-template
  needs:
    - linux32_ubsan-build
  variables:
    BUILD_TARGET: linux32_ubsan

linux64-test:
  extends: .test-template
  needs:
    - linux64-build
  variables:
    BUILD_TARGET: linux64

linux64_tsan-test:
  extends:
    - .test-template
    - .skip-in-fast-mode-template
  needs:
    - linux64_tsan-build
  variables:
    BUILD_TARGET: linux64_tsan
<commit_msg>ci: exclude fuzzing harnesses from resulting build artifact archive<commit_after>image: "ubuntu:bionic"

variables:
  DOCKER_DRIVER: overlay2
  FAST_MODE: "false" # when "true", only run linter on arm and unit/functional tests on linux64, skip everything else

workflow:
  rules:
    - when: always

stages:
  - builder-image
  - build-depends
  - build
  - test

builder-image:
  stage: builder-image
  image: docker:19.03.5
  services:
    - docker:19.03.5-dind
  variables:
    DOCKER_HOST: "tcp://docker:2375"
    DOCKER_DRIVER: overlay2
    DOCKER_TLS_CERTDIR: ""
  before_script:
    - echo $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin $CI_REGISTRY
  script:
    - cd contrib/containers/ci
    - docker pull $CI_REGISTRY_IMAGE:builder-$CI_COMMIT_REF_SLUG || true
    - docker pull $CI_REGISTRY_IMAGE:builder-develop || true
    - docker build --cache-from $CI_REGISTRY_IMAGE:builder-$CI_COMMIT_REF_SLUG --cache-from $CI_REGISTRY_IMAGE:builder-develop -t $CI_REGISTRY_IMAGE:builder-$CI_COMMIT_REF_SLUG -f Dockerfile .
    - docker push $CI_REGISTRY_IMAGE:builder-$CI_COMMIT_REF_SLUG

.build-depends-template:
  stage: build-depends
  image: $CI_REGISTRY_IMAGE:builder-$CI_COMMIT_REF_SLUG
  variables:
    SDK_URL: https://bitcoincore.org/depends-sources/sdks
    XCODE_VERSION: "12.1"
    XCODE_BUILD_ID: 12A7403
    MAKEJOBS: -j4
  before_script:
    - echo HOST=$HOST
    - |
      if [ "$HOST" = "x86_64-apple-darwin19" ]; then
        mkdir -p depends/SDKs
        mkdir -p depends/sdk-sources
        OSX_SDK_BASENAME="Xcode-${XCODE_VERSION}-${XCODE_BUILD_ID}-extracted-SDK-with-libcxx-headers.tar.gz"
        OSX_SDK_PATH="depends/sdk-sources/${OSX_SDK_BASENAME}"
        if [ ! -f "$OSX_SDK_PATH" ]; then
          echo "Downloading MacOS SDK"
          curl --location --fail "${SDK_URL}/${OSX_SDK_BASENAME}" -o "$OSX_SDK_PATH"
        fi
        if [ -f "$OSX_SDK_PATH" ]; then
          echo "Extracting MacOS SDK"
          tar -C depends/SDKs -xf "$OSX_SDK_PATH"
        fi
      fi
  script:
    - make $MAKEJOBS -C depends HOST=$HOST $DEP_OPTS
  cache:
    # Let all branches share the same cache, which is ok because the depends subsystem is able to handle this properly (it works with hashes of all scripts)
    key:
      files:
        - contrib/containers/ci/Dockerfile
      prefix: ${CI_JOB_NAME}
    paths:
      - depends/built
      - depends/sdk-sources
  artifacts:
    name: depends
    when: on_success
    paths:
      - depends/$HOST
      - depends/SDKs

.base-template:
  image: $CI_REGISTRY_IMAGE:builder-$CI_COMMIT_REF_SLUG
  before_script:
    - export CACHE_DIR=$CI_PROJECT_DIR/cache
    - echo BUILD_TARGET=$BUILD_TARGET
    - source ./ci/dash/matrix.sh

    # Setup some environment variables
    - |
      if [ "$CI_EXTERNAL_PULL_REQUEST_IID" != "" ]; then
        export PULL_REQUEST="true"
      else
        # CI_EXTERNAL_PULL_REQUEST_IID is false every time until https://gitlab.com/gitlab-org/gitlab/issues/5667 is done
        # Until then, we're using https://github.com/brndnmtthws/labhub atm to mirror Github pull requests as branches into Gitlab,
        # which allows us to use Gitlab CI for Github. The following check detects such mirrored branches.
        if [[ $CI_COMMIT_REF_NAME =~ ^pr-[^/]*/[^/]*/[^/]*/[^/]*$ ]]; then
          export PULL_REQUEST="true"
          # CI_COMMIT_BEFORE_SHA is also invalid until #5667 is implemented, so we need to figure it out by ourself
          git fetch origin develop
          export CI_COMMIT_BEFORE_SHA="$(git merge-base origin/develop HEAD)"
        else
          export PULL_REQUEST="false"
        fi
      fi
    - export COMMIT_RANGE="$CI_COMMIT_BEFORE_SHA..$CI_COMMIT_SHA"
    - export JOB_NUMBER="$CI_JOB_ID"
    - export HOST_SRC_DIR=$CI_PROJECT_DIR
    - echo PULL_REQUEST=$PULL_REQUEST COMMIT_RANGE=$COMMIT_RANGE HOST_SRC_DIR=$HOST_SRC_DIR CACHE_DIR=$CACHE_DIR
    - echo "Commit log:" && git log --format=fuller -1

.build-template:
  stage: build
  extends: .base-template
  script:
    - ./ci/dash/build_src.sh
    - ./ci/dash/test_unittests.sh # Run unit tests in build stage to avoid creating too many parallel jobs
  cache:
    # Let all branches share the same cache, which is ok because ccache is able to handle it
    key:
      files:
        - contrib/containers/ci/Dockerfile
      prefix: ${CI_JOB_NAME}
    paths:
      - cache/ccache
  artifacts:
    name: binaries
    when: always
    paths:
      - build-ci
    # Exclude some less important binaries to reduce the size of the artifacts
    exclude:
      - build-ci/dashcore-$BUILD_TARGET/src/bench/bench_dash
      - build-ci/dashcore-$BUILD_TARGET/src/bench/bench_dash.exe
      - build-ci/dashcore-$BUILD_TARGET/src/qt/test/test_dash-qt
      - build-ci/dashcore-$BUILD_TARGET/src/qt/test/test_dash-qt.exe
      - build-ci/dashcore-$BUILD_TARGET/src/test/test_dash
      - build-ci/dashcore-$BUILD_TARGET/src/test/test_dash.exe
      - build-ci/dashcore-$BUILD_TARGET/src/test/fuzz/*
    expire_in: 3 days

.test-template:
  stage: test
  extends: .base-template
  variables:
    INTEGRATION_TESTS_ARGS: "--extended --exclude feature_pruning,feature_dbcrash"
  script:
    - echo "INTEGRATION_TESTS_ARGS=${INTEGRATION_TESTS_ARGS}"
    - ./ci/dash/test_integrationtests.sh $INTEGRATION_TESTS_ARGS
  after_script:
    - mkdir -p $CI_PROJECT_DIR/testlogs
  artifacts:
    name: testlogs
    when: always
    paths:
      - testlogs
    expire_in: 3 days

.skip-in-fast-mode-template:
  rules:
    - if: '$FAST_MODE == "true"'
      when: never
    - when: always

###

arm-linux-gnueabihf:
  extends: .build-depends-template
  variables:
    HOST: arm-linux-gnueabihf

x86_64-w64-mingw32:
  extends:
    - .build-depends-template
    - .skip-in-fast-mode-template
  variables:
    HOST: x86_64-w64-mingw32

i686-pc-linux-gnu:
  extends:
    - .build-depends-template
    - .skip-in-fast-mode-template
  variables:
    HOST: i686-pc-linux-gnu

x86_64-unknown-linux-gnu-debug:
  extends: .build-depends-template
  variables:
    HOST: x86_64-unknown-linux-gnu
    DEP_OPTS: "DEBUG=1"

x86_64-unknown-linux-gnu-nowallet:
  extends:
    - .build-depends-template
    - .skip-in-fast-mode-template
  variables:
    HOST: x86_64-unknown-linux-gnu
    DEP_OPTS: "NO_WALLET=1"

x86_64-unknown-linux-gnu-release:
  extends:
    - .build-depends-template
    - .skip-in-fast-mode-template
  variables:
    HOST: x86_64-unknown-linux-gnu
    DEP_OPTS: "NO_UPNP=1"

x86_64-apple-darwin19:
  extends:
    - .build-depends-template
    - .skip-in-fast-mode-template
  variables:
    HOST: x86_64-apple-darwin19

###

arm-linux-build:
  extends: .build-template
  needs:
    - arm-linux-gnueabihf
  variables:
    BUILD_TARGET: arm-linux

win64-build:
  extends:
    - .build-template
    - .skip-in-fast-mode-template
  needs:
    - x86_64-w64-mingw32
  variables:
    BUILD_TARGET: win64

linux32-build:
  extends:
    - .build-template
    - .skip-in-fast-mode-template
  needs:
    - i686-pc-linux-gnu
  variables:
    BUILD_TARGET: linux32

linux32_ubsan-build:
  extends:
    - .build-template
    - .skip-in-fast-mode-template
  needs:
    - i686-pc-linux-gnu
  variables:
    BUILD_TARGET: linux32_ubsan

linux64-build:
  extends: .build-template
  needs:
    - x86_64-unknown-linux-gnu-debug
  variables:
    BUILD_TARGET: linux64

linux64_cxx20-build:
  extends: .build-template
  needs:
    - x86_64-unknown-linux-gnu-debug
  variables:
    BUILD_TARGET: linux64_cxx20

linux64_fuzz-build:
  extends: .build-template
  needs:
    - x86_64-unknown-linux-gnu-debug
  variables:
    BUILD_TARGET: linux64_fuzz

linux64_tsan-build:
  extends:
    - .build-template
    - .skip-in-fast-mode-template
  needs:
    - x86_64-unknown-linux-gnu-debug
  variables:
    BUILD_TARGET: linux64_tsan

linux64_nowallet-build:
  extends:
    - .build-template
    - .skip-in-fast-mode-template
  needs:
    - x86_64-unknown-linux-gnu-nowallet
  variables:
    BUILD_TARGET: linux64_nowallet

linux64_release-build:
  extends:
    - .build-template
    - .skip-in-fast-mode-template
  needs:
    - x86_64-unknown-linux-gnu-release
  variables:
    BUILD_TARGET: linux64_release

mac-build:
  extends:
    - .build-template
    - .skip-in-fast-mode-template
  needs:
    - x86_64-apple-darwin19
  variables:
    BUILD_TARGET: mac

###

linux32-test:
  extends:
    - .test-template
    - .skip-in-fast-mode-template
  needs:
    - linux32-build
  variables:
    BUILD_TARGET: linux32

linux32_ubsan-test:
  extends:
    - .test-template
    - .skip-in-fast-mode-template
  needs:
    - linux32_ubsan-build
  variables:
    BUILD_TARGET: linux32_ubsan

linux64-test:
  extends: .test-template
  needs:
    - linux64-build
  variables:
    BUILD_TARGET: linux64

linux64_tsan-test:
  extends:
    - .test-template
    - .skip-in-fast-mode-template
  needs:
    - linux64_tsan-build
  variables:
    BUILD_TARGET: linux64_tsan

{'fraction_non_alphanumeric': 0.10952327157704474, 'fraction_numerical': 0.024175327609579755, 'mean_word_length': 2.7758583919812327, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 6, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7006523', 'n_tokens_mistral': 6824, 'n_tokens_neox': 6441, 'n_words': 1205}