JCMais/node-libcurl

View on GitHub
.github/workflows/build-lint-test.yaml

Summary

Maintainability
Test Coverage
name: build-lint-test

on:
  pull_request:

env:
  LIBCURL_RELEASE: 'LATEST'

concurrency:
  group: ${{ github.head_ref }}
  cancel-in-progress: true

# all jobs here must have a matrix identical to the ones inside build-and-release.yaml

jobs:
  build-and-test-nodejs:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - macos-11
          # removed as we enabled CircleCI to run on PRs
          # - ubuntu-18.04 # TODO(jonathan): bump this to a more recent version when we do a major version bump
        libcurl-release:
          - 7.79.1
        node:
          - 10
          - 12
          - 14
          - 16
          - 17
        include:
          # we only want to run lint in one of the jobs
          - os: macos-11
            libcurl-release: 7.79.1
            node: 16
            node-libcurl-cpp-std: c++17
            run-lint-and-tsc: true
          - os: macos-11
            libcurl-release: 7.79.1
            node: 17
            node-libcurl-cpp-std: c++17
          # we also want to build a job for old libcurl versions
          - os: macos-11
            libcurl-release: 7.50.0
            node: 16
            node-libcurl-cpp-std: c++17
    env:
      LIBCURL_RELEASE: ${{ matrix.libcurl-release }}
      LATEST_LIBCURL_RELEASE: ${{ matrix.libcurl-release }}
      NODE_LIBCURL_CPP_STD: c++11
    steps:
      - id: timestamp
        run: echo "::set-output name=timestamp::$(timestamp +%s)"
      - name: Restore the previous run result
        uses: actions/cache@v2
        with:
          path: |
            run_result
          key: ${{ github.run_id }}-${{ github.job }}-${{ steps.timestamp.outputs.timestamp }}
          restore-keys: |
            ${{ github.run_id }}-${{ github.job }}-
      - id: run_result
        run: cat run_result 2>/dev/null || echo 'default'
      - name: Checkout
        uses: actions/checkout@main
      - name: Setup Node.js
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node }}
      - run: echo "NODE_LIBCURL_CPP_STD=${{ matrix.node-libcurl-cpp-std }}" >> $GITHUB_ENV
        if: matrix.node-libcurl-cpp-std
      - if: runner.os == 'macOS'
        name: Install Needed packages on macOS
        run: brew install coreutils wget automake libtool cmake gnu-sed m4
      # not using brew for that one as we need 2.69
      - if: runner.os == 'macOS'
        name: Install autoconf
        run: |
          curl -O -L http://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.gz
          tar -xzf autoconf-2.69.tar.gz
          cd autoconf-*
          ./configure
          make
          make install
          autoconf --version
          ln -s /usr/local/bin/glibtoolize /usr/local/bin/libtoolize
      - if: runner.os == 'Linux'
        name: Install Needed packages on Linux
        run: sudo apt-get install -y cmake
      - name: Output yarn cache dir
        id: yarn-cache-dir
        run: echo "::set-output name=dir::$(yarn cache dir)"
      - name: Restore Yarn Cache
        uses: actions/cache@v1
        id: yarn-cache
        with:
          path: ${{ steps.yarn-cache-dir.outputs.dir }}
          key: v1-${{ runner.os }}-yarn-cache-${{ github.ref }}-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            v1-${{ runner.os }}-yarn-cache-${{ github.ref }}-
            v1-${{ runner.os }}-yarn-cache-
      - name: Restore libcurl deps cache
        uses: actions/cache@v2
        id: libcurl-deps-cache
        with:
          path: |
            ~/.node-gyp
            ~/deps
          key: v4-build-lint-test-${{ runner.os }}-libcurl-deps-cache-node-${{ matrix.node }}
          restore-keys: |
            v4-build-lint-test-${{ runner.os }}-libcurl-deps-cache-node-${{ matrix.node }}
      - name: 'Build node-libcurl'
        if: steps.run_result.outputs.run_result != 'success'
        run: |
          RUN_TESTS=false \
          RUN_PREGYP_CLEAN=false \
          PUBLISH_BINARY=false \
            ./scripts/ci/build.sh
      - name: 'Run lint'
        if: matrix.run-lint-and-tsc && steps.run_result.outputs.run_result != 'success'
        run: yarn lint
      - name: 'Run tsc'
        if: matrix.run-lint-and-tsc && steps.run_result.outputs.run_result != 'success'
        run: yarn build:dist
      # we do run tests in all matrix jobs
      - name: 'Run tests'
        if: steps.run_result.outputs.run_result != 'success'
        run: yarn test:coverage
      # but coverage is only sent for the run-lint-and-tsc job
      - name: Upload coverage to Codecov
        if: matrix.run-lint-and-tsc && steps.run_result.outputs.run_result != 'success'
        uses: codecov/codecov-action@v1
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          file: ./coverage/**
          fail_ci_if_error: false
      - name: Upload artifacts
        if: always() && steps.run_result.outputs.run_result != 'success'
        uses: actions/upload-artifact@v2
        with:
          name: build-logs-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.node }}
          path: ./logs/
          retention-days: 3
      - run: echo "::set-output name=run_result::success" > run_result

  build-and-test-electron:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        # we use CircleCI for linux binaries
        os:
          - macos-11
        node-libcurl-cpp-std:
          - c++17
        libcurl-release:
          - 7.79.1
        node:
          - 16
        electron-version:
          - 15.3.0
          - 14.2.0
          - 13.6.1
          - 12.2.2
          - 11.5.0
    env:
      LIBCURL_RELEASE: ${{ matrix.libcurl-release }}
      LATEST_LIBCURL_RELEASE: ${{ matrix.libcurl-release }}
      ELECTRON_VERSION: ${{ matrix.electron-version }}
    steps:
      - id: timestamp
        run: echo "::set-output name=timestamp::$(timestamp +%s)"
      - name: Restore the previous run result
        uses: actions/cache@v2
        with:
          path: |
            run_result
          key: ${{ github.run_id }}-${{ github.job }}-${{ steps.timestamp.outputs.timestamp }}
          restore-keys: |
            ${{ github.run_id }}-${{ github.job }}-
      - id: run_result
        run: cat run_result 2>/dev/null || echo 'default'
      - run: echo "NODE_LIBCURL_CPP_STD=${{ matrix.node-libcurl-cpp-std }}" >> $GITHUB_ENV
        if: matrix.node-libcurl-cpp-std
      - name: Checkout
        uses: actions/checkout@main
      - name: Setup Node.js
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node }}
      - name: Install Needed packages
        run: brew install coreutils wget automake libtool cmake gnu-sed m4
      # not using brew for that one as we need 2.69
      - name: Install autoconf
        run: |
          curl -O -L http://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.gz
          tar -xzf autoconf-2.69.tar.gz
          cd autoconf-*
          ./configure
          make
          make install
          autoconf --version
          ln -s /usr/local/bin/glibtoolize /usr/local/bin/libtoolize
      - name: Output yarn cache dir
        id: yarn-cache-dir
        run: echo "::set-output name=dir::$(yarn cache dir)"
      - name: Restore Yarn Cache
        uses: actions/cache@v2
        id: yarn-cache
        with:
          path: ${{ steps.yarn-cache-dir.outputs.dir }}
          key: v1-${{ runner.os }}-yarn-cache-${{ github.ref }}-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            v1-${{ runner.os }}-yarn-cache-${{ github.ref }}-
            v1-${{ runner.os }}-yarn-cache-
      - name: Restore Electron Cache
        uses: actions/cache@v2
        with:
          path: ~/Library/Caches/electron
          key: v1-${{ runner.os }}-electron-cache-${{ matrix.electron-version }}
          restore-keys: |
            v1-${{ runner.os }}-electron-cache-${{ matrix.electron-version }}
            v1-${{ runner.os }}-electron-cache-
      - name: Restore libcurl deps cache
        uses: actions/cache@v2
        id: libcurl-deps-cache
        with:
          path: |
            ~/.node-gyp
            ~/deps
          key: v4-build-lint-test-${{ runner.os }}-libcurl-deps-cache-electron-${{ matrix.electron-version }}
          restore-keys: |
            v4-build-lint-test-${{ runner.os }}-libcurl-deps-cache-electron-${{ matrix.electron-version }}
      - name: 'Set GIT_TAG'
        if: startsWith(github.ref, 'refs/tags')
        run: echo "GIT_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
      - name: 'Build node-libcurl'
        if: steps.run_result.outputs.run_result != 'success'
        run: |
          RUN_TESTS=true \
          RUN_PREGYP_CLEAN=false \
          PUBLISH_BINARY=false \
            ./scripts/ci/build.sh
      - name: Upload artifacts
        if: always() && steps.run_result.outputs.run_result != 'success'
        uses: actions/upload-artifact@v2
        with:
          name: build-logs-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.electron-version }}
          path: ./logs/
          retention-days: 5
      - run: echo "::set-output name=run_result::success" > run_result

  build-and-test-nwjs:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        # we use CircleCI for linux binaries
        os:
          - macos-11
        libcurl-release:
          - 7.79.1
        node-libcurl-cpp-std:
          - c++17
        node:
          - 16
        nwjs-version:
          - 0.58.0
          - 0.57.1
          - 0.56.1
    env:
      LIBCURL_RELEASE: ${{ matrix.libcurl-release }}
      LATEST_LIBCURL_RELEASE: ${{ matrix.libcurl-release }}
      NWJS_VERSION: ${{ matrix.nwjs-version }}
    steps:
      - id: timestamp
        run: echo "::set-output name=timestamp::$(timestamp +%s)"
      - name: Restore the previous run result
        uses: actions/cache@v2
        with:
          path: |
            run_result
          key: ${{ github.run_id }}-${{ github.job }}-${{ steps.timestamp.outputs.timestamp }}
          restore-keys: |
            ${{ github.run_id }}-${{ github.job }}-
      - id: run_result
        run: cat run_result 2>/dev/null || echo 'default'
      - run: echo "NODE_LIBCURL_CPP_STD=${{ matrix.node-libcurl-cpp-std }}" >> $GITHUB_ENV
      - name: Checkout
        uses: actions/checkout@main
      - name: Setup Node.js
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node }}
      - name: Install Needed packages
        run: brew install coreutils wget automake libtool cmake gnu-sed m4
      # not using brew for that one as we need 2.69
      - name: Install autoconf
        run: |
          curl -O -L http://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.gz
          tar -xzf autoconf-2.69.tar.gz
          cd autoconf-*
          ./configure
          make
          make install
          autoconf --version
          ln -s /usr/local/bin/glibtoolize /usr/local/bin/libtoolize
      - name: Output yarn cache dir
        id: yarn-cache-dir
        run: echo "::set-output name=dir::$(yarn cache dir)"
      - name: Restore Yarn Cache
        uses: actions/cache@v2
        id: yarn-cache
        with:
          path: ${{ steps.yarn-cache-dir.outputs.dir }}
          key: v1-${{ runner.os }}-yarn-cache-${{ github.ref }}-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            v1-${{ runner.os }}-yarn-cache-${{ github.ref }}-
            v1-${{ runner.os }}-yarn-cache-
      - name: Restore libcurl deps cache
        uses: actions/cache@v2
        id: libcurl-deps-cache
        with:
          path: |
            ~/.node-gyp
            ~/deps
          key: v4-build-lint-test-${{ runner.os }}-libcurl-deps-cache-nwjs-${{ matrix.nwjs-version }}
          restore-keys: |
            v4-build-lint-test-${{ runner.os }}-libcurl-deps-cache-nwjs-${{ matrix.nwjs-version }}
      - name: 'Set GIT_TAG'
        if: startsWith(github.ref, 'refs/tags')
        run: echo "GIT_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
      - name: 'Build node-libcurl'
        if: steps.run_result.outputs.run_result != 'success'
        run: |
          RUN_TESTS=false \
          RUN_PREGYP_CLEAN=false \
          PUBLISH_BINARY=false \
            ./scripts/ci/build.sh
      - name: Upload artifacts
        if: always() && steps.run_result.outputs.run_result != 'success'
        uses: actions/upload-artifact@v2
        with:
          name: build-logs-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.nwjs-version }}
          path: ./logs/
          retention-days: 5
      - run: echo "::set-output name=run_result::success" > run_result