aboutsummaryrefslogblamecommitdiffstats
path: root/.github/workflows/ferdi-builds.yml
blob: fc87275c4a9633fce213f486202302458600576f (plain) (tree)




























































                                                                                                                                   



                                                                
                                                                 



                                                                              











                                                                                                                     
                                                                                                                                 
































































































                                                                                                                                                                               
                                             






                                                                                                                                                   
                                            






                                                                                                                                 





                                                                                                                                               
                                            






                                                                                                                                 
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions

# Note: This workflow requires some secrets setup, and set on this repo with the names:
  # 'FERDI_PUBLISH_TOKEN' (A GitHub Personal Access Token with appropriate permissions - for publishing the built artifacts)
  # 'APPLEID' (The username of your Apple developer account - for notarizing the mac artifacts)
  # 'APPLEID_PASSWORD' (An app-specific password - for notarizing the mac artifacts)
  # 'CSC_LINK' (The HTTPS link or local path to certificate - for code signing of mac and windows artifacts)
  # 'CSC_KEY_PASSWORD' (The password to decrypt the certificate given in CSC_LINK - for code signing of mac and windows artifacts)

name: Ferdi Builds

on:
  # Push to any tracked branches
  push:
    branches: [develop, release, nightly]
  # PRs only on develop branch
  pull_request:
    branches: [develop]
  # Manual trigger from the UI
  workflow_dispatch:
    inputs:
      message:
        description: 'Message for build'
        required: true
  schedule:
    - cron: '0 0 * * *' # every night at 12 am

env:
  USE_HARD_LINKS: false
  # DEBUG: electron-builder

