# .gitlab-ci.yml stages: - merge-test - test - build - publish - deploy image: parity/rust:nightly variables: CI_SERVER_NAME: "GitLab CI" CARGO_HOME: "${CI_PROJECT_DIR}/.cargo" # have OS based build containers in the future DOCKER_OS: "ubuntu:xenial" ARCH: "x86_64" cache: {} .collect_artifacts: &collect_artifacts artifacts: name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}" when: on_success expire_in: 7 days paths: - artifacts/ .kubernetes_build: &kubernetes_build tags: - kubernetes-parity-build environment: name: parity-build #### stage: merge-test check:merge:conflict: stage: merge-test image: parity/tools:latest cache: {} <<: *kubernetes_build only: - /^[0-9]+$/ variables: GITHUB_API: "https://api.github.com" GITLAB_API: "https://gitlab.parity.io/api/v4" GITHUB_API_PROJECT: "parity%2Finfrastructure%2Fgithub-api" script: - ./scripts/gitlab/check_merge_conflict.sh #### stage: test check:runtime: stage: test image: parity/tools:latest cache: {} <<: *kubernetes_build 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 test:rust:stable: &test stage: test cache: key: "${CI_JOB_NAME}-test" paths: - ${CARGO_HOME} - ./target 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 tags: - linux-docker only: - tags - master - schedules - web - /^[0-9]+$/ before_script: - test -d ${CARGO_HOME} -a -d ./target && echo "build cache size:" && du -h --max-depth=2 ${CARGO_HOME} ./target - ./scripts/build.sh script: - time cargo test --all --release --verbose --locked .build_only: &build_only only: - master - tags - web #### stage: build build:rust:linux:release: &build stage: build cache: key: "${CI_JOB_NAME}-build" paths: - ${CARGO_HOME} - ./target <<: *collect_artifacts <<: *build_only tags: - linux-docker before_script: - ./scripts/build.sh script: - time cargo build --release --verbose - mkdir -p ./artifacts - mv ./target/release/substrate ./artifacts/. - echo -n "Substrate version = " - if [ "${CI_COMMIT_TAG}" ]; then echo "${CI_COMMIT_TAG}" | tee ./artifacts/VERSION; else ./artifacts/substrate --version | sed -n -r 's/^substrate ([0-9.]+.*-[0-9a-f]{7,13})-.*$/\1/p' | tee ./artifacts/VERSION; fi - sha256sum ./artifacts/substrate | tee ./artifacts/substrate.sha256 - echo "\n# building node-template\n" - ./scripts/node-template-release.sh ./artifacts/substrate-node-template.tar.gz - cp -r scripts/docker/* ./artifacts build:rust:doc:release: &build stage: build allow_failure: true artifacts: name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}-doc" when: on_success expire_in: 7 days paths: - ./crate-docs <<: *build_only tags: - linux-docker script: - rm -f ./crate-docs/index.html # use it as an indicator if the job succeeds - time cargo doc --release --verbose - cp -R ./target/doc ./crate-docs - echo "" > ./crate-docs/index.html #### stage: publish .publish_build: &publish_build stage: publish dependencies: - build:rust:linux:release cache: {} <<: *build_only <<: *kubernetes_build publish:docker:release: <<: *publish_build image: docker:stable services: - docker:dind variables: DOCKER_HOST: tcp://localhost:2375 DOCKER_DRIVER: overlay2 GIT_STRATEGY: none # DOCKERFILE: scripts/docker/Dockerfile CONTAINER_IMAGE: parity/substrate script: - VERSION="$(cat ./artifacts/VERSION)" - 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 --tag $CONTAINER_IMAGE:$VERSION --tag $CONTAINER_IMAGE:latest . - docker push $CONTAINER_IMAGE:$VERSION - docker push $CONTAINER_IMAGE:latest after_script: - docker logout publish:s3:release: <<: *publish_build image: parity/awscli:latest variables: GIT_STRATEGY: none BUCKET: "releases.parity.io" PREFIX: "substrate/${ARCH}-${DOCKER_OS}" script: - aws s3 sync ./artifacts/ s3://${BUCKET}/${PREFIX}/$(cat ./artifacts/VERSION)/ - echo "update objects in latest path" - for file in ./artifacts/*; do name="$(basename ${file})"; aws s3api copy-object --copy-source ${BUCKET}/${PREFIX}/$(cat ./artifacts/VERSION)/${name} --bucket ${BUCKET} --key ${PREFIX}/latest/${name}; done after_script: - aws s3 ls s3://${BUCKET}/${PREFIX}/latest/ --recursive --human-readable --summarize publish:s3:doc: stage: publish dependencies: - build:rust:doc:release cache: {} <<: *build_only <<: *kubernetes_build variables: GIT_STRATEGY: none BUCKET: "releases.parity.io" PREFIX: "substrate-rustdoc" script: - test -r ./crate-docs/index.html || ( echo "./crate-docs/index.html not present, build:rust:doc:release job not complete"; exit 1 ) - aws s3 sync --delete --size-only --only-show-errors ./crate-docs/ s3://${BUCKET}/${PREFIX}/ after_script: - aws s3 ls s3://${BUCKET}/${PREFIX}/ --human-readable --summarize .deploy:template: &deploy stage: deploy when: manual cache: {} retry: 1 image: parity/kubectl-helm:$HELM_VERSION <<: *build_only # variables: # DEPLOY_TAG: "latest" tags: - kubernetes-parity-build before_script: - test -z "${DEPLOY_TAG}" && test -f ./target/release/VERSION && DEPLOY_TAG="$(cat ./target/release/VERSION)" - test "${DEPLOY_TAG}" || ( echo "Neither DEPLOY_TAG nor VERSION information available"; exit 1 ) script: - echo "Substrate version = ${DEPLOY_TAG}" # or use helm to render the template - helm template --values ./scripts/kubernetes/values.yaml --set image.tag=${DEPLOY_TAG} --set validator.keys=${VALIDATOR_KEYS} ./scripts/kubernetes | kubectl apply -f - --dry-run=false - echo "# substrate namespace" - kubectl -n substrate get all - echo "# substrate's nodes' external ip addresses:" - kubectl get nodes -l node=substrate -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{range @.status.addresses[?(@.type=="ExternalIP")]}{.address}{"\n"}{end}' - echo "# substrate' nodes" - kubectl -n substrate get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{"\n"}{end}' # have environment:url eventually point to the logs deploy:ew3: <<: *deploy environment: name: parity-prod-ew3 deploy:ue1: <<: *deploy environment: name: parity-prod-ue1