JCMais/node-libcurl

View on GitHub
.github/workflows/build-and-release.yaml

Summary

Maintainability
Test Coverage
## GitHub Actions is used to build:
## - Electron (macOs)
## - Nwjs (macOs)
## - Node.js (macOs, linux)

name: build-and-release

on:
  push:
    tags:
      - '*'
    branches:
      - master
      - develop
  workflow_dispatch:
    inputs:
      publish-binary:
        type: boolean
        default: false
        description: Publish binary?
        required: true

env:
  NODE_LIBCURL_GITHUB_TOKEN: ${{ secrets.NODE_LIBCURL_GITHUB_TOKEN }}
  PUBLISH_BINARY: ${{ github.event.inputs.publish-binary }}
  NODE_LIBCURL_CPP_STD: c++17

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

jobs:
  build-and-release-nodejs:
    runs-on: ${{ matrix.os }}
    container: ${{ matrix.os == 'ubuntu-18.04' && 'ubuntu:xenial' || '' }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - macos-11
          - ubuntu-20.04
        libcurl-release:
          - 7.86.0
        node:
          - 18
          - 20
          - 21
    env:
      LIBCURL_RELEASE: ${{ matrix.libcurl-release }}
      LATEST_LIBCURL_RELEASE: ${{ matrix.libcurl-release }}
    steps:
      - id: timestamp
        run: echo "::set-output name=timestamp::$(timestamp +%s)"
      - name: Restore the previous run result
        uses: actions/cache@v3
        with:
          path: |
            run_result
          key: v1-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.node }}-${{ github.run_id }}-${{ github.job }}-${{ steps.timestamp.outputs.timestamp }}
          restore-keys: |
            v1-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.node }}-${{ github.run_id }}-${{ github.job }}-
      - id: run_result
        run: cat run_result 2>/dev/null || echo 'default'
      - if: runner.os == 'Linux'
        name: Install Needed packages on Linux
        run: |
          if ! command -v sudo; then
            apt-get update && apt-get install -y sudo
          else
            sudo apt-get update
          fi

          if ! command -v cmake; then
            sudo apt-get install -y cmake
          fi

          if ! command -v curl; then
            # we will assume a lot of other ones are missing
            sudo apt-get install -y software-properties-common
            sudo apt-add-repository ppa:git-core/ppa && sudo apt-get update && sudo apt-get install -y git curl wget python autoconf libtool-bin m4 groff groff-base pkg-config automake bzip2 apt-transport-https ca-certificates
          fi

          if ! command -v yarn; then
            echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
            curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
            sudo apt-get update && sudo apt-get install -y yarn
          fi
      - 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 on macOS
        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@v3
        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@v3
        id: libcurl-deps-cache
        with:
          path: |
            ~/.node-gyp
            ~/deps
          key: v4-${{ runner.os }}-libcurl-deps-cache-node-${{ matrix.node }}
          restore-keys: |
            v4-${{ runner.os }}-libcurl-deps-cache-node-${{ matrix.node }}
      - name: 'Set GIT_TAG'
        if: startsWith(github.ref, 'refs/tags')
        run: echo "GIT_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
      - name: 'Publish Binary'
        if: steps.run_result.outputs.run_result != 'success'
        run: |
          GIT_COMMIT=${{ github.sha }} GIT_TAG=$GIT_TAG ./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.node }}
          path: ./logs/
          retention-days: 5
      - run: echo "::set-output name=run_result::success" > run_result

  build-and-release-electron:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        # we use CircleCI for linux binaries
        os:
          - macos-11
        libcurl-release:
          - 7.86.0
        node:
          - 20
        electron-version:
          - 28.0.0
          - 27.1.3
          - 26.6.2
    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@v3
        with:
          path: |
            run_result
          key: v1-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.electron-version }}-${{ github.run_id }}-${{ runner.os }}-${{ github.job }}-${{ steps.timestamp.outputs.timestamp }}
          restore-keys: |
            v1-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.electron-version }}-${{ github.run_id }}-${{ runner.os }}-${{ 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@v3
        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@v3
        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@v3
        id: libcurl-deps-cache
        with:
          path: |
            ~/.node-gyp
            ~/deps
          key: v4-${{ runner.os }}-libcurl-deps-cache-electron-${{ matrix.electron-version }}
          restore-keys: |
            v4-${{ 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: 'Publish Binary'
        if: steps.run_result.outputs.run_result != 'success'
        run: |
          GIT_COMMIT=${{ github.sha }} GIT_TAG=$GIT_TAG ./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

  # disabled until nwjs supports newer node-gyp versions + python 3
  # build-and-release-nwjs:
  #   runs-on: ${{ matrix.os }}
  #   strategy:
  #     fail-fast: false
  #     matrix:
  #       # we use CircleCI for linux binaries
  #       os:
  #         - macos-11
  #       libcurl-release:
  #         - 7.86.0
  #       node:
  #         - 18
  #       nwjs-version:
  #         - 0.69.1
  #         - 0.68.1
  #         - 0.67.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@v3
  #       with:
  #         path: |
  #           run_result
  #         key: v1-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.nwjs-version }}-${{ github.run_id }}-${{ github.job }}-${{ steps.timestamp.outputs.timestamp }}
  #         restore-keys: |
  #           v1-${{ matrix.os }}-${{ matrix.libcurl-release }}-${{ matrix.nwjs-version }}-${{ 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@v3
  #       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@v3
  #       id: libcurl-deps-cache
  #       with:
  #         path: |
  #           ~/.node-gyp
  #           ~/deps
  #         key: v4-${{ runner.os }}-libcurl-deps-cache-nwjs-${{ matrix.nwjs-version }}
  #         restore-keys: |
  #           v4-${{ 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: 'Publish Binary'
  #       if: steps.run_result.outputs.run_result != 'success'
  #       run: |
  #         GIT_COMMIT=${{ github.sha }} GIT_TAG=$GIT_TAG ./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