jobs:
  check_date:
    runs-on: ubuntu-latest
    name: Check latest commit
    outputs:
      should_run: ${{ steps.should_run.outputs.should_run }}
    steps:
      - name: Checkout code along with submodules for the 'nightly' branch if the trigger event is 'scheduled'
        uses: actions/checkout@v2
        with:
          ref: nightly
          submodules: recursive
          fetch-depth: 0
      - name: Print latest commit
        run: echo ${{ github.sha }}
      - name: Setup git configs
        run: |
          git config user.name github-actions
          git config user.email github-actions@github.com
      - name: Merge from 'origin/develop' (continue if errored)
        if: ${{ github.event_name == 'schedule' }}
        continue-on-error: true
        run: git merge --no-ff --no-verify --commit -m "Merge remote-tracking branch 'origin/develop' into HEAD" origin/develop
      - name: Update submodules (continue if errored)
        if: ${{ github.event_name == 'schedule' }}
        continue-on-error: true
        run: |
          echo "Updating submodules"
          git submodule update --remote -f
          git commit -am "Update submodules" --no-verify || true

          echo "Running linter and tests"
          npm run lint && npm run test
          git commit -am "Apply linter fixes" --no-verify || true

          echo "Updating browserslist db"
          npx browserslist@latest --update-db
          git commit -am "Apply browserslist data updates" --no-verify || true
      - name: Capture if this is a manually triggered forced rebuild
        run: echo "FORCE_REBUILD=${{ contains(github.event.inputs.message, 'force build') }}" >> $GITHUB_ENV
      - id: should_run
        name: Check whether there are any commits since this run was last triggered and either push or set the output
        if: ${{ github.event_name == 'schedule' || env.FORCE_REBUILD == 'true' }}
        run: |
          CHANGES_COUNT=$(git diff --shortstat origin/nightly | wc -l)
          echo "Number of changes: $CHANGES_COUNT"
          if [ $CHANGES_COUNT -eq 0 ] && [ $FORCE_REBUILD != "true" ]; then
            echo "No changes found - terminating the build"
            echo "::set-output name=should_run::false"
          else
            if [ $FORCE_REBUILD != "true" ] || [ "${{ contains(github.event.inputs.message, 'version bump') }}" == "true" ]; then
              echo "Bumping version number"
              npm version prerelease --preid=nightly
            fi

            echo "Pushing merge, linter, submodule and version-bump commits"
            git push origin nightly --no-verify
          fi

  build:
    name: '${{ matrix.os }}'
    needs: check_date
    if: ${{ needs.check_date.outputs.should_run != 'false' }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [macos-10.15, ubuntu-20.04, windows-2019]
        node-version: [14.16.1]
      fail-fast: false
    steps:
      - name: Set env vars for macOS and Linux
        if: startsWith(runner.os, 'macOS') || startsWith(runner.os, 'Linux')
        run: |
          echo "NPM_CACHE=$HOME/.npm" >> $GITHUB_ENV
          echo "ELECTRON_CACHE=$HOME/.cache/electron" >> $GITHUB_ENV
          echo "ELECTRON_BUILDER_CACHE=$HOME/.cache/electron-builder" >> $GITHUB_ENV
          echo "FORCE_REBUILD_ON_NIGHTLY=${{ contains(github.event.inputs.message, 'force build') && contains(github.event.inputs.message, 'nightly branch') }}" >> $GITHUB_ENV
      - name: Set env vars for Windows
        if: startsWith(runner.os, 'Windows')
        run: |
          echo "HOME=$USERPROFILE" >> $GITHUB_ENV
          echo "NPM_CACHE=$USERPROFILE\.npm" >> $GITHUB_ENV
          echo "ELECTRON_CACHE=$USERPROFILE\.cache\electron" >> $GITHUB_ENV
          echo "ELECTRON_BUILDER_CACHE=$USERPROFILE\.cache\electron-builder" >> $GITHUB_ENV
          echo "FORCE_REBUILD_ON_NIGHTLY=${{ contains(github.event.inputs.message, 'force build') && contains(github.event.inputs.message, 'nightly branch') }}" >> $GITHUB_ENV
        shell: bash
      - name: Checkout code along with submodules for the 'nightly' branch if the trigger event is 'scheduled' or this is a forced rebuild on the nightly branch
        uses: actions/checkout@v2
        if: ${{ github.event_name == 'schedule' || env.FORCE_REBUILD_ON_NIGHTLY == 'true' }}
        with:
          submodules: recursive
          ref: nightly
      - name: Checkout code along with submodules for any branch if the trigger event is NOT 'scheduled' and this is NOT a forced rebuild on the nightly branch
        uses: actions/checkout@v2
        if: ${{ github.event_name != 'schedule' && env.FORCE_REBUILD_ON_NIGHTLY != 'true' }}
        with:
          submodules: recursive
      - name: Extract Git branch name from the currently checked out branch (not from the branch where this run was kicked off)
        run: echo "GIT_BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV
        shell: bash
      - name: Cache node modules
        uses: actions/cache@v2
        env:
          cache-name: cache-node-modules
        with:
          path: ${{ env.NPM_CACHE }}
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-build-${{ env.cache-name }}-
            ${{ runner.os }}-build-
            ${{ runner.os }}-
      - name: Cache electron modules
        uses: actions/cache@v2
        env:
          cache-name: cache-electron-modules
        with:
          key: ${{ runner.os }}-${{ env.cache-name }}
          path: ${{ env.ELECTRON_CACHE }}
      - name: Cache electron-builder modules
        uses: actions/cache@v2
        env:
          cache-name: cache-electron-builder-modules
        with:
          key: ${{ runner.os }}-${{ env.cache-name }}
          path: ${{ env.ELECTRON_BUILDER_CACHE }}
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}
      - name: Upgrade Xcode version on the macOS 10.15 default runners provided by GH Actions
        if: startsWith(runner.os, 'macOS')
        run: |
          sudo rm -Rf /Library/Developer/CommandLineTools/SDKs/*
          sudo xcode-select -s "/Applications/Xcode_12.4.app"
      - name: Uninstall locally and reinstall node-gyp globally
        if: startsWith(runner.os, 'macOS') || startsWith(runner.os, 'Linux')
        run: |
          npm uninstall node-gyp
          npm i -g node-gyp@8.0.0 && npm config set node_gyp "$(which node-gyp)"
      - name: Install node dependencies recursively
        run: npx lerna bootstrap
      - name: Package recipes
        run: npm i && npm run package
        working-directory: ./recipes
      - name: Run linter and tests
        run: npm run lint && npm run test
      - name: Build Ferdi without publish for any branch not 'nightly' and not 'release'
        if: ${{ env.GIT_BRANCH_NAME != 'nightly' && env.GIT_BRANCH_NAME != 'release' }}
        run: npm run build -- --publish never
        shell: bash
      - name: Build Ferdi with publish for 'nightly' branch
        if: ${{ env.GIT_BRANCH_NAME == 'nightly' }}
        run: npm run build -- --publish always -c.publish.provider=github -c.publish.owner=${{ github.repository_owner }} -c.publish.repo=nightlies
        shell: bash
        env:
          GH_TOKEN: ${{ secrets.FERDI_PUBLISH_TOKEN }}
          CSC_IDENTITY_AUTO_DISCOVERY: false
          # TODO: Commented out the code signing process for now (so as to at least get unsigned nightlies available for testing)
          # APPLEID: ${{ secrets.APPLEID }}
          # APPLEID_PASSWORD: ${{ secrets.APPLEID_PASSWORD }}
          # CSC_LINK: ${{ secrets.CSC_LINK }}
          # CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
          # WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
          # WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
      - name: Build Ferdi with publish for 'release' branch
        if: ${{ env.GIT_BRANCH_NAME == 'release' }}
        run: npm run build -- --publish always -c.publish.provider=github -c.publish.owner=${{ github.repository_owner }} -c.publish.repo=ferdi
        shell: bash
        env:
          GH_TOKEN: ${{ secrets.FERDI_PUBLISH_TOKEN }}
          CSC_IDENTITY_AUTO_DISCOVERY: false
          # TODO: Commented out the code signing process for now (so as to at least get unsigned nightlies available for testing)
          # APPLEID: ${{ secrets.APPLEID }}
          # APPLEID_PASSWORD: ${{ secrets.APPLEID_PASSWORD }}
          # CSC_LINK: ${{ secrets.CSC_LINK }}
          # CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
          # WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
          # WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}