From b7c3f68dac68074b9c58be694925c33d65d3c07b Mon Sep 17 00:00:00 2001 From: Jeremy Rand Date: Wed, 30 Dec 2020 11:11:06 +0000 Subject: [PATCH] Add Cirrus CI --- .cirrus.yml | 170 +++++++++++++++++++++++++++++++++++ testdata/dist.bash | 13 +++ testdata/move_to_gopath.bash | 14 +++ testdata/release.bash | 39 ++++++++ testdata/shellcheck.bash | 13 +++ 5 files changed, 249 insertions(+) create mode 100644 .cirrus.yml create mode 100644 testdata/dist.bash create mode 100644 testdata/move_to_gopath.bash create mode 100644 testdata/release.bash create mode 100644 testdata/shellcheck.bash diff --git a/.cirrus.yml b/.cirrus.yml new file mode 100644 index 0000000..efe842f --- /dev/null +++ b/.cirrus.yml @@ -0,0 +1,170 @@ +# Attention: if you submit an improvement for a Namecoin Cirrus config, please +# file a GitHub issue about it at the namecoin/meta repo, so that we can make +# sure it propagates to all the other Namecoin repos. Thanks! + +task: + alias: Go Lint + container: + image: golangci/golangci-lint:latest + install_script: + - apt-get update + - apt-get install -y libcap-dev + path_script: + - source testdata/move_to_gopath.bash + fetch_script: + - go get -tags "$GOX_TAGS" -d -v -t github.com/$CIRRUS_REPO_FULL_NAME/... + lint_script: + - cd $(go env GOPATH)/src/github.com/$CIRRUS_REPO_FULL_NAME/ + - golangci-lint run --no-config --enable-all --disable gochecknoglobals,gomnd $GOLANGCI_ARGS -v --timeout 5m --out-format json > $CIRRUS_WORKING_DIR/lint-report.json + matrix: + - name: Go Lint $GOOS New + env: + GOLANGCI_ARGS: "--new-from-rev=HEAD~" + - name: Go Lint $GOOS Mandatory + env: + GOLANGCI_ARGS: "--disable=deadcode,errcheck,errorlint,exhaustivestruct,forbidigo,funlen,gci,gocognit,gocritic,godot,godox,goerr113,gofmt,gofumpt,goimports,golint,gosec,gosimple,ineffassign,lll,maligned,nakedret,nestif,nlreturn,nolintlint,paralleltest,scopelint,staticcheck,stylecheck,thelper,unconvert,unparam,unused,whitespace,wrapcheck,wsl" + - name: Go Lint $GOOS + env: + GOLANGCI_ARGS: "" + allow_failures: true + matrix: + - env: + GOOS: linux + - env: + GOOS: windows + always: + golangci_artifacts: + path: lint-report.json + type: text/json + format: golangci + +task: + name: ShellCheck + container: + image: fedora:latest + cpu: 1 + memory: 1G + install_script: dnf install -y ShellCheck + lint_script: bash testdata/shellcheck.bash + +task: + name: Unit Tests Go $GO_VERSION + alias: Unit Tests + container: + image: golang:$GO_VERSION + install_script: + - apt-get update + - apt-get install -y libcap-dev + path_script: + - source testdata/move_to_gopath.bash + fetch_script: + - go get -tags "$GOX_TAGS" -d -v -t github.com/$CIRRUS_REPO_FULL_NAME/... + test_script: go test -tags "$GOX_TAGS" -v github.com/$CIRRUS_REPO_FULL_NAME/... + env: + GOX_TAGS: "" + GO_VERSION: latest + +task: + name: Cross-Compile Go $GO_VERSION + alias: Cross-Compile + container: + image: golang:$GO_VERSION + cpu: 8 + memory: 8G + install_script: + - dpkg --add-architecture i386 + - dpkg --add-architecture armhf + - dpkg --add-architecture arm64 + # TODO: Support cgo for ppc64. + - dpkg --add-architecture ppc64el + - apt-get update + - apt-get install -y gcc-multilib libcap-dev libc6-dev:i386 libcap-dev:i386 libc6-dev:armhf libcap-dev:armhf libc6-dev:arm64 libcap-dev:arm64 libc6-dev:ppc64el libcap-dev:ppc64el + - go get github.com/mitchellh/gox + path_script: + - source testdata/move_to_gopath.bash + fetch_script: + - go get -tags "$GOX_TAGS" -d -v -t github.com/$CIRRUS_REPO_FULL_NAME/... + - GOOS=windows GOARCH=amd64 go get -tags "$GOX_TAGS" -d -v -t github.com/$CIRRUS_REPO_FULL_NAME/... + build_script: + - rm -rf idist + - CGO_ENABLED=1 gox -tags="$GOX_TAGS" -parallel=8 -osarch 'linux/386 linux/amd64 linux/arm linux/arm64 linux/ppc64le' -output "$GOPATH/releasing/idist/$CIRRUS_REPO_NAME-$CIRRUS_TAG-{{.OS}}_{{.Arch}}/bin/{{.Dir}}" github.com/$CIRRUS_REPO_FULL_NAME/... + - CGO_ENABLED=0 gox -tags="$GOX_TAGS" -parallel=8 -osarch 'darwin/amd64 freebsd/386 freebsd/amd64 freebsd/arm linux/ppc64 openbsd/386 openbsd/amd64 netbsd/386 netbsd/amd64 netbsd/arm dragonfly/amd64 solaris/amd64 windows/386 windows/amd64' -output "$GOPATH/releasing/idist/$CIRRUS_REPO_NAME-$CIRRUS_TAG-{{.OS}}_{{.Arch}}/bin/{{.Dir}}" github.com/$CIRRUS_REPO_FULL_NAME/... + - mv $GOPATH/releasing/idist ./idist + upload_script: + - tar -caf idist.tar.gz idist + - curl -s -X POST --data-binary @idist.tar.gz http://$CIRRUS_HTTP_CACHE_HOST/cross_compile_bin_go_latest + env: + GOX_TAGS: "" + GO_VERSION: latest + +task: + # Cirrus Artifact Upload + name: Artifact Upload + container: + image: fedora:latest + cpu: 1 + memory: 1G + depends_on: + - Go Lint + - ShellCheck + - Unit Tests + - Cross-Compile + install_script: + - curl -o idist.tar.gz http://$CIRRUS_HTTP_CACHE_HOST/cross_compile_bin_go_latest + - tar -xaf idist.tar.gz + dist_script: + - bash "testdata/dist.bash" + binaries_artifacts: + path: "dist/*" + env: + GOX_TAGS: "" + GO_VERSION: latest + +task: + # GitHub Release Upload + # TODO: implement this. + name: GitHub Release + container: + image: golang:latest + cpu: 1 + memory: 1G + depends_on: + - Go Lint + - ShellCheck + - Unit Tests + - Cross-Compile + bin_cache: + folder: "idist" + fingerprint_script: + - "echo cross_compile_bin_go_%GO_VERSION%" + reupload_on_changes: false + populate_script: + - "mkdir idist" + install_script: + - go get github.com/tcnksm/ghr + release_script: + - bash "testdata/release.bash" + allow_failures: true + env: + GOX_TAGS: "" + GO_VERSION: latest + +# TODO: Add Windows unit tests + +# TODO: "Testing config parsing" from travis.bash + +# TODO: Add multiple Go versions to Gox builds and unit tests + +# TODO: Add debug stripping and path stripping to Gox for repro builds + +# TODO: Re-add darwin/386 for old Go versions where it was supported + +# TODO: Fix upload repo for tagged commits (don't use Nightly repo for this) + +# TODO: Skip Signify and Release if it's not applicable + +# TODO: Signify Nightlies + +# TODO: IRC notifications on failure + +# TODO: Cron diff --git a/testdata/dist.bash b/testdata/dist.bash new file mode 100644 index 0000000..a71d91e --- /dev/null +++ b/testdata/dist.bash @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +set -ex + +# Make archives. +echo Archiving releases... +mkdir dist +pushd idist || exit 1 +for x in *; do + echo "$x" + tar -caf "../dist/$(basename "$x").tar.gz" "$x" +done +popd || exit 1 diff --git a/testdata/move_to_gopath.bash b/testdata/move_to_gopath.bash new file mode 100644 index 0000000..5ecd78e --- /dev/null +++ b/testdata/move_to_gopath.bash @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +set -euxo pipefail +shopt -s nullglob globstar + +# set GOPATH if empty (travis sets it, but useful for humans) +if [ -z "$GOPATH" ]; then +GOPATH=$(go env GOPATH) +export GOPATH +fi + +mkdir -p "$GOPATH"/src/github.com/"$CIRRUS_REPO_OWNER" +cp -av "$PWD" "$GOPATH"/src/github.com/"$CIRRUS_REPO_FULL_NAME" +cd "$GOPATH"/src/github.com/"$CIRRUS_REPO_FULL_NAME" diff --git a/testdata/release.bash b/testdata/release.bash new file mode 100644 index 0000000..1b2cd54 --- /dev/null +++ b/testdata/release.bash @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +set -ex + +# Only upload version tags and master nightlies. +if ! [[ "$CIRRUS_TAG" =~ ^v[0-9] ]]; then + if [[ "$CIRRUS_BRANCH" != "master" ]]; then + echo Skipping release upload because this build is not for a release tag or a master nightly. + exit 0 + fi + + RELEASES_NAME=$(date +%F)-$(echo "$CIRRUS_CHANGE_IN_REPO" | cut -c-8) + export RELEASES_NAME + git clone "https://NamecoinBot:$RELEASES_TOKEN@github.com/namecoin/nightly-${CIRRUS_REPO_NAME}.git" + cd "nightly-${CIRRUS_REPO_NAME}" + git config --local user.name "NamecoinBot" + git config --local user.email "githubbot@namecoin.org" + export CIRRUS_TAG=$RELEASES_NAME + git tag "$CIRRUS_TAG" + git push origin "$CIRRUS_TAG" + cd .. +fi + +if [[ "$GITHUB_TOKEN" == "" ]]; then + echo "Please provide GitHub access token via GITHUB_TOKEN environment variable!" + exit 1 +fi + +# Make archives. +bash ./testdata/dist.bash + +pushd dist || exit 1 + +echo Uploading releases... +ghr -u "NamecoinBot" -r "nightly-${CIRRUS_REPO_NAME}" "$CIRRUS_TAG" "./" + +popd || exit 1 + +echo Done diff --git a/testdata/shellcheck.bash b/testdata/shellcheck.bash new file mode 100644 index 0000000..133a39f --- /dev/null +++ b/testdata/shellcheck.bash @@ -0,0 +1,13 @@ +#!/bin/bash + +set -euo pipefail +shopt -s nullglob globstar + +# Run shellcheck on all shell scripts +# The .travis directory is currently unused (relic from ncdns). It will be +# re-introduced later. For now, we don't try to lint it, since it's inactive. +ALL_SHELL="$(grep -r --files-with-matches --exclude-dir=.git --exclude-dir=.travis '#!.*/bin/.*sh' ./)" +for I in $ALL_SHELL +do + shellcheck "${I}" +done