version: 2.1 commands: setup-home-local-bin: steps: - run: shell: /bin/bash -euo pipefail command: | mkdir -p "$HOME/.local/bin" line='export PATH="$HOME/.local/bin:$PATH"' if grep "$line" $BASH_ENV >/dev/null; then echo "$line" >> $BASH_ENV fi invoke-lazy-sh: parameters: subcommand: type: string steps: - run: environment: TERM: xterm command: ./lazy.sh <> apt-update-and-install-common-deps: steps: - run: sudo apt update && sudo apt install gawk make restore-cache-gomod: steps: - restore_cache: key: go-mod-v4-{{ checksum "go.sum" }} save-cache-gomod: steps: - save_cache: key: go-mod-v4-{{ checksum "go.sum" }} paths: - "/go/pkg/mod" install-godep: steps: - apt-update-and-install-common-deps - invoke-lazy-sh: subcommand: godep install-docdep: steps: - apt-update-and-install-common-deps - run: sudo apt install python3 python3-pip libgirepository1.0-dev - invoke-lazy-sh: subcommand: docdep download-and-install-minio-client: steps: - setup-home-local-bin - restore_cache: key: minio-client-v2 - run: shell: /bin/bash -eo pipefail command: | if which mc; then exit 0; fi sudo curl -sSL https://dl.min.io/client/mc/release/linux-amd64/archive/mc.RELEASE.2020-08-20T00-23-01Z \ -o "$HOME/.local/bin/mc" sudo chmod +x "$HOME/.local/bin/mc" - save_cache: key: minio-client-v2 paths: - "$HOME/.local/bin/mc" upload-minio: parameters: src: type: string dst: type: string steps: - run: shell: /bin/bash -eo pipefail when: always command: | if [ -n "$CIRCLE_PR_NUMBER" ]; then # CIRCLE_PR_NUMBER is guaranteed to be only present in forked PRs (external) echo "Forked PR detected. Sry, can't trust you with credentials to external artifact store, use CircleCI's instead." exit 0 fi set -u # from now on mc config host add --api s3v4 zrepl-minio https://minio.cschwarz.com ${MINIO_ACCESS_KEY} ${MINIO_SECRET_KEY} # keep in sync with set-github-minio-status jobprefix=zrepl-ci-artifacts/${CIRCLE_SHA1}-pipeline-<>/${CIRCLE_JOB} # Upload artifacts mkdir -p ./artifacts mc cp -r <> "zrepl-minio/$jobprefix/<>" set-github-minio-status: parameters: context: type: string description: type: string minio-dst: type: string steps: - run: shell: /bin/bash -eo pipefail command: | if [ -n "$CIRCLE_PR_NUMBER" ]; then # CIRCLE_PR_NUMBER is guaranteed to be only present in forked PRs (external) echo "Forked PR detected. Sry, can't trust you with credentials to external artifact store, use CircleCI's instead." exit 0 fi set -u # from now on # keep in sync with with upload-minio command jobprefix=zrepl-ci-artifacts/${CIRCLE_SHA1}-pipeline-<>/${CIRCLE_JOB} # Push Artifact Link to GitHub REPO="zrepl/zrepl" COMMIT="${CIRCLE_SHA1}" JOB_NAME="${CIRCLE_JOB}" CONTEXT="<>" DESCRIPTION="<>" TARGETURL=https://minio.cschwarz.com/minio/"$jobprefix"/"<>" curl "https://api.github.com/repos/$REPO/statuses/$COMMIT" \ -H "Content-Type: application/json" \ -H "Authorization: token $GITHUB_COMMIT_STATUS_TOKEN" \ -X POST \ -d '{"context":"'"$CONTEXT"'", "state": "success", "description":"'"$DESCRIPTION"'", "target_url":"'"$TARGETURL"'"}' trigger-pipeline: parameters: body_no_shell_subst: type: string steps: - run: | curl -X POST https://circleci.com/api/v2/project/github/zrepl/zrepl/pipeline \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ -H "Circle-Token: $ZREPL_BOT_CIRCLE_TOKEN" \ --data '<>' parameters: do_ci: type: boolean default: true do_release: type: boolean default: false release_docker_baseimage_tag: type: string default: "1.17" workflows: version: 2 ci: when: << pipeline.parameters.do_ci >> jobs: - quickcheck-docs - quickcheck-go: &quickcheck-go-smoketest name: quickcheck-go-amd64-linux-1.17 goversion: &latest-go-release "1.17" goos: linux goarch: amd64 - test-go-on-latest-go-release: goversion: *latest-go-release - quickcheck-go: requires: - quickcheck-go-amd64-linux-1.17 #quickcheck-go-smoketest.name matrix: &quickcheck-go-matrix alias: quickcheck-go-matrix parameters: goversion: [*latest-go-release, "1.12"] goos: ["linux", "freebsd"] goarch: ["amd64", "arm64"] exclude: # don't re-do quickcheck-go-smoketest - goversion: *latest-go-release goos: linux goarch: amd64 # not supported by Go 1.12 - goversion: "1.12" goos: freebsd goarch: arm64 release: when: << pipeline.parameters.do_release >> jobs: - release-build - release-deb: requires: - release-build - release-rpm: requires: - release-build - release-upload: requires: - release-build - release-deb - release-rpm periodic: triggers: - schedule: cron: "00 17 * * *" filters: branches: only: - master - stable - problame/circleci-build jobs: - periodic-full-pipeline-run zrepl.github.io: jobs: - publish-zrepl-github-io: filters: branches: only: - stable jobs: quickcheck-docs: docker: - image: cimg/base:2020.08 steps: - checkout - install-docdep - run: make docs - download-and-install-minio-client - upload-minio: src: artifacts dst: "" - set-github-minio-status: context: artifacts/${CIRCLE_JOB} description: artifacts of CI job ${CIRCLE_JOB} minio-dst: "" quickcheck-go: parameters: goversion: type: string goos: type: string goarch: type: string docker: - image: circleci/golang:<> environment: GOOS: <> GOARCH: <> steps: - checkout - restore-cache-gomod - run: go mod download - run: cd build && go mod download - save-cache-gomod - install-godep - run: make formatcheck - run: make generate-platform-test-list - run: make zrepl-bin test-platform-bin - run: make vet - run: make lint - download-and-install-minio-client - run: rm -f artifacts/generate-platform-test-list - store_artifacts: path: artifacts - upload-minio: src: artifacts dst: "" - set-github-minio-status: context: artifacts/${CIRCLE_JOB} description: artifacts of CI job ${CIRCLE_JOB} minio-dst: "" test-go-on-latest-go-release: parameters: goversion: type: string docker: - image: circleci/golang:<> steps: - checkout - restore-cache-gomod - run: make test-go # don't save-cache-gomod here, test-go doesn't pull all the dependencies release-build: machine: true steps: - checkout - run: make release-docker RELEASE_DOCKER_BASEIMAGE_TAG=<> - persist_to_workspace: root: . paths: [.] release-deb: machine: true steps: - attach_workspace: at: . - run: make debs-docker - persist_to_workspace: root: . paths: - "artifacts/*.deb" release-rpm: machine: true steps: - attach_workspace: at: . - run: make rpms-docker - persist_to_workspace: root: . paths: - "artifacts/*.rpm" release-upload: docker: - image: cimg/base:2020.08 steps: - attach_workspace: at: . - store_artifacts: path: artifacts - download-and-install-minio-client - upload-minio: src: artifacts dst: "" - set-github-minio-status: context: artifacts/release description: CI-generated release artifacts minio-dst: "" periodic-full-pipeline-run: docker: - image: cimg/base:2020.08 steps: - trigger-pipeline: body_no_shell_subst: '{"branch":"<>", "parameters": { "do_ci": true, "do_release": true }}' publish-zrepl-github-io: docker: - image: cimg/python:3.7 steps: - checkout - invoke-lazy-sh: subcommand: docdep - run: command: | git config --global user.email "zreplbot@cschwarz.com" git config --global user.name "zrepl-github-io-ci" # https://circleci.com/docs/2.0/add-ssh-key/#adding-multiple-keys-with-blank-hostnames - run: ssh-add -D # the default circleci ssh config only additional ssh keys for Host !github.com - run: command: | cat > ~/.ssh/config \<