version: 2.1 orbs: win: circleci/windows@5.0.0 aws-cli: circleci/aws-cli@3.1.1 executors: telegraf-ci: working_directory: '/go/src/github.com/influxdata/telegraf' resource_class: large docker: - image: 'quay.io/influxdb/telegraf-ci:1.21.4' environment: GOFLAGS: -p=4 mac: working_directory: '~/go/src/github.com/influxdata/telegraf' resource_class: macos.m1.medium.gen1 macos: xcode: 14.2.0 environment: HOMEBREW_NO_AUTO_UPDATE: 1 GOFLAGS: -p=4 commands: check-changed-files-or-halt: steps: - run: ./scripts/check-file-changes.sh test-go: parameters: os: type: string default: "linux" arch: type: string default: "amd64" gotestsum: type: string default: "gotestsum" cache_version: type: string default: "v1" goversion: type: string default: 1.21.4 steps: - check-changed-files-or-halt - when: condition: equal: [ windows, << parameters.os >> ] steps: - run: name: Remove Go and MinGW to avoid clashes after upgrade during cache restore command: | rm -rf '/c/Program Files/Go' rm -rf '/c/ProgramData/chocolatey/lib/mingw' - when: condition: equal: [ darwin, << parameters.os >> ] steps: - run: name: Ensure go directory is empty and have proper permissions before cache restore command: | sudo rm -rf '/usr/local/Cellar/go' sudo mkdir -p '/usr/local/Cellar/go' sudo chown -R $(id -u):$(id -g) '/usr/local/Cellar/go' - restore_cache: name: "Restore binaries from cache" key: go-bins-<< parameters.cache_version >>-<< parameters.os >>-<< parameters.arch >>-go<< parameters.goversion >>-{{ checksum "go.sum" }} - when: condition: equal: [ linux, << parameters.os >> ] steps: - attach_workspace: at: '/go' - when: condition: equal: [ darwin, << parameters.os >> ] steps: - run: 'sh ./scripts/installgo_mac.sh' - when: condition: equal: [ windows, << parameters.os >> ] steps: - run: choco feature enable -n allowGlobalConfirmation - run: git config --system core.longpaths true - run: 'sh ./scripts/installgo_windows.sh' - run: 'sh ./scripts/installmingw_windows.sh' - run: choco install make - run: go env - run: go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.55.0 - when: condition: equal: [ linux, << parameters.os >> ] steps: - run: name: golangci-lint cache status command: GOGC=20 /go/bin/golangci-lint cache status - run: name: golangci-lint run command: GOGC=20 /go/bin/golangci-lint run --verbose - when: condition: equal: [ darwin, << parameters.os >> ] steps: - run: name: golangci-lint cache status command: $HOME/go/bin/golangci-lint cache status - run: name: golangci-lint run command: $HOME/go/bin/golangci-lint run --verbose - when: condition: equal: [ windows, << parameters.os >> ] steps: - run: name: golangci-lint cache status command: $HOME/go/bin/golangci-lint.exe cache status - run: name: golangci-lint run command: $HOME/go/bin/golangci-lint.exe run --verbose - run: ./scripts/install_gotestsum.sh << parameters.os >> << parameters.gotestsum >> - unless: condition: equal: [ "386", << parameters.arch >> ] steps: - run: echo 'export RACE="-race"' >> $BASH_ENV - when: condition: equal: [ windows, << parameters.os >> ] steps: - run: | export PATH="/c/ProgramData/chocolatey/lib/mingw/tools/install/mingw64/bin:$PATH" GOARCH=<< parameters.arch >> ./<< parameters.gotestsum >> -- ${RACE} -short -cover -coverprofile=coverage.out ./... - unless: condition: equal: [ windows, << parameters.os >> ] steps: - run: GOARCH=<< parameters.arch >> ./<< parameters.gotestsum >> -- ${RACE} -short -cover -coverprofile=coverage.out ./... - when: condition: and: - equal: [ "master", << pipeline.git.branch >> ] - equal: [ "linux", << parameters.os >> ] - equal: [ "amd64", << parameters.arch >> ] steps: - run: name: "Installing goveralls" command: go install github.com/mattn/goveralls@latest - run: name: "Remove plugins/parsers/influx/machine.go from coverage" command: sed -i '/github.com\/influxdata\/telegraf\/plugins\/parsers\/influx\/machine.go/d' coverage.out - run: name: "Create report" command: /go/bin/goveralls -coverprofile=coverage.out -service=circle-ci -repotoken=${COVERALLS_TOKEN} - when: condition: equal: [ linux, << parameters.os >> ] steps: - save_cache: name: 'Saving binaries to cache' key: go-bins-<< parameters.cache_version >>-<< parameters.os >>-<< parameters.arch >>-go<< parameters.goversion >>-{{ checksum "go.sum" }} paths: - '/go/src/github.com/influxdata/telegraf/gotestsum' - when: condition: equal: [ darwin, << parameters.os >> ] steps: - save_cache: name: 'Saving binaries to cache' key: go-bins-<< parameters.cache_version >>-<< parameters.os >>-<< parameters.arch >>-go<< parameters.goversion >>-{{ checksum "go.sum" }} paths: - '~/go/src/github.com/influxdata/telegraf/gotestsum' - '/usr/local/Cellar/go' - '/usr/local/bin/go' - '/usr/local/bin/gofmt' - when: condition: equal: [ windows, << parameters.os >> ] steps: - save_cache: name: 'Saving binaries to cache' key: go-bins-<< parameters.cache_version >>-<< parameters.os >>-<< parameters.arch >>-go<< parameters.goversion >>-{{ checksum "go.sum" }} paths: - '~\project\gotestsum.exe' - 'C:\Program Files\Go' - 'C:\ProgramData\chocolatey\lib\mingw' package-build: parameters: type: type: string default: "" nightly: type: boolean default: false steps: - checkout - check-changed-files-or-halt - attach_workspace: at: '/go' - when: condition: equal: [ windows, << parameters.type >> ] steps: - run: go install github.com/josephspurrier/goversioninfo/cmd/goversioninfo@v1.4.0 - when: condition: << parameters.nightly >> steps: - run: command: 'NIGHTLY=1 make package include_packages="$(make << parameters.type >>)"' no_output_timeout: 30m - unless: condition: or: - << parameters.nightly >> steps: - run: command: 'make package include_packages="$(make << parameters.type >>)"' no_output_timeout: 30m - store_artifacts: path: './build/dist' destination: 'build/dist' - persist_to_workspace: root: './build' paths: - 'dist' jobs: test-go-linux: executor: telegraf-ci parameters: goversion: type: string default: 1.21.4 cache_version: type: string default: "v1" steps: - checkout - restore_cache: name: "Restore Go caches" key: go-caches-<< parameters.cache_version >>-linux-amd64-go<< parameters.goversion >>-{{ checksum "go.sum" }} - check-changed-files-or-halt - run: ./scripts/make_docs.sh - run: 'make deps' - run: 'make tidy' - run: 'make check' - run: 'make check-deps' - test-go - save_cache: name: "Save Go caches" key: go-caches-<< parameters.cache_version >>-linux-amd64-go<< parameters.goversion >>-{{ checksum "go.sum" }} paths: - '/go/pkg/mod' - '~/.cache/golangci-lint' - '~/.cache/go-build' - persist_to_workspace: root: '/go' paths: - '*' test-go-linux-386: executor: telegraf-ci parameters: goversion: type: string default: 1.21.4 cache_version: type: string default: "v1" steps: - checkout - restore_cache: name: "Restore Go caches" key: go-caches-<< parameters.cache_version >>-linux-386-go<< parameters.goversion >>-{{ checksum "go.sum" }} - check-changed-files-or-halt - run: 'GOARCH=386 make deps' - run: 'GOARCH=386 make tidy' - run: 'GOARCH=386 make check' - test-go: arch: "386" - save_cache: name: "Save Go caches" key: go-caches-<< parameters.cache_version >>-linux-386-go<< parameters.goversion >>-{{ checksum "go.sum" }} paths: - '/go/pkg/mod' - '~/.cache/golangci-lint' - '~/.cache/go-build' test-integration: machine: image: ubuntu-2204:current resource_class: large steps: - checkout - check-changed-files-or-halt - run: 'sh ./scripts/installgo_linux.sh' - run: 'make deps' - run: 'make test-integration' test-go-mac: executor: mac parameters: goversion: type: string default: 1.21.4 cache_version: type: string default: "v1" steps: - checkout - restore_cache: name: "Restore Go caches" key: go-caches-<< parameters.cache_version >>-darwin-arm64-go<< parameters.goversion >>-{{ checksum "go.sum" }} - test-go: os: darwin arch: arm64 - save_cache: name: "Save Go caches" key: go-caches-<< parameters.cache_version >>-darwin-arm64-go<< parameters.goversion >>-{{ checksum "go.sum" }} paths: - '~/go/pkg/mod' - '~/Library/Caches/golangci-lint' - '~/Library/Caches/go-build' test-go-windows: parameters: goversion: type: string default: 1.21.4 cache_version: type: string default: "v1" executor: name: win/default shell: bash.exe size: xlarge steps: - checkout - restore_cache: name: "Restore Go caches" key: go-caches-<< parameters.cache_version >>-windows-amd64-go<< parameters.goversion >>-{{ checksum "go.sum" }} - test-go: os: windows gotestsum: "gotestsum.exe" - save_cache: name: "Save Go caches" key: go-caches-<< parameters.cache_version >>-windows-amd64-go<< parameters.goversion >>-{{ checksum "go.sum" }} paths: - '~\go\pkg\mod' - '~\AppData\Local\golangci-lint' - '~\AppData\Local\go-build' test-licenses: executor: telegraf-ci parameters: goversion: type: string default: 1.21.4 cache_version: type: string default: "v1" steps: - checkout - restore_cache: name: "Restore Go caches" key: go-caches-<< parameters.cache_version >>-linux-amd64-go<< parameters.goversion >>-{{ checksum "go.sum" }} - check-changed-files-or-halt - run: 'make build_tools' - run: './tools/license_checker/license_checker -whitelist ./tools/license_checker/data/whitelist' - save_cache: name: "Save Go caches" key: go-caches-<< parameters.cache_version >>-linux-amd64-go<< parameters.goversion >>-{{ checksum "go.sum" }} paths: - '/go/pkg/mod' - '~/.cache/golangci-lint' - '~/.cache/go-build' windows-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: windows nightly: << parameters.nightly >> darwin-amd64-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: darwin-amd64 nightly: << parameters.nightly >> darwin-arm64-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: darwin-arm64 nightly: << parameters.nightly >> i386-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: i386 nightly: << parameters.nightly >> ppc64le-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: ppc64le nightly: << parameters.nightly >> riscv64-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: riscv64 nightly: << parameters.nightly >> s390x-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: s390x nightly: << parameters.nightly >> armel-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: armel nightly: << parameters.nightly >> amd64-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: amd64 nightly: << parameters.nightly >> arm64-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: arm64 nightly: << parameters.nightly >> mipsel-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: mipsel nightly: << parameters.nightly >> mips-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: mips nightly: << parameters.nightly >> armhf-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: armhf nightly: << parameters.nightly >> nightly: executor: telegraf-ci steps: - attach_workspace: at: '/build' - run: command: | aws s3 sync /build/dist s3://dl.influxdata.com/telegraf/nightlies/ \ --exclude "*" \ --include "*.tar.gz" \ --include "*.deb" \ --include "*.rpm" \ --include "*.zip" \ --acl public-read release: executor: telegraf-ci steps: - attach_workspace: at: '/build' - run: command: | aws s3 sync /build/dist s3://dl.influxdata.com/telegraf/releases/ \ --exclude "*" \ --include "telegraf*.DIGESTS" \ --include "telegraf*.digests" \ --include "telegraf*.asc" \ --include "telegraf*.deb" \ --include "telegraf*.dmg" \ --include "telegraf*.rpm" \ --include "telegraf*.tar.gz" \ --include "telegraf*.zip" \ --acl public-read docker-nightly: machine: image: ubuntu-2004:current steps: - run: name: login to quay.io command: docker login --username="${QUAY_USER}" --password="${QUAY_PASS}" quay.io - run: name: clone influxdata/influxdata-docker command: git clone https://github.com/influxdata/influxdata-docker - run: name: build and push telegraf:nightly command: | cd influxdata-docker/telegraf/nightly docker build -t telegraf . docker tag telegraf quay.io/influxdb/telegraf-nightly:latest docker image ls docker push quay.io/influxdb/telegraf-nightly:latest - run: name: build and push telegraf:nightly-alpine command: | cd influxdata-docker/telegraf/nightly/alpine docker build -t telegraf-alpine . docker tag telegraf-alpine quay.io/influxdb/telegraf-nightly:alpine docker image ls docker push quay.io/influxdb/telegraf-nightly:alpine amd64-package-test-nightly: machine: image: ubuntu-2004:current steps: - checkout - attach_workspace: at: '.' - run: sudo apt update && sudo apt install -y snapd - run: sudo snap install lxd - run: sudo lxd init --auto - run: sudo usermod -a -G lxd $(whoami) - run: cd tools/package_lxd_test && go build - run: ./tools/package_lxd_test/package_lxd_test --package $(find ./dist -name "*_amd64.deb") - run: ./tools/package_lxd_test/package_lxd_test --package $(find ./dist -name "*.x86_64.rpm") package-sign-windows: executor: name: win/default shell: powershell.exe steps: - checkout - check-changed-files-or-halt - attach_workspace: at: '/build' - run: name: "Sign Windows Executables" shell: powershell.exe command: | ./scripts/windows-signing.ps1 - persist_to_workspace: root: './build' paths: - 'dist' package-sign-mac: executor: mac working_directory: /Users/distiller/project environment: FL_OUTPUT_DIR: output FASTLANE_LANE: test shell: /bin/bash --login -o pipefail steps: - checkout - check-changed-files-or-halt - attach_workspace: at: '.' - run: command: | sh ./scripts/mac-signing.sh - persist_to_workspace: root: './build' paths: - 'dist' package-consolidate: docker: - image: alpine steps: - attach_workspace: at: '.' - run: command: | cd dist && find . -type f -name '._*' -delete - store_artifacts: path: './dist' destination: 'build/dist' - run: command: | echo "This job contains all the final artifacts." share-artifacts: executor: aws-cli/default steps: - checkout - check-changed-files-or-halt - run: command: | PR=${CIRCLE_PULL_REQUEST##*/} printf -v payload '{ "pullRequestNumber": "%s" }' "$PR" curl -X POST "https://182c7jdgog.execute-api.us-east-1.amazonaws.com/prod/shareArtifacts" --data "$payload" package-sign: circleci_ip_ranges: true docker: - image: quay.io/influxdb/rsign:latest auth: username: $QUAY_RSIGN_USERNAME password: $QUAY_RSIGN_PASSWORD steps: - add_ssh_keys: fingerprints: - 3b:c0:fe:a0:8a:93:33:69:de:22:ac:20:a6:ed:6b:e5 - attach_workspace: at: . - run: | cd dist # Generate the *.DIGESTS files. This must be done before the signing # step so that the *.DIGEST files are also signed. for target in * do sha256sum "${target}" > "${target}.DIGESTS" done for target in * 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|*.dmg|*.rpm|*.tar.gz|*.zip|*.DIGESTS) rsign "${target}" ;; esac done for target in * do case "${target}" in *.deb|*.dmg|*.rpm|*.tar.gz|*.zip) # Print sha256 hash and target for artifacts all in one file # for use later during the release. cat "${target}.DIGESTS" >> "telegraf-${CIRCLE_TAG}.DIGESTS" ;; esac done - persist_to_workspace: root: ./ paths: - dist - store_artifacts: path: ./dist workflows: version: 2 check: when: not: equal: [ scheduled_pipeline, << pipeline.trigger_source >> ] jobs: - 'test-go-linux': filters: tags: only: /.*/ - 'test-go-linux-386': filters: tags: only: /.*/ - 'test-go-mac': filters: tags: # only runs on tags if you specify this filter only: /.*/ - 'test-go-windows': filters: tags: only: /.*/ - 'test-integration': filters: tags: only: /.*/ - 'windows-package': requires: - 'test-go-windows' filters: tags: only: /.*/ - 'darwin-amd64-package': requires: - 'test-go-mac' filters: tags: only: /.*/ - 'darwin-arm64-package': requires: - 'test-go-mac' filters: branches: ignore: - master tags: only: /.*/ - 'i386-package': requires: - 'test-go-linux-386' filters: branches: ignore: - master tags: only: /.*/ - 'ppc64le-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'riscv64-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 's390x-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'armel-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'amd64-package': requires: - 'test-go-linux' filters: tags: only: /.*/ - 'arm64-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'armhf-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'mipsel-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'mips-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'share-artifacts': requires: - 'i386-package' - 'ppc64le-package' - 'riscv64-package' - 's390x-package' - 'armel-package' - 'amd64-package' - 'mipsel-package' - 'mips-package' - 'darwin-amd64-package' - 'darwin-arm64-package' - 'windows-package' - 'arm64-package' - 'armhf-package' filters: branches: ignore: - master - release.* tags: ignore: /.*/ - 'package-sign-windows': requires: - 'windows-package' filters: tags: only: /.*/ branches: ignore: /.*/ - 'package-sign-mac': requires: - 'darwin-amd64-package' - 'darwin-arm64-package' filters: tags: only: /.*/ branches: ignore: /.*/ - 'package-sign': requires: - 'i386-package' - 'ppc64le-package' - 'riscv64-package' - 's390x-package' - 'armel-package' - 'amd64-package' - 'mipsel-package' - 'mips-package' - 'arm64-package' - 'armhf-package' - 'package-sign-mac' - 'package-sign-windows' filters: tags: only: /.*/ branches: ignore: /.*/ - 'package-consolidate': requires: - 'i386-package' - 'ppc64le-package' - 's390x-package' - 'armel-package' - 'amd64-package' - 'mipsel-package' - 'mips-package' - 'arm64-package' - 'armhf-package' - 'riscv64-package' - 'package-sign-mac' - 'package-sign-windows' - 'package-sign' filters: tags: only: /.*/ branches: ignore: /.*/ - 'release': requires: - 'package-consolidate' filters: tags: only: /.*/ branches: ignore: /.*/ nightly: when: equal: [ scheduled_pipeline, << pipeline.trigger_source >> ] jobs: - 'test-go-linux' - 'test-go-linux-386' - 'test-go-mac' - 'test-go-windows' - 'test-licenses' - 'windows-package': name: 'windows-package-nightly' nightly: true requires: - 'test-go-windows' - 'darwin-amd64-package': name: 'darwin-amd64-package-nightly' nightly: true requires: - 'test-go-mac' - 'darwin-arm64-package': name: 'darwin-arm64-package-nightly' nightly: true requires: - 'test-go-mac' - 'i386-package': name: 'i386-package-nightly' nightly: true requires: - 'test-go-linux-386' - 'ppc64le-package': name: 'ppc64le-package-nightly' nightly: true requires: - 'test-go-linux' - 'riscv64-package': name: 'riscv64-package-nightly' nightly: true requires: - 'test-go-linux' - 's390x-package': name: 's390x-package-nightly' nightly: true requires: - 'test-go-linux' - 'armel-package': name: 'armel-package-nightly' nightly: true requires: - 'test-go-linux' - 'amd64-package': name: 'amd64-package-nightly' nightly: true requires: - 'test-go-linux' - 'arm64-package': name: 'arm64-package-nightly' nightly: true requires: - 'test-go-linux' - 'armhf-package': name: 'armhf-package-nightly' nightly: true requires: - 'test-go-linux' - 'mipsel-package': name: 'mipsel-package-nightly' nightly: true requires: - 'test-go-linux' - 'mips-package': name: 'mips-package-nightly' nightly: true requires: - 'test-go-linux' - 'package-sign-windows': requires: - 'windows-package-nightly' - 'package-sign-mac': requires: - 'darwin-amd64-package-nightly' - 'darwin-arm64-package-nightly' - nightly: requires: - 'amd64-package-test-nightly' - 'arm64-package-nightly' - 'armel-package-nightly' - 'armhf-package-nightly' - 'darwin-amd64-package-nightly' - 'darwin-arm64-package-nightly' - 'i386-package-nightly' - 'mips-package-nightly' - 'mipsel-package-nightly' - 'ppc64le-package-nightly' - 'riscv64-package-nightly' - 's390x-package-nightly' - 'windows-package-nightly' - docker-nightly: requires: - 'nightly' - amd64-package-test-nightly: requires: - 'amd64-package-nightly'