build: add CI jobs to natively test ARM64, Mac, and Windows (#22539)

pull/22586/head
Daniel Moran 2021-09-24 11:03:56 -04:00 committed by GitHub
parent d5b6f8e8a4
commit 1e9a31a675
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 293 additions and 10 deletions

View File

@ -4,10 +4,31 @@ orbs:
terraform: circleci/terraform@2.1.0
executors:
linux-machine:
cross-builder:
docker:
# NOTE: To upgrade the Go version, first push the upgrade to the cross-builder Dockerfile in the edge repo,
# then update the version here to match. Until we finish the migration to using the cross-builder image,
# you'll also need to update references to `cimg/go` and `GO_VERSION` in this file.
- image: quay.io/influxdb/cross-builder:go1.17.1-41d944d749b2c130119eff7efaaa9883ccffe5a7
resource_class: large
linux-amd64:
machine:
image: ubuntu-2004:202107-02
resource_class: large
linux-arm64:
machine:
image: ubuntu-2004:202101-01
resource_class: arm.large
darwin:
macos:
xcode: 12.4.0
resource_class: medium
shell: /bin/bash -eo pipefail
windows:
machine:
image: windows-server-2019-vs2019:stable
resource_class: windows.medium
shell: bash.exe -eo pipefail
parameters:
aws_teardown:
@ -36,6 +57,35 @@ workflows:
- gotest:
requires:
- godeps
- test-build:
matrix:
parameters:
os: [ linux, darwin, windows ]
arch: [ amd64, arm64 ]
exclude:
- os: darwin
arch: arm64
- os: windows
arch: arm64
# linux/amd64 can be tested directly from our cross-builder image
# to save time & enable running with the race detector.
- os: linux
arch: amd64
- test-prebuilt:
name: test-linux-arm64
executor: linux-arm64
requires:
- test-build-arm64-linux
- test-prebuilt:
name: test-darwin
executor: darwin
requires:
- test-build-amd64-darwin
- test-prebuilt:
name: test-windows
executor: windows
requires:
- test-build-amd64-windows
- fluxtest:
requires:
- godeps
@ -133,6 +183,35 @@ workflows:
- gotest:
requires:
- godeps
- test-build:
matrix:
parameters:
os: [ linux, darwin, windows ]
arch: [ amd64, arm64 ]
exclude:
- os: darwin
arch: arm64
- os: windows
arch: arm64
# linux/amd64 can be tested directly from our cross-builder image
# to save time & enable running with the race detector.
- os: linux
arch: amd64
- test-prebuilt:
name: test-linux-arm64
executor: linux-arm64
requires:
- test-build-arm64-linux
- test-prebuilt:
name: test-darwin
executor: darwin
requires:
- test-build-amd64-darwin
- test-prebuilt:
name: test-windows
executor: windows
requires:
- test-build-amd64-windows
- golint:
requires:
- godeps
@ -435,6 +514,46 @@ jobs:
- store_test_results:
path: /tmp/test-results
test-build:
executor: cross-builder
resource_class: large
parameters:
os:
type: string
arch:
type: string
steps:
- checkout
- run:
name: Build test binaries
command: |
export GOOS=<< parameters.os >>
export GOARCH=<< parameters.arch >>
./scripts/ci/build-tests.sh ./test-bin
- persist_to_workspace:
root: .
paths:
- ./test-bin
test-prebuilt:
parameters:
executor:
type: executor
executor: << parameters.executor >>
parallelism: 8
steps:
- checkout
- attach_workspace:
at: .
- run:
name: Run tests
command: ./scripts/ci/run-prebuilt-tests.sh $(pwd)/test-bin $(pwd)/test-results
- store_test_results:
path: ./test-results
- store_artifacts:
path: ./test-results
destination: raw-test-results
fluxtest:
docker:
- image: cimg/go:1.17.1
@ -520,7 +639,7 @@ jobs:
command: docker push quay.io/influxdb/oss-acceptance:${CIRCLE_SHA1}
cross_build:
executor: linux-machine
executor: linux-amd64
environment:
TMPDIR: /mnt/ramdisk
steps:
@ -612,7 +731,7 @@ jobs:
perf_test:
executor: linux-machine
executor: linux-amd64
parameters:
format:
type: string
@ -636,7 +755,7 @@ jobs:
scripts/ci/perf_test.sh
aws_destroy_by_date:
executor: linux-machine
executor: linux-amd64
steps:
- attach_workspace:
at: /tmp/workspace
@ -666,7 +785,7 @@ jobs:
fi
done
aws_destroy_by_name:
executor: linux-machine
executor: linux-amd64
steps:
- attach_workspace:
at: /tmp/workspace
@ -684,7 +803,7 @@ jobs:
AWS_ACCESS_KEY_ID=${TEST_AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY=${TEST_AWS_SECRET_ACCESS_KEY} aws --region us-west-2 ec2 terminate-instances --instance-ids $instance_id
deploy_nightly:
executor: linux-machine
executor: linux-amd64
environment:
TMPDIR: /mnt/ramdisk
working_directory: /home/circleci/go/src/github.com/influxdata/influxdb
@ -740,7 +859,7 @@ jobs:
destination: test_artifacts/results/shared
litmus_daily:
executor: linux-machine
executor: linux-amd64
steps:
- attach_workspace:
at: ~/project
@ -761,7 +880,7 @@ jobs:
path: ~/project
litmus_integration:
executor: linux-machine
executor: linux-amd64
steps:
- attach_workspace:
at: ~/project
@ -781,7 +900,7 @@ jobs:
path: ~/project
grace_daily:
executor: linux-machine
executor: linux-amd64
steps:
- attach_workspace:
at: ~/project
@ -809,7 +928,7 @@ jobs:
path: ~/project/results
share-testing-image:
executor: linux-machine
executor: linux-amd64
working_directory: /home/circleci/go/src/github.com/influxdata/influxdb
steps:
- attach_workspace:

112
scripts/ci/build-tests.sh Executable file
View File

@ -0,0 +1,112 @@
#!/usr/bin/env bash
set -exo pipefail
declare -r GOTESTSUM_VERSION=1.7.0
# Values are from https://github.com/gotestyourself/gotestsum/releases/download/v${VERSION}/gotestsum-${VERSION}-checksums.txt
function gotestsum_expected_sha () {
case "$(go env GOOS)_$(go env GOARCH)" in
linux_amd64)
echo b5c98cc408c75e76a097354d9487dca114996e821b3af29a0442aa6c9159bd40
;;
linux_arm64)
echo ee57c91abadc464a7cd9f8abbffe94a673aab7deeb9af8c17b96de4bb8f37e41
;;
darwin_amd64)
echo a8e2351604882af1a67601cbeeacdcfa9b17fc2f6fbac291cf5d434efdf2d85b
;;
windows_amd64)
echo 7ae12ddb171375f0c14d6a09dd27a5c1d1fc72edeea674e3d6e7489a533b40c1
;;
*)
>&2 echo Error: Unsupported OS/arch pair for gotestsum: "$(go env GOOS)_$(go env GOARCH)"
exit 1
;;
esac
}
function build_linux () {
local tags=osusergo,netgo,sqlite_foreign_keys,sqlite_json,static_build
local cc
case $(go env GOARCH) in
amd64)
cc=musl-gcc
;;
arm64)
cc=aarch64-unknown-linux-musl-gcc
tags="$tags,noasm"
;;
*)
>&2 echo Error: Unknown arch $(go env GOARCH)
exit 1
;;
esac
local -r extld="-fno-PIC -static -Wl,-z,stack-size=8388608"
CGO_ENABLED=1 PKG_CONFIG=$(which pkg-config) CC=${cc} go-test-compile \
-tags "$tags" -o "${1}/" -ldflags "-extldflags '$extld'" ./...
}
function build_mac () {
CGO_ENABLED=1 PKG_CONFIG=$(which pkg-config) CC=x86_64-apple-darwin16-clang go-test-compile \
-tags sqlite_foreign_keys,sqlite_json -o "${1}/" ./...
}
function build_windows () {
CGO_ENABLED=1 PKG_CONFIG=$(which pkg-config) CC=x86_64-w64-mingw32-gcc go-test-compile \
-tags sqlite_foreign_keys,sqlite_json,timetzdata -o "${1}/" ./...
}
function build_test_tools () {
# Download gotestsum from its releases (faster than building it).
local -r gotestsum_archive="gotestsum_${GOTESTSUM_VERSION}_$(go env GOOS)_$(go env GOARCH).tar.gz"
local -r gotestsum_url="https://github.com/gotestyourself/gotestsum/releases/download/v${GOTESTSUM_VERSION}/${gotestsum_archive}"
curl -L "$gotestsum_url" -O
echo "$(gotestsum_expected_sha) ${gotestsum_archive}" | sha256sum --check --
tar xzf "$gotestsum_archive" -C "${1}/"
rm "$gotestsum_archive"
# Build test2json from the installed Go distribution.
CGO_ENABLED=0 go build -o "${1}/" -ldflags="-s -w" cmd/test2json
}
function write_test_metadata () {
# Write version that should be reported in test results.
echo "$(go env GOVERSION) $(go env GOOS)/$(go env GOARCH)" > "${1}/go.version"
# Write list of all packages.
go list ./... > "${1}/tests.list"
}
function main () {
if [[ $# != 1 ]]; then
>&2 echo Usage: $0 '<output-dir>'
exit 1
fi
local -r out_dir="$1"
mkdir -p "$out_dir"
case $(go env GOOS) in
linux)
build_linux "$out_dir"
;;
darwin)
build_mac "$out_dir"
;;
windows)
build_windows "$out_dir"
;;
*)
>&2 echo Error: unknown OS $(go env GOOS)
exit 1
;;
esac
# Build gotestsum and test2json so downstream jobs can use it without needing `go`.
build_test_tools "$out_dir"
# Write other metadata needed for testing.
write_test_metadata "$out_dir"
}
main ${@}

