stages:
  - test
  - build
  - publish
  - optional

image:                             ${REGISTRY}/parity-ci-linux:latest

variables:
  GIT_STRATEGY:                    fetch
  GIT_SUBMODULE_STRATEGY:          recursive
  GIT_DEPTH:                       3
  CI_SERVER_NAME:                  "GitLab CI"
  CARGO_HOME:                      "/ci-cache/${CI_PROJECT_NAME}/cargo/${CI_JOB_NAME}"
  CARGO_TARGET:                    x86_64-unknown-linux-gnu
  CARGO_INCREMENTAL:               0
  REGISTRY:                        registry.parity.io/parity/infrastructure/scripts

.releaseable_branches:             # list of git refs for building GitLab artifacts (think "pre-release binaries")
  only:                            &releaseable_branches
    - stable
    - beta
    - tags
    - schedules

.collect_artifacts:                &collect_artifacts
  artifacts:
    name:                          "${CI_JOB_NAME}_${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}"
    when:                          on_success
    expire_in:                     1 mos
    paths:
      - artifacts/
      - tools/

.docker-cache-status:              &docker-cache-status
  dependencies:                    []
  interruptible:                   true
  before_script:
    - rustup show
    - cargo --version
  retry:
    max: 2
    when:
      - runner_system_failure
      - unknown_failure
      - api_failure
  tags:
    - linux-docker

.build-on-linux:                   &build-on-linux
  stage:                           build
  <<:                              *docker-cache-status
  <<:                              *collect_artifacts
  script:
    - scripts/gitlab/build-linux.sh
  after_script:
    - mkdir -p tools
    - cp -r scripts/docker/hub/* ./tools
    - cp scripts/gitlab/publish-snap.sh ./tools
    - cp scripts/gitlab/publish-onchain.sh ./tools
    - cp scripts/gitlab/safe-curl.sh ./tools
    - echo v"$(sed -r -n '1,/^version/s/^version\s*=\s*"([^"]+)".*$/\1/p' Cargo.toml)" |
      tee ./tools/VERSION
    - echo "$(sed -r -n '1,/^track/s/^track\s*=\s*"([^"]+)".*$/\1/p' ./util/version/Cargo.toml)" |
      tee ./tools/TRACK


cargo-check 0 3:
  stage:                           test
  <<:                              *docker-cache-status
  script:
    - time cargo check --target $CARGO_TARGET --locked --no-default-features --verbose --color=always
    - sccache --show-stats

cargo-check 1 3:
  stage:                           test
  <<:                              *docker-cache-status
  script:
    - time cargo check --target $CARGO_TARGET --locked --manifest-path util/io/Cargo.toml --no-default-features --verbose --color=always
    - sccache --show-stats

cargo-check 2 3:
  stage:                           test
  <<:                              *docker-cache-status
  script:
    - time cargo check --target $CARGO_TARGET --locked --manifest-path util/io/Cargo.toml --features "mio" --verbose --color=always
    - sccache --show-stats

cargo-check-evmbin:
  stage:                           test
  <<:                              *docker-cache-status
  script:
    - time cargo check -p evmbin --target $CARGO_TARGET --locked --verbose --color=always
    - sccache --show-stats

cargo-check-benches:
  stage:                           test
  <<:                              *docker-cache-status
  script:
    - time cargo check --all --benches --target $CARGO_TARGET --locked --verbose --color=always
    - sccache --show-stats

cargo-audit:
  stage:                           test
  <<:                              *docker-cache-status
  script:
    - cargo audit
  allow_failure:                   true # failed cargo audit shouldn't prevent a PR from being merged

validate-chainspecs:
  stage:                           test
  <<:                              *docker-cache-status
  script:
    - ./scripts/gitlab/validate-chainspecs.sh

test-linux:
  stage:                           build
  <<:                              *docker-cache-status
  script:
    - ./scripts/gitlab/test-linux.sh stable

test-linux-beta:
  stage:                           build
  only:                            *releaseable_branches
  <<:                              *docker-cache-status
  script:
    - ./scripts/gitlab/test-linux.sh beta

test-linux-nightly:
  stage:                           build
  only:                            *releaseable_branches
  <<:                              *docker-cache-status
  script:
    - ./scripts/gitlab/test-linux.sh nightly
  allow_failure:                   true

build-linux:
  <<:                              *build-on-linux
  only:                            *releaseable_branches

build-linux-i386:
  <<:                              *build-on-linux
  only:                            *releaseable_branches
  image:                           ${REGISTRY}/parity-ci-i386:latest
  variables:
    CARGO_TARGET:                  i686-unknown-linux-gnu

build-linux-arm64:
  <<:                              *build-on-linux
  only:                            *releaseable_branches
  image:                           ${REGISTRY}/parity-ci-arm64:latest
  variables:
    CARGO_TARGET:                  aarch64-unknown-linux-gnu

build-linux-armhf:
  <<:                              *build-on-linux
  only:                            *releaseable_branches
  image:                           ${REGISTRY}/parity-ci-armhf:latest
  variables:
    CARGO_TARGET:                  armv7-unknown-linux-gnueabihf

build-darwin:
  stage:                           build
  <<:                              *collect_artifacts
  only:                            *releaseable_branches
  variables:
    CARGO_TARGET:                  x86_64-apple-darwin
    CARGO_HOME:                    "${CI_PROJECT_DIR}/.cargo"
    CC:                            gcc
    CXX:                           g++
  script:
    - scripts/gitlab/build-linux.sh
  tags:
    - rust-osx

build-windows:
  stage:                           build
  <<:                              *collect_artifacts
  only:                            *releaseable_branches
  variables:
    CARGO_TARGET:                  x86_64-pc-windows-msvc
    CARGO_HOME:                    "C:/ci-cache/parity-ethereum/cargo/$CI_JOB_NAME"
    GIT_SUBMODULE_STRATEGY:        none
  script:
    - sh scripts/gitlab/build-windows.sh
  tags:
    - rust-windows

publish-docker:
  stage:                           publish
  only:                            *releaseable_branches
  except:
    - nightly
  when:                            manual
  dependencies:
    - build-linux
  environment:
    name: parity-build
  cache:                           {}
  image:                           docker:stable
  services:
    - docker:dind
  variables:
    GIT_STRATEGY:                  none
    DOCKER_HOST:                   tcp://localhost:2375
    DOCKER_DRIVER:                 overlay2
    GIT_STRATEGY:                  none
    # DOCKERFILE:                  tools/Dockerfile
    # CONTAINER_IMAGE:             parity/parity
  script:
    - ./tools/publish-docker.sh
  tags:
    - kubernetes-parity-build

publish-snap-nightly:              &publish-snap
  stage:                           publish
  only:
    - nightly
  image:                           snapcore/snapcraft
  variables:
    GIT_STRATEGY:                  none
    BUILD_ARCH:                    amd64
  cache:                           {}
  dependencies:
    - build-linux
  tags:
    - linux-docker
  script:
    - ./tools/publish-snap.sh

publish-snap-manually:
  <<:                              *publish-snap
  only:                            *releaseable_branches
  when:                            manual

publish-snap-i386-nightly:         &publish-snap-i386
  <<:                              *publish-snap
  variables:
    BUILD_ARCH:                    i386
    CARGO_TARGET:                  i686-unknown-linux-gnu
  dependencies:
    - build-linux-i386

publish-snap-i386-manually:
  <<:                              *publish-snap-i386
  only:                            *releaseable_branches
  when:                            manual

publish-snap-arm64-nightly:        &publish-snap-arm64
  <<:                              *publish-snap
  variables:
    BUILD_ARCH:                    arm64
    CARGO_TARGET:                  aarch64-unknown-linux-gnu
  dependencies:
    - build-linux-arm64

publish-snap-arm64-manually:
  <<:                              *publish-snap-arm64
  only:                            *releaseable_branches
  when:                            manual

publish-snap-armhf-nightly:        &publish-snap-armhf
  <<:                              *publish-snap
  variables:
    BUILD_ARCH:                    armhf
    CARGO_TARGET:                  armv7-unknown-linux-gnueabihf
  dependencies:
    - build-linux-armhf

publish-snap-armhf-manually:
  <<:                              *publish-snap-armhf
  only:                            *releaseable_branches
  when:                            manual

publish-onchain-nightly:           &publish-onchain
  stage:                           publish
  only:
    - nightly
  cache:                           {}
  variables:
    GIT_STRATEGY:                  none
  dependencies:
    - build-linux
    - build-darwin
    - build-windows
  script:
    - ./tools/publish-onchain.sh
  tags:
    - linux-docker

publish-onchain-manually:
  <<:                              *publish-onchain
  only:                            *releaseable_branches
  when:                            manual

publish-release-awss3-nightly:     &publish-release-awss3
  image:                           ${REGISTRY}/awscli:latest
  stage:                           publish
  only:
    - nightly
  variables:
    GIT_STRATEGY:                  none
  cache:                           {}
  dependencies:
    - build-linux
    - build-darwin
    - build-windows
  script:
    - echo "__________Push binaries to AWS S3____________"
    - case "${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}" in
       (beta|stable|nightly)
         export BUCKET=releases.parity.io/ethereum;
         ;;
       (*)
         export BUCKET=builds-parity;
         ;;
     esac
    - aws s3 sync ./artifacts s3://${BUCKET}/${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}/
    - echo "__________Read from S3____________"
    - aws s3 ls s3://${BUCKET}/${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}} --recursive --human-readable --summarize
  tags:
    - linux-docker

publish-release-awss3-manually:
  <<:                              *publish-release-awss3
  only:                            *releaseable_branches
  when:                            manual

publish-docs:
  stage:                           publish
  image:                           ${REGISTRY}/parity-ci-docs:latest
  only:
    - tags
  except:
    - nightly
  when:                            manual
  cache:                           {}
  dependencies:                    []
  script:
    - scripts/gitlab/publish-docs.sh
  tags:
    - linux-docker
  allow_failure:                   true

publish-av-whitelist:
  stage:                          publish
  variables:
    GIT_STRATEGY:                  none
  only:                           *releaseable_branches
  except:
    - nightly
  when:                           manual
  cache:                          {}
  dependencies:
    - build-windows
  script:
    - scripts/gitlab/publish-av-whitelists.sh
  tags:
    - linux-docker
