CI: Add macOS, Windows x64 and Linux arm64 test support (#1422)

* CI: Add macOS, Windows and Linux arm64 support

* Modify arm64 job name to be inline with the others

* linter: Prevent cache from causing "Cannot open: File exists" issues

* Use setup-go and setup-node's inbuilt caching
This commit is contained in:
Adrian Gallagher
2023-12-28 14:55:50 +11:00
committed by GitHub
parent 2b3c63c5b3
commit e8e0ff3a35
12 changed files with 138 additions and 368 deletions

View File

@@ -30,5 +30,5 @@ also consider improving test coverage whilst working on a certain feature or pac
- [ ] I have made corresponding changes to the documentation and regenerated documentation via the documentation tool
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] New and existing unit tests pass locally and on Github Actions/AppVeyor with my changes
- [ ] New and existing unit tests pass locally and on Github Actions with my changes
- [ ] Any dependent changes have been merged and published in downstream modules

12
.github/workflows/arm64.Dockerfile vendored Normal file
View File

@@ -0,0 +1,12 @@
FROM arm64v8/golang:1.21
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download && go mod verify
COPY . /app
RUN go build
CMD ["go", "test", "./..."]

View File

@@ -9,7 +9,8 @@ jobs:
- uses: actions/setup-go@v5
with:
go-version: '1.21.x'
cache: false
- name: golangci-lint
uses: golangci/golangci-lint-action@v3
with:
version: v1.54.0
version: v1.54.0

View File

@@ -4,21 +4,33 @@ env:
GO_VERSION: 1.21.x
jobs:
backend-psql:
name: GoCryptoTrader back-end with PSQL
runs-on: ubuntu-latest
services:
postgres:
image: postgres
env:
POSTGRES_DB: gct_dev_ci
POSTGRES_PASSWORD: postgres
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
name: GoCryptoTrader back-end
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
goarch: amd64
psql: true
skip_wrapper_tests: false
- os: ubuntu-latest
goarch: 386
psql: true
skip_wrapper_tests: true
- os: macos-latest
goarch: amd64
psql: true
skip_wrapper_tests: true
- os: macos-13 # beta
goarch: amd64
psql: false
skip_wrapper_tests: true
- os: windows-latest
goarch: amd64
psql: true
skip_wrapper_tests: true
runs-on: ${{ matrix.os }}
steps:
- name: Cancel previous workflow runs
@@ -26,6 +38,25 @@ jobs:
with:
access_token: ${{ github.token }}
- name: Setup Postgres
if: matrix.psql == true
uses: ikalnytskyi/action-setup-postgres@v4
with:
database: gct_dev_ci
id: postgres
- name: Set up Postgres environment
if: matrix.psql == true
run: |
echo "PSQL_USER=postgres" >> $GITHUB_ENV
echo "PSQL_PASS=postgres" >> $GITHUB_ENV
echo "PSQL_HOST=localhost" >> $GITHUB_ENV
echo "PSQL_DBNAME=gct_dev_ci" >> $GITHUB_ENV
echo "PSQL_TESTDBNAME=gct_dev_ci" >> $GITHUB_ENV
echo "PSQL_SSLMODE=disable" >> $GITHUB_ENV
echo "PSQL_SKIPSQLCMD=true" >> $GITHUB_ENV
shell: bash
- name: Checkout code
uses: actions/checkout@v4
@@ -34,45 +65,38 @@ jobs:
with:
go-version: ${{ env.GO_VERSION }}
- name: Cache go modules
uses: actions/cache@v3
with:
path: |
~/go/pkg/mod
~/.cache/go-build
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: ${{ runner.os }}-go-
- name: Skip additional wrapper CI tests
if: matrix.skip_wrapper_tests == true
run: |
echo "SKIP_WRAPPER_CI_TESTS=true" >> $GITHUB_ENV
shell: bash
- name: Additional steps for 386 architecture
if: matrix.goarch == '386'
run: |
echo "CGO_ENABLED=1" >> $GITHUB_ENV
sudo apt-get update
sudo apt-get install gcc-multilib g++-multilib
shell: bash
- name: Test
run: go test -race -coverprofile coverage.txt -covermode atomic ./...
run: |
unset PGSERVICEFILE
if [ "${{ matrix.goarch }}" = "386" ]; then
go test -coverprofile coverage.txt -covermode atomic ./...
else
go test -race -coverprofile coverage.txt -covermode atomic ./...
fi
shell: bash
env:
PSQL_USER: postgres
PSQL_PASS: postgres
PSQL_HOST: localhost
PSQL_DBNAME: gct_dev_ci
PSQL_SKIPSQLCMD: true
PSQL_TESTDBNAME: gct_dev_ci
PSQL_SSLMODE: disable
GOARCH: ${{ matrix.goarch }}
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
backend-32bit:
name: GoCryptoTrader back-end 32-bit with PSQL
backend-arm64:
name: GoCryptoTrader back-end (ubuntu-latest, arm64, false, true)
runs-on: ubuntu-latest
services:
postgres:
image: postgres
env:
POSTGRES_DB: gct_dev_ci
POSTGRES_PASSWORD: postgres
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
steps:
- name: Cancel previous workflow runs
@@ -82,43 +106,38 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v5
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
go-version: ${{ env.GO_VERSION }}
platforms: linux/arm64
- name: Cache go modules
- name: Set up Docker buildx
uses: docker/setup-buildx-action@v3
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: |
~/go/pkg/mod
~/.cache/go-build
key: ${{ runner.os }}-go-386-${{ hashFiles('**/go.sum') }}
restore-keys: ${{ runner.os }}-go-386-
- name: Update apt-get
run: sudo apt-get update
- name: Install gcc-multilib
run: sudo apt-get install gcc-multilib
- name: Test
run: go test -coverprofile coverage.txt -covermode atomic ./...
env:
PSQL_USER: postgres
PSQL_PASS: postgres
PSQL_HOST: localhost
PSQL_DBNAME: gct_dev_ci
PSQL_SKIPSQLCMD: true
PSQL_TESTDBNAME: gct_dev_ci
PSQL_SSLMODE: disable
GOARCH: 386
CGO_ENABLED: 1
CGO_CFLAGS: -fno-stack-protector
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
path: /tmp/.docker-buildx-cache
key: ${{ runner.os }}-docker-buildx-${{ hashFiles('./.github/workflows/arm64.Dockerfile') }}-${{ github.sha }}
restore-keys: |
${{ runner.os }}-docker-buildx-${{ hashFiles('./.github/workflows/arm64.Dockerfile') }}-
${{ runner.os }}-docker-buildx-
- name: Build Docker image
run: |
docker buildx build \
--load \
--platform linux/arm64 \
--cache-to=type=local,dest=/tmp/.docker-buildx-cache,mode=max \
--cache-from=type=local,src=/tmp/.docker-buildx-cache \
--tag gct-backend-arm64 \
-f ./.github/workflows/arm64.Dockerfile \
.
- name: Run Docker image
run: |
docker run --platform linux/arm64 --env SKIP_WRAPPER_CI_TESTS=true --env CI=true --rm gct-backend-arm64
frontend:
name: GoCryptoTrader front-end
@@ -135,15 +154,8 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: '10.8.x'
- name: Cache Node.js modules
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.OS }}-node-
${{ runner.OS }}-
cache: 'npm'
cache-dependency-path: web/package-lock.json
- name: Build
run: |