View File

@ -0,0 +1,52 @@
#!/usr/bin/env bash
set -exo pipefail
function test_package () {
local -r pkg="$1" bin_dir="$2" result_dir="$3"
local -r test_file="${bin_dir}/${pkg}.test"
if [ ! -f "$test_file" ]; then
return
fi
out_dir="${result_dir}/${pkg}"
mkdir -p "${out_dir}"
# Run test files from within their original packages so any relative references
# to data files resolve properly.
local source_dir="${pkg##github.com/influxdata/influxdb/v2}"
source_dir="${source_dir##/}"
if [ -z "$source_dir" ]; then
source_dir="."
fi
(
set +e
cd "$source_dir"
GOVERSION="$(cat ${bin_dir}/go.version)" "${bin_dir}/gotestsum" --junitfile "${out_dir}/report.xml" --raw-command -- \
"${bin_dir}/test2json" -t -p "$pkg" "$test_file" -test.v
if [ $? != 0 ]; then
echo 1 > "${result_dir}/rc"
fi
)
}
function main () {
if [[ $# != 2 ]]; then
>&2 echo Usage: $0 '<test-bin-dir>' '<result-dir>'
exit 1
fi
local -r bin_dir="$1" result_dir="$2"
mkdir -p "$result_dir"
local -r test_packages="$(cat "${bin_dir}/tests.list" | circleci tests split --split-by=timings --timings-type=classname)"
echo 0 > "${result_dir}/rc"
for pkg in ${test_packages[@]}; do
test_package "$pkg" "$bin_dir" "$result_dir"
done
exit $(cat "${result_dir}/rc")
}
main ${@}