480 lines
16 KiB
YAML
480 lines
16 KiB
YAML
version: 2.1
|
|
orbs:
|
|
aws-s3: circleci/aws-s3@2.0.0
|
|
parameters:
|
|
cross-container-tag:
|
|
# when updating the go version, should also update the go version in go.mod
|
|
description: docker tag for cross build container from quay.io . Created by https://github.com/influxdata/edge/tree/master/dockerfiles/cross-builder .
|
|
type: string
|
|
default: go1.22.7-latest
|
|
|
|
workflow:
|
|
type: string
|
|
default: build
|
|
|
|
jobs:
|
|
build_binaries:
|
|
docker:
|
|
- image: quay.io/influxdb/cross-builder:<< pipeline.parameters.cross-container-tag >>
|
|
steps:
|
|
- attach_workspace:
|
|
at: /tmp/workspace
|
|
- checkout
|
|
- restore_cache:
|
|
keys:
|
|
# We save the cache from this one, so don't restore a cache with old junk and then save new stuff alongside.
|
|
# Start either with the exact right cache, or completely fresh.
|
|
- influxdb-cache-v1-{{ checksum "go.mod" }}
|
|
- run:
|
|
name: Get InfluxDB Version
|
|
command: |
|
|
PREFIX=1.x .circleci/scripts/get-version
|
|
- run:
|
|
name: Build source tarball
|
|
command: |
|
|
set -x
|
|
|
|
printf '{
|
|
"version": "%s",
|
|
"branch": "%s",
|
|
"sha": "%s"
|
|
}' "${VERSION}" "${CIRCLE_BRANCH}" "${CIRCLE_SHA1}" >"$(pwd)/.metadata.json"
|
|
|
|
#
|
|
# Prebuild the man pages so that consumers of the source tarball don't have to build it themselves.
|
|
(cd man && make build && gzip -9 ./*.1)
|
|
|
|
mkdir -p ./tarball
|
|
TARBALL_NAME="./tarball/influxdb-src-${CIRCLE_SHA1}.tar.gz"
|
|
tar --exclude-vcs --exclude './tarball' --transform 'flags=r;s|^|influxdb/|' -vczf "${TARBALL_NAME}" .
|
|
- store_artifacts:
|
|
path: tarball/
|
|
- persist_to_workspace:
|
|
root: .
|
|
paths:
|
|
- tarball
|
|
- run:
|
|
name: Build binaries
|
|
command: |
|
|
export CC="$(xcc linux x86_64)"
|
|
export CGO_ENABLED=1
|
|
|
|
# linux amd64 (static build)
|
|
export GOOS=linux
|
|
export GOARCH=amd64
|
|
for cmd in github.com/influxdata/influxdb/cmd/{influxd,influx,influx_inspect}
|
|
do
|
|
go build \
|
|
-tags "netgo,osusergo,static_build" \
|
|
-buildmode=pie \
|
|
-ldflags="-s
|
|
-X \"main.version=${VERSION}\"
|
|
-X \"main.branch=${CIRCLE_BRANCH}\"
|
|
-X \"main.commit=${CIRCLE_SHA1}\"
|
|
-linkmode=external
|
|
-extld=${CC}
|
|
-extldflags \"-fno-PIC -static-pie -Wl,-z,stack-size=8388608\"" \
|
|
${cmd}
|
|
done
|
|
|
|
mkdir -p ./bins
|
|
|
|
target="bins/influxdb_bin_${GOOS}_${GOARCH}-${CIRCLE_SHA1}.tar.gz"
|
|
tar -czf "${target}" \
|
|
influx \
|
|
influx_inspect \
|
|
influxd
|
|
md5sum "${target}" > "${target}.md5"
|
|
sha256sum "${target}" > "${target}.sha256"
|
|
- store_artifacts:
|
|
path: bins/
|
|
- persist_to_workspace:
|
|
root: .
|
|
paths:
|
|
- bins
|
|
- save_cache:
|
|
key: influxdb-cache-v1-{{ checksum "go.mod" }}
|
|
paths:
|
|
- /go/pkg/mod
|
|
- /root/.cargo
|
|
- /root/.cache/go-build
|
|
|
|
build_packages:
|
|
docker:
|
|
- image: us-east1-docker.pkg.dev/influxdata-team-edge/ci-support/ci-packager:latest
|
|
auth:
|
|
username: _json_key
|
|
password: $CISUPPORT_GCS_AUTHORIZATION
|
|
steps:
|
|
- checkout
|
|
- attach_workspace:
|
|
at: /tmp/workspace
|
|
- run: |
|
|
( cd man ; make build ; gzip -9 ./*.1 )
|
|
|
|
packager .circleci/packages/config.yaml
|
|
- persist_to_workspace:
|
|
root: .
|
|
paths:
|
|
- packages
|
|
- store_artifacts:
|
|
path: packages
|
|
|
|
sign_packages:
|
|
circleci_ip_ranges: true
|
|
docker:
|
|
- image: quay.io/influxdb/rsign:latest
|
|
auth:
|
|
username: $QUAY_RSIGN_USERNAME
|
|
password: $QUAY_RSIGN_PASSWORD
|
|
steps:
|
|
- add_ssh_keys:
|
|
fingerpints:
|
|
- fc:7b:6e:a6:38:7c:63:5a:13:be:cb:bb:fa:33:b3:3c
|
|
- attach_workspace:
|
|
at: /tmp/workspace
|
|
- run: |
|
|
for target in /tmp/workspace/packages/*
|
|
do
|
|
case "${target}"
|
|
in
|
|
# rsign is shipped on Alpine Linux which uses "busybox ash" instead
|
|
# of bash. ash is somewhat more posix compliant and is missing some
|
|
# extensions and niceties from bash.
|
|
*.deb|*.rpm|*.tar.gz|*.zip)
|
|
rsign "${target}"
|
|
;;
|
|
esac
|
|
|
|
if [ -f "${target}" ]
|
|
then
|
|
# Since all artifacts are present, sign them here. This saves Circle
|
|
# credits over spinning up another instance just to separate out the
|
|
# checksum job.
|
|
sha256sum "${target}" >> "/tmp/workspace/packages/influxdb.${CIRCLE_TAG}.digests"
|
|
|
|
md5sum "${target}" >"${target}.md5"
|
|
sha256sum "${target}" >"${target}.sha256"
|
|
fi
|
|
done
|
|
- persist_to_workspace:
|
|
root: /tmp/workspace
|
|
paths:
|
|
- packages
|
|
- store_artifacts:
|
|
path: /tmp/workspace/packages
|
|
|
|
test_pkgs_64bit:
|
|
machine:
|
|
enabled: true
|
|
docker_layer_caching: true
|
|
image: ubuntu-2204:current
|
|
steps:
|
|
- attach_workspace:
|
|
at: /tmp/workspace
|
|
- checkout
|
|
- run:
|
|
name: Test 64 bit packages install
|
|
command: |
|
|
set -x
|
|
export WORKING_DIR=$(pwd)
|
|
# Using subshells with find to get full path of real package files, rather than predicting or hardcoding
|
|
# The glob pattern with -prune causes find to only return files rooted in packages,
|
|
# thereby avoiding files whose names would match, but are in subdirectories, i.e. packages/static.
|
|
"${WORKING_DIR}/releng/packages/spec/clean_install/run.bash" -D \
|
|
-p "$(find "/tmp/workspace/packages"/* -prune -name 'influxdb*amd64.deb')"
|
|
|
|
"${WORKING_DIR}/releng/packages/spec/clean_install/run.bash" -R \
|
|
-p "$(find "/tmp/workspace/packages"/* -prune -name 'influxdb*x86_64.rpm')"
|
|
|
|
static_code_checks:
|
|
docker:
|
|
- image: quay.io/influxdb/cross-builder:<< pipeline.parameters.cross-container-tag >>
|
|
steps:
|
|
- attach_workspace:
|
|
at: /tmp/workspace
|
|
- checkout
|
|
- run: ./checkfmt.sh
|
|
- run: ./generate.sh
|
|
- run: go vet ./...
|
|
|
|
unit_test:
|
|
docker:
|
|
- image: quay.io/influxdb/cross-builder:<< pipeline.parameters.cross-container-tag >>
|
|
resource_class: xlarge
|
|
parameters:
|
|
data:
|
|
type: string
|
|
default: inmem
|
|
race:
|
|
type: boolean
|
|
default: false
|
|
environment:
|
|
INFLUXDB_DATA_INDEX_VERSION: << parameters.data >>
|
|
GORACE: halt_on_error=1
|
|
steps:
|
|
- checkout
|
|
- restore_cache:
|
|
keys:
|
|
- influxdb-cache-v1-{{ checksum "go.mod" }}
|
|
- influxdb-cache-v1
|
|
- when:
|
|
condition: << parameters.race >>
|
|
steps:
|
|
- run:
|
|
name: Execute Tests
|
|
command: |
|
|
mkdir -p junit-race-<< parameters.data >>
|
|
# "resource_class: xlarge" creates a Docker container with eight
|
|
# virtual cpu cores. However, applications like "nproc" return
|
|
# the host machine's core count (which in this case is 36).
|
|
# When less cores are available than advertised, the tests
|
|
# sometimes fail.
|
|
#
|
|
# We'll manually reduce the number of available cores to what
|
|
# is specified by the CircleCI documentation:
|
|
# https://circleci.com/product/features/resource-classes/
|
|
taskset -c 0-7 \
|
|
gotestsum \
|
|
--format=standard-verbose \
|
|
--junitfile=junit-race-<< parameters.data >>/influxdb.junit.xml \
|
|
-- -race ./...
|
|
- store_test_results:
|
|
path: junit-race-<< parameters.data >>/
|
|
- when:
|
|
condition: { not: << parameters.race >> }
|
|
steps:
|
|
- run:
|
|
name: Execute Tests
|
|
command: |
|
|
mkdir -p junit-<< parameters.data >>
|
|
# "resource_class: xlarge" creates a Docker container with eight
|
|
# virtual cpu cores. However, applications like "nproc" return
|
|
# the host machine's core count (which in this case is 36).
|
|
# When less cores are available than advertised, the tests
|
|
# sometimes fail.
|
|
#
|
|
# We'll manually reduce the number of available cores to what
|
|
# is specified by the CircleCI documentation:
|
|
# https://circleci.com/product/features/resource-classes/
|
|
taskset -c 0-7 \
|
|
gotestsum \
|
|
--format=standard-verbose \
|
|
--junitfile=junit-<< parameters.data >>/influxdb.junit.xml \
|
|
-- ./...
|
|
- store_test_results:
|
|
path: junit-<< parameters.data >>/
|
|
|
|
fluxtest:
|
|
docker:
|
|
- image: quay.io/influxdb/cross-builder:<< pipeline.parameters.cross-container-tag >>
|
|
steps:
|
|
- checkout
|
|
- run:
|
|
name: Execute test
|
|
command: ./test-flux.sh || exit 1
|
|
no_output_timeout: 1500s
|
|
|
|
changelog:
|
|
docker:
|
|
- image: quay.io/influxdb/changelogger:d7093c409adedd8837ef51fa84be0d0f8319177a
|
|
steps:
|
|
- checkout
|
|
- run:
|
|
name: Generate Changelog
|
|
command: |
|
|
PRODUCT=OSS changelogger
|
|
- store_artifacts:
|
|
path: changelog_artifacts/
|
|
- persist_to_workspace:
|
|
root: .
|
|
paths:
|
|
- changelog_artifacts
|
|
|
|
publish_changelog:
|
|
parameters:
|
|
workflow:
|
|
type: string
|
|
docker:
|
|
- image: cimg/python:3.6
|
|
steps:
|
|
- attach_workspace:
|
|
at: /tmp/workspace
|
|
- when:
|
|
condition:
|
|
equal: [ << parameters.workflow >>, release ]
|
|
steps:
|
|
- aws-s3/copy:
|
|
aws-region: INFLUXDB1X_AWS_REGION
|
|
aws-access-key-id: INFLUXDB1X_AWS_ACCESS_KEY_ID
|
|
aws-secret-access-key: INFLUXDB1X_AWS_SECRET_ACCESS_KEY
|
|
from: /tmp/workspace/changelog_artifacts/CHANGELOG.md
|
|
to: s3://${INFLUXDB1X_ARTIFACTS_BUCKET}/influxdb/releases/<< pipeline.git.tag >>/CHANGELOG.<< pipeline.git.tag >>.md
|
|
- when:
|
|
condition:
|
|
equal: [ << parameters.workflow >>, nightly ]
|
|
steps:
|
|
- aws-s3/copy:
|
|
aws-region: INFLUXDB1X_AWS_REGION
|
|
aws-access-key-id: INFLUXDB1X_AWS_ACCESS_KEY_ID
|
|
aws-secret-access-key: INFLUXDB1X_AWS_SECRET_ACCESS_KEY
|
|
from: /tmp/workspace/changelog_artifacts/CHANGELOG.md
|
|
to: s3://${INFLUXDB1X_ARTIFACTS_BUCKET}/influxdb/nightlies/<< pipeline.git.branch >>/CHANGELOG.md
|
|
|
|
publish_packages:
|
|
docker:
|
|
- image: cimg/python:3.6
|
|
steps:
|
|
- attach_workspace:
|
|
at: /tmp/workspace
|
|
- aws-s3/sync:
|
|
aws-region: INFLUXDB1X_AWS_REGION
|
|
aws-access-key-id: INFLUXDB1X_AWS_ACCESS_KEY_ID
|
|
aws-secret-access-key: INFLUXDB1X_AWS_SECRET_ACCESS_KEY
|
|
from: /tmp/workspace/packages
|
|
to: s3://${INFLUXDB1X_ARTIFACTS_BUCKET}/influxdb/releases/<< pipeline.git.tag >>
|
|
|
|
slack:
|
|
docker:
|
|
- image: us-east1-docker.pkg.dev/influxdata-team-edge/ci-support/ci-slack:latest
|
|
auth:
|
|
username: _json_key
|
|
password: $CISUPPORT_GCS_AUTHORIZATION
|
|
steps:
|
|
- attach_workspace:
|
|
at: /tmp/workspace
|
|
- run:
|
|
command: |
|
|
SLACK_ARTIFACT_URL=s3://${INFLUXDB1X_ARTIFACTS_BUCKET}/influxdb/releases/<< pipeline.git.tag >> slack
|
|
environment:
|
|
SLACK_ARTIFACT_ROOT: /tmp/workspace/packages
|
|
SLACK_RELEASE_MESSAGE: New InfluxDB Release
|
|
|
|
release_filter: &release_filter
|
|
filters:
|
|
tags:
|
|
# This regex matches what is found in 'scripts/get-version' with the
|
|
# '[[:digit:]]' transformed into '\d'. This also excludes release
|
|
# candidate detection, because this filter only matches against
|
|
# full releases.
|
|
only: /^v(\d+)(?:\.(\d+))?(?:\.(\d+))?$/
|
|
branches:
|
|
ignore: /.*/
|
|
|
|
workflows:
|
|
version: 2.1
|
|
release:
|
|
when:
|
|
equal: [ << pipeline.parameters.workflow >>, build ]
|
|
jobs:
|
|
- build_binaries:
|
|
<<: *release_filter
|
|
- build_packages:
|
|
<<: *release_filter
|
|
requires:
|
|
- build_binaries
|
|
- sign_packages:
|
|
<<: *release_filter
|
|
requires:
|
|
- build_packages
|
|
- test_pkgs_64bit:
|
|
<<: *release_filter
|
|
requires:
|
|
- build_packages
|
|
- changelog:
|
|
<<: *release_filter
|
|
- publish_changelog:
|
|
<<: *release_filter
|
|
workflow: release
|
|
requires:
|
|
- changelog
|
|
- publish_packages:
|
|
<<: *release_filter
|
|
requires:
|
|
- sign_packages
|
|
- slack:
|
|
<<: *release_filter
|
|
requires:
|
|
- publish_packages
|
|
- static_code_checks:
|
|
<<: *release_filter
|
|
- fluxtest:
|
|
<<: *release_filter
|
|
- unit_test:
|
|
<<: *release_filter
|
|
name: unit_test_inmem
|
|
data: inmem
|
|
- unit_test:
|
|
<<: *release_filter
|
|
name: unit_test_tsi1
|
|
data: tsi1
|
|
- unit_test:
|
|
<<: *release_filter
|
|
name: unit_test_race
|
|
race: true
|
|
on_push:
|
|
when:
|
|
equal: [ << pipeline.parameters.workflow >>, build ]
|
|
jobs:
|
|
- build_binaries
|
|
- build_packages:
|
|
requires:
|
|
- build_binaries
|
|
- test_pkgs_64bit:
|
|
requires:
|
|
- build_packages
|
|
- static_code_checks
|
|
- fluxtest
|
|
- unit_test:
|
|
name: unit_test_inmem
|
|
data: inmem
|
|
- unit_test:
|
|
name: unit_test_tsi1
|
|
data: tsi1
|
|
- unit_test:
|
|
name: unit_test_race
|
|
race: true
|
|
nightly:
|
|
when:
|
|
and:
|
|
# This requires a pipeline trigger with a custom "workflow" parameter
|
|
# set to "nightly". Since we want to trigger this workflow on several
|
|
# branches, we cannot use the trigger name as suggested by the
|
|
# documentation.
|
|
#
|
|
# For more information:
|
|
# https://circleci.com/docs/scheduled-pipelines/
|
|
- equal: [ << pipeline.trigger_source >>, scheduled_pipeline ]
|
|
- equal: [ << pipeline.parameters.workflow >>, nightly ]
|
|
jobs:
|
|
- changelog
|
|
- publish_changelog:
|
|
workflow: nightly
|
|
requires:
|
|
- changelog
|
|
- static_code_checks
|
|
- fluxtest
|
|
- unit_test:
|
|
name: unit_test_inmem
|
|
data: inmem
|
|
- unit_test:
|
|
name: unit_test_tsi1
|
|
data: tsi1
|
|
- unit_test:
|
|
name: unit_test_race
|
|
race: true
|
|
- build_binaries:
|
|
requires:
|
|
- changelog
|
|
- static_code_checks
|
|
- fluxtest
|
|
- unit_test_inmem
|
|
- unit_test_race
|
|
- unit_test_tsi1
|
|
- build_packages:
|
|
requires:
|
|
- build_binaries
|
|
- test_pkgs_64bit:
|
|
requires:
|
|
- build_packages
|