mirror of
https://github.com/zrepl/zrepl.git
synced 2025-02-17 19:01:12 +01:00
When we need artifacts, we use MinIO anyways. And we have accumulated about 1TiB of (free) CircleCI artifact storage. Don't need to waste space unnecessarily.
377 lines
10 KiB
YAML
377 lines
10 KiB
YAML
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 <<parameters.subcommand>>
|
|
|
|
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-<<pipeline.number>>/${CIRCLE_JOB}
|
|
|
|
# Upload artifacts
|
|
mkdir -p ./artifacts
|
|
mc cp -r <<parameters.src>> "zrepl-minio/$jobprefix/<<parameters.dst>>"
|
|
|
|
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-<<pipeline.number>>/${CIRCLE_JOB}
|
|
# Push Artifact Link to GitHub
|
|
REPO="zrepl/zrepl"
|
|
COMMIT="${CIRCLE_SHA1}"
|
|
JOB_NAME="${CIRCLE_JOB}"
|
|
CONTEXT="<<parameters.context>>"
|
|
DESCRIPTION="<<parameters.description>>"
|
|
TARGETURL=https://minio.cschwarz.com/minio/"$jobprefix"/"<<parameters.minio-dst>>"
|
|
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.body_no_shell_subst>>'
|
|
|
|
parameters:
|
|
do_ci:
|
|
type: boolean
|
|
default: true
|
|
|
|
do_release:
|
|
type: boolean
|
|
default: false
|
|
|
|
release_docker_baseimage_tag:
|
|
type: string
|
|
default: "1.16"
|
|
|
|
workflows:
|
|
version: 2
|
|
|
|
ci:
|
|
when: << pipeline.parameters.do_ci >>
|
|
jobs:
|
|
- quickcheck-docs
|
|
- quickcheck-go: &quickcheck-go-smoketest
|
|
name: quickcheck-go-amd64-linux-1.16
|
|
goversion: &latest-go-release "1.16"
|
|
goos: linux
|
|
goarch: amd64
|
|
- test-go-on-latest-go-release:
|
|
goversion: *latest-go-release
|
|
- quickcheck-go:
|
|
requires:
|
|
- quickcheck-go-amd64-linux-1.16 #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:<<parameters.goversion>>
|
|
environment:
|
|
GOOS: <<parameters.goos>>
|
|
GOARCH: <<parameters.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:<<parameters.goversion>>
|
|
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=<<pipeline.parameters.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":"<<pipeline.git.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 \<<EOF
|
|
Host *
|
|
IdentityFile /home/circleci/.ssh/id_rsa_458e62c517f6c480e40452126ce47421
|
|
EOF
|
|
- add_ssh_keys:
|
|
fingerprints:
|
|
# deploy key for zrepl.github.io
|
|
- "45:8e:62:c5:17:f6:c4:80:e4:04:52:12:6c:e4:74:21"
|
|
|
|
- run: bash -x docs/publish.sh -c -a
|