# .gitlab-ci.yml # # polkadot # # pipelines can be triggered manually in the web # setting DEPLOY_TAG will only deploy the tagged image stages: - test - build - publish - deploy image: parity/rust-builder:latest variables: GIT_STRATEGY: fetch GIT_DEPTH: 100 CARGO_HOME: "/ci-cache/${CI_PROJECT_NAME}/cargo/${CI_JOB_NAME}" SCCACHE_DIR: "/ci-cache/${CI_PROJECT_NAME}/sccache" CI_SERVER_NAME: "GitLab CI" DOCKER_OS: "debian:stretch" ARCH: "x86_64" .collect-artifacts: &collect-artifacts artifacts: name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}" when: on_success expire_in: 7 days paths: - artifacts/ .kubernetes-env: &kubernetes-env tags: - kubernetes-parity-build environment: name: parity-build .docker-env: &docker-env retry: max: 2 when: - runner_system_failure - unknown_failure - api_failure interruptible: true dependencies: [] tags: - linux-docker .compiler_info: &compiler_info before_script: - rustup show - cargo --version - sccache -s .build-refs: &build-refs only: - master - schedules - web - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 - kusama-nightly-staging except: variables: - $DEPLOY_TAG .test-refs: &test-refs only: - master - schedules - web - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 - kusama-nightly-staging - /^[0-9]+$/ except: variables: - $DEPLOY_TAG #### stage: test check-runtime: stage: test image: parity/tools:latest <<: *kubernetes-env only: - /^[0-9]+$/ variables: GITLAB_API: "https://gitlab.parity.io/api/v4" GITHUB_API_PROJECT: "parity%2Finfrastructure%2Fgithub-api" script: - ./scripts/gitlab/check_runtime.sh interruptible: true allow_failure: true check-line-width: stage: test image: parity/tools:latest <<: *kubernetes-env only: - /^[0-9]+$/ script: - ./scripts/gitlab/check_line_width.sh interruptible: true allow_failure: true alert-pending-release: stage: test image: parity/tools:latest only: - tags - /^v[0-9]+\.[0-9]+\.[0-9]+.*$/ # i.e. v1.0.1, v2.1.0rc1 script: - ./scripts/gitlab/alert_pending_release.sh interruptible: true allow_failure: true test-linux-stable: &test stage: test <<: *test-refs <<: *docker-env <<: *compiler_info variables: RUST_TOOLCHAIN: stable # Enable debug assertions since we are running optimized builds for testing # but still want to have debug assertions. RUSTFLAGS: -Cdebug-assertions=y TARGET: native script: - | test "${CI_COMMIT_REF_NAME}" = "kusama-nightly-staging" && ( echo "kusama-nightly-staging: change Cargo.toml to build against substrate:kusama-nightly-staging" find . -name Cargo.toml -exec sed -i -r -e ':github.com/paritytech/substrate": { s:branch = "polkadot-(master|testing)":branch = "kusama-nightly-staging":; s:github.com/paritytech/substrate:gitlab.parity.io/parity/substrate.git:}' '{}' \; sed -i -r 's:github.com/paritytech/substrate\?branch=polkadot-(master|testing):gitlab.parity.io/parity/substrate.git?branch=kusama-nightly-staging:' Cargo.lock time cargo test --all --release --verbose) || \ time cargo test --all --release --verbose --locked - sccache -s check-web-wasm: &test stage: test <<: *test-refs <<: *docker-env <<: *compiler_info script: # WASM support is in progress. As more and more crates support WASM, we # should add entries here. See https://github.com/paritytech/polkadot/issues/625 - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path runtime/polkadot/Cargo.toml - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path runtime/kusama/Cargo.toml - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path erasure-coding/Cargo.toml - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path parachain/Cargo.toml - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path primitives/Cargo.toml - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path rpc/Cargo.toml - time cargo build --locked --target=wasm32-unknown-unknown --manifest-path statement-table/Cargo.toml - sccache -s build-linux-release: &build stage: build <<: *collect-artifacts <<: *build-refs <<: *docker-env <<: *compiler_info script: - | test "${CI_COMMIT_REF_NAME}" = "kusama-nightly-staging" && ( echo "kusama-nightly-staging: change Cargo.toml to build against substrate:kusama-nightly-staging" find . -name Cargo.toml -exec sed -i -r -e ':github.com/paritytech/substrate": { s:branch = "polkadot-(master|testing)":branch = "kusama-nightly-staging":; s:github.com/paritytech/substrate:gitlab.parity.io/parity/substrate.git:}' '{}' \; sed -i -r 's:github.com/paritytech/substrate\?branch=polkadot-(master|testing):gitlab.parity.io/parity/substrate.git?branch=kusama-nightly-staging:' Cargo.lock ) - time cargo build --release --verbose - mkdir -p ./artifacts - mv ./target/release/polkadot ./artifacts/. - sha256sum ./artifacts/polkadot | tee ./artifacts/polkadot.sha256 - VERSION="${CI_COMMIT_REF_NAME}" # will be tag or branch name - if [ "${CI_COMMIT_TAG}" ]; then EXTRATAG="latest"; else EXTRATAG="$(./artifacts/polkadot --version | sed -n -r 's/^polkadot ([0-9.]+.*-[0-9a-f]{7,13})-.*$/\1/p')"; EXTRATAG="${CI_COMMIT_REF_NAME}-${EXTRATAG}-$(cut -c 1-8 ./artifacts/polkadot.sha256)"; fi - echo "Polkadot version = ${VERSION} (EXTRATAG ${EXTRATAG})" - echo -n ${VERSION} > ./artifacts/VERSION - echo -n ${EXTRATAG} > ./artifacts/EXTRATAG - cp -r scripts/docker/* ./artifacts - sccache -s .publish-build: &publish-build stage: publish dependencies: - build-linux-release cache: {} <<: *build-refs <<: *kubernetes-env before_script: - test -s ./artifacts/VERSION || exit 1 - test -s ./artifacts/EXTRATAG || exit 1 - VERSION="$(cat ./artifacts/VERSION)" - EXTRATAG="$(cat ./artifacts/EXTRATAG)" - echo "Polkadot version = ${VERSION} (EXTRATAG ${EXTRATAG})" publish-docker-release: <<: *publish-build image: docker:stable services: - docker:dind <<: *collect-artifacts variables: DOCKER_HOST: tcp://localhost:2375 DOCKER_DRIVER: overlay2 GIT_STRATEGY: none # DOCKERFILE: scripts/docker/Dockerfile CONTAINER_IMAGE: parity/polkadot script: - test "$Docker_Hub_User_Parity" -a "$Docker_Hub_Pass_Parity" || ( echo "no docker credentials provided"; exit 1 ) - docker login -u "$Docker_Hub_User_Parity" -p "$Docker_Hub_Pass_Parity" - docker info - cd ./artifacts - docker build --build-arg VCS_REF="${CI_COMMIT_SHA}" --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" --tag $CONTAINER_IMAGE:$VERSION --tag $CONTAINER_IMAGE:$EXTRATAG . - docker push $CONTAINER_IMAGE:$VERSION - docker push $CONTAINER_IMAGE:$EXTRATAG after_script: - docker logout # only VERSION information is needed for the deployment - find ./artifacts/ -depth -not -name VERSION -not -name artifacts -delete publish-s3-release: <<: *publish-build image: parity/awscli:latest variables: GIT_STRATEGY: none BUCKET: "releases.parity.io" PREFIX: "polkadot/${ARCH}-${DOCKER_OS}" script: - echo "uploading objects to ${BUCKET}/${PREFIX}/${VERSION}" - aws s3 sync ./artifacts/ s3://${BUCKET}/${PREFIX}/${VERSION}/ - echo "update objects at ${BUCKET}/${PREFIX}/${EXTRATAG}/${name}" - for file in ./artifacts/*; do name="$(basename ${file})"; aws s3api copy-object --copy-source ${BUCKET}/${PREFIX}/${VERSION}/${name} --bucket ${BUCKET} --key ${PREFIX}/${EXTRATAG}/${name}; done after_script: - aws s3 ls s3://${BUCKET}/${PREFIX}/${EXTRATAG}/ --recursive --human-readable --summarize .deploy-template: &deploy stage: deploy when: manual cache: {} retry: 1 image: parity/kubetools:latest <<: *build-refs tags: # this is the runner that is used to deploy it - kubernetes-parity-build before_script: - test -z "${DEPLOY_TAG}" && test "${CI_COMMIT_TAG}" -o -f ./artifacts/VERSION && DEPLOY_TAG="${CI_COMMIT_TAG:-$(cat ./artifacts/VERSION)}" - test "${DEPLOY_TAG}" || ( echo "Neither DEPLOY_TAG nor VERSION information available"; exit 1 ) script: - echo "Polkadot version = ${DEPLOY_TAG}" # or use helm to render the template - helm template --values ./scripts/kubernetes/values.yaml --set image.tag=${DEPLOY_TAG} ./scripts/kubernetes | kubectl apply -f - --dry-run=false - echo "# polkadot namespace" - kubectl -n polkadot get all - echo "# polkadot's nodes' external ip addresses:" - kubectl get nodes -l node=polkadot -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{range @.status.addresses[?(@.type=="ExternalIP")]}{.address}{"\n"}{end}' - echo "# polkadots' nodes" - kubectl -n polkadot get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{"\n"}{end}' .deploy-cibuild: &deploy-cibuild <<: *deploy dependencies: - publish-docker-release .deploy-tag: &deploy-tag <<: *deploy only: variables: - $DEPLOY_TAG except: variables: - $DEPLOY_TAG == "" # have environment:url eventually point to the logs deploy-ew3: <<: *deploy-cibuild environment: name: parity-prod-ew3 deploy-ue1: <<: *deploy-cibuild environment: name: parity-prod-ue1 deploy-ew3-tag: <<: *deploy-tag environment: name: parity-prod-ew3 deploy-ue1-tag: <<: *deploy-tag environment: name: parity-prod-ue1 deploy-polkasync-kusama: stage: deploy cache: {} retry: 1 image: parity/tools:latest only: - kusama-nightly-staging tags: - kubernetes-parity-build variables: GITLAB_API: "https://gitlab.parity.io/api/v4" GITHUB_API_PROJECT: "parity%2Finfrastructure%2Fparity-testnet" GIT_STRATEGY: none allow_failure: true script: - | echo "kusama-nightly-staging: triggering roll-out on parity-testnet" curl -sS -X POST \ -F "token=${CI_JOB_TOKEN}" \ -F "ref=master" \ -F "variables[POLKADOT_BUILD_REF]=${CI_COMMIT_REF_NAME}" \ ${GITLAB_API}/projects/${GITHUB_API_PROJECT}/trigger/pipeline | jq .