From a47fdb53664ad3d74423b2717e9d0f0cfe1cedcf Mon Sep 17 00:00:00 2001 From: Yousaf Nabi Date: Wed, 19 Jun 2024 17:12:53 +0100 Subject: [PATCH] test(ci): refactor build-and-test workflow to cover musl builds --- .github/workflows/build-and-test.yml | 146 ++++++++++++++++++++------- 1 file changed, 110 insertions(+), 36 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 49d4bb18..b042a1e7 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -15,12 +15,12 @@ jobs: with: fetch-depth: 0 - run: GH_CREATE_PRE_RELEASE=true ./script/ci/release.sh - if: github.ref == 'refs/heads/master' && env.ACT != 'true' && runner.os == 'Linux' + if: github.ref == 'refs/heads/master' && env.ACT != true && runner.os == 'Linux' env: GITHUB_TOKEN: ${{ github.token }} - + prebuild: - needs: [ create_pre_release ] + needs: [create_pre_release] runs-on: ${{ matrix.os }} defaults: run: @@ -30,11 +30,31 @@ jobs: matrix: node-version: [20] os: [ - macos-14, - macos-12, - ubuntu-latest, - windows-latest + macos-12, + ubuntu-latest, + windows-latest, ] + docker: [false] + alpine: [false] + arch: ['amd64'] + include: + - os: ubuntu-latest + docker: true + alpine: false + arch: arm64 + - os: ubuntu-latest + docker: true + alpine: true + arch: arm64 + - os: ubuntu-latest + docker: true + alpine: true + arch: amd64 + - os: macos-14 + docker: false + alpine: false + arch: arm64 + name: Prebuild ${{ matrix.docker == true && matrix.alpine == true && 'linux-musl' || matrix.docker == true && matrix.alpine == false && 'linux' || matrix.os }}-${{ matrix.arch }} env: NODE_VERSION: ${{ matrix.node-version }} @@ -43,7 +63,7 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - + - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: @@ -52,27 +72,32 @@ jobs: - if: runner.os == 'Windows' run: echo "ONLY_DOWNLOAD_PACT_FOR_WINDOWS=true" >> $GITHUB_ENV - - run: ./script/ci/prebuild.sh - - name: Set up QEMU - if: runner.os == 'Linux' + if: ${{ matrix.docker == true && matrix.arch == 'arm64' }} uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - if: runner.os == 'Linux' - uses: docker/setup-buildx-action@v3 - - if: runner.os == 'Linux' - name: prebuild arm64 - run: docker run -v $PWD:/home --platform linux/arm64 --rm node:20 bin/bash -c 'cd /home && /home/script/ci/prebuild.sh' + - if: ${{ matrix.docker == true && matrix.alpine == true }} + name: prebuild linux ${{ matrix.arch }} musl + run: docker run -v $PWD:/home --platform linux/${{ matrix.arch }} --rm node:20-alpine bin/sh -c 'apk add bash && cd /home && bash -c "/home/script/ci/prebuild-alpine.sh" && rm -rf ffi node_modules' + + - if: ${{ matrix.docker == true && matrix.alpine != true }} + name: prebuild linux ${{ matrix.arch }} + run: docker run -v $PWD:/home --platform linux/${{ matrix.arch }} --rm node:20 bin/bash -c 'cd /home && /home/script/ci/prebuild.sh && rm -rf ffi node_modules' + + - run: sudo chown -R $(id -u):$(id -g) prebuilds + if: ${{ matrix.docker == true }} + + - run: ./script/ci/prebuild.sh + if: ${{ matrix.docker != true }} - name: Upload prebuild for ${{ runner.os }}-${{ runner.arch }} uses: actions/upload-artifact@v3 with: path: prebuilds/*.tar.gz - + - run: GH_PRE_RELEASE_UPLOAD=true ./script/ci/release.sh - if: github.ref == 'refs/heads/master' && env.ACT != 'true' + if: github.ref == 'refs/heads/master' && env.ACT != true env: - GITHUB_TOKEN: ${{ github.token }} + GITHUB_TOKEN: ${{ github.token }} test: runs-on: ${{ matrix.os }} @@ -83,13 +108,53 @@ jobs: strategy: fail-fast: false matrix: - node-version: [16,18,20] - os: [ - macos-14, - macos-12, - ubuntu-latest, - windows-latest - ] + node-version: [16, 18, 20, 22] + os: [macos-14, macos-12, ubuntu-latest, windows-latest] + docker: [false] + include: + - os: ubuntu-latest + docker: true + alpine: false + arch: arm64 + node-version: 22 + - os: ubuntu-latest + docker: true + alpine: true + arch: arm64 + node-version: 22 + - os: ubuntu-latest + docker: true + alpine: true + arch: amd64 + node-version: 22 + - os: ubuntu-latest + docker: true + alpine: false + arch: arm64 + node-version: 20 + - os: ubuntu-latest + docker: true + alpine: true + arch: arm64 + node-version: 20 + - os: ubuntu-latest + docker: true + alpine: true + arch: amd64 + node-version: 20 + - os: ubuntu-latest + docker: true + alpine: true + arch: arm64 + node-version: 18 + - os: ubuntu-latest + docker: true + alpine: true + arch: amd64 + node-version: 18 + + name: Test ${{ matrix.docker == true && matrix.alpine == true && 'linux-musl' || matrix.docker == true && matrix.alpine == false && 'linux' || matrix.os }}-${{ matrix.arch }}-node-${{ matrix.node-version }} + env: NODE_VERSION: ${{ matrix.node-version }} LOG_LEVEL: debug @@ -109,22 +174,31 @@ jobs: - if: runner.os == 'Windows' run: echo "ONLY_DOWNLOAD_PACT_FOR_WINDOWS=true" >> $GITHUB_ENV - - run: LOG_LEVEL=debug ./script/ci/unpack-and-test.sh + - if: matrix.os == 'macos-14' + run: brew install protobuf + - run: LOG_LEVEL=debug ./script/ci/unpack-and-test.sh + if: ${{ matrix.docker != true }} - name: Set up QEMU - if: runner.os == 'Linux' + if: ${{ matrix.docker == true && matrix.arch == 'arm64' }} uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - if: runner.os == 'Linux' - uses: docker/setup-buildx-action@v3 - - if: runner.os == 'Linux' + + - if: ${{ matrix.docker == true && matrix.alpine != true && matrix.arch == 'arm64' }} name: test arm64 - run: docker run -v $PWD:/home --platform linux/arm64 --rm node:20 bin/bash -c 'cd /home && npm test' + run: docker run -v $PWD:/home --platform linux/${{ matrix.arch }} --rm node:${{ matrix.node-version }} bin/bash -c 'cd /home && /home/script/ci/unpack-and-test.sh' + + - if: ${{ matrix.docker == true && matrix.alpine == true && matrix.arch == 'amd64' }} + name: test linux amd64 musl + run: docker run -v $PWD:/home --platform linux/${{ matrix.arch }} --rm node:${{ matrix.node-version }}-alpine bin/sh -c 'apk add bash curl gcompat file && cd /home && /home/script/ci/unpack-and-test.sh' + + - if: ${{ matrix.docker == true && matrix.alpine == true && matrix.arch == 'arm64' }} + name: test linux arm64 musl + run: docker run -v $PWD:/home --platform linux/${{ matrix.arch }} --rm node:${{ matrix.node-version }}-alpine bin/sh -c 'apk add bash curl file protoc protobuf-dev && cd /home && /home/script/ci/unpack-and-test.sh' release_dry_run: runs-on: ubuntu-latest - needs: [ create_pre_release, prebuild ] + needs: [create_pre_release, prebuild] if: github.ref == 'refs/heads/master' env: @@ -141,7 +215,7 @@ jobs: node-version: ${{ env.NODE_VERSION }} registry-url: 'https://registry.npmjs.org' - - name: "release - dry run: ${{ env.DRY_RUN }}" + - name: 'release - dry run: ${{ env.DRY_RUN }}' id: publish run: script/ci/release.sh env: