Builds #303
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 artifacts) | |
# 'CSC_KEY_PASSWORD' (The password to decrypt the certificate given in CSC_LINK - for code signing of mac artifacts) | |
# 'WIN_CSC_LINK' (The HTTPS link or local path to certificate - for code signing of windows artifacts) | |
# 'WIN_CSC_KEY_PASSWORD' (The password to decrypt the certificate given in CSC_LINK - for code signing of windows artifacts) | |
name: 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: '15 0 * * *' # every night at 12:15 am (to allow for dependency builds to complete) | |
env: | |
USE_HARD_LINKS: false | |
# DEBUG: electron-builder | |
jobs: | |
check_updates: | |
permissions: | |
contents: write # for Git to git push | |
runs-on: ubuntu-latest | |
name: 'Check latest commit: ${{ github.event.inputs.message }}' | |
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@v3 | |
if: ${{ github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && contains(github.event.inputs.message, '[nightly branch]')) }} | |
with: | |
ref: nightly | |
submodules: recursive | |
fetch-depth: 0 # Note: Needed to be able to pull the 'develop' branch as well for merging | |
# ssh-key: ${{ secrets.FERDI_PUBLISH_TOKEN }} | |
- name: Use Node.js specified in the '.nvmrc' file | |
uses: actions/setup-node@v3 | |
if: ${{ github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && contains(github.event.inputs.message, '[nightly branch]')) }} | |
with: | |
node-version-file: '.nvmrc' | |
- id: should_run | |
name: Check whether there are any commits since this run was last triggered and push them and/or set the output | |
if: ${{ github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && contains(github.event.inputs.message, '[nightly branch]')) }} | |
run: | | |
git config user.name github-actions | |
git config user.email github-actions@github.com | |
CHANGES_COUNT=$(git diff --shortstat origin/develop | wc -l) | |
MANUAL_REBUILD="${{ github.event_name == 'workflow_dispatch' }}" | |
VERSION_BUMP="${{ contains(github.event.inputs.message, '[version bump]') }}" | |
if [ $CHANGES_COUNT -gt 0 ] || [[ $MANUAL_REBUILD == "true" && $VERSION_BUMP == "true" ]]; then | |
# Do the version bump in the 'develop' branch ONLY if | |
# there were other changes coming from the 'develop' branch (or) | |
# this is a manual trigger with the key-phrase | |
git checkout develop | |
TAG_NAME=$(npm version -m "%s [skip ci]" prerelease --preid=nightly) | |
git commit --all --amend --no-edit --no-verify | |
git push origin develop --no-verify | |
git tag -f $TAG_NAME | |
git push origin --tags --no-verify | |
# Also tag the submodule so as to help identify which changes went into which nightly release | |
# TODO: Not working due to cross-repo access issues by the github-action bot | |
# git -C recipes tag -f $TAG_NAME | |
# git -C recipes push origin --tags --no-verify | |
git checkout nightly | |
fi | |
echo "Merge with fast-forward from 'origin/develop'" | |
git merge --ff-only origin/develop --no-verify | |
echo "Number of changes: $CHANGES_COUNT" | |
if [ $CHANGES_COUNT -eq 0 ] && [ $MANUAL_REBUILD != "true" ]; then | |
echo "No changes found - terminating the build" | |
echo "::set-output name=should_run::false" | |
else # changes > 0 (or) MANUAL_REBUILD=true | |
echo "Pushing rebased commits" | |
git push origin $(git rev-parse --abbrev-ref HEAD) --no-verify | |
fi | |
build_mac: | |
name: 'macos ${{ github.event.inputs.message }}' | |
needs: check_updates | |
if: ${{ (needs.check_updates.outputs.should_run != 'false') && (github.event_name != 'workflow_dispatch' || (github.event_name == 'workflow_dispatch' && (contains(github.event.inputs.message, '[macOS]') || (!contains(github.event.inputs.message, '[macOS]') && !contains(github.event.inputs.message, '[Linux]') && !contains(github.event.inputs.message, '[Windows]'))))) }} | |
runs-on: macos-latest | |
steps: | |
- name: Set env vars | |
run: | | |
echo "NPM_CACHE=$HOME/.npm" >> $GITHUB_ENV | |
echo "PNPM_CACHE=$HOME/.pnpm-store" >> $GITHUB_ENV | |
echo "ELECTRON_CACHE=$HOME/.cache/electron" >> $GITHUB_ENV | |
echo "ELECTRON_BUILDER_CACHE=$HOME/.cache/electron-builder" >> $GITHUB_ENV | |
echo "MANUAL_REBUILD_ON_NIGHTLY=${{ github.event_name == 'workflow_dispatch' && contains(github.event.inputs.message, '[nightly branch]') }}" >> $GITHUB_ENV | |
echo "SKIP_NOTARIZATION=${{ !contains(github.repository_owner, 'getferdi') }}" >> $GITHUB_ENV | |
- 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@v3 | |
if: ${{ github.event_name == 'schedule' || env.MANUAL_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@v3 | |
if: ${{ github.event_name != 'schedule' && env.MANUAL_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 electron modules | |
uses: actions/cache@v3 | |
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@v3 | |
env: | |
cache-name: cache-electron-builder-modules | |
with: | |
key: ${{ runner.os }}-${{ env.cache-name }} | |
path: ${{ env.ELECTRON_BUILDER_CACHE }} | |
- name: Use Node.js specified in the '.nvmrc' file | |
uses: actions/setup-node@v3 | |
with: | |
node-version-file: '.nvmrc' | |
- name: Install npm | |
run: npm i -gf npm@8.7.0 | |
- name: Install pnpm | |
uses: pnpm/action-setup@v2.0.1 | |
with: | |
version: 6.32.8 | |
- name: Install node dependencies | |
run: npm i | |
- name: Package recipes | |
run: pnpm i && pnpm 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 }} | |
shell: bash | |
env: | |
GH_TOKEN: ${{ secrets.FERDI_PUBLISH_TOKEN }} | |
APPLEID: ${{ secrets.APPLEID }} | |
APPLEID_PASSWORD: ${{ secrets.APPLEID_PASSWORD }} | |
CSC_LINK: ${{ secrets.CSC_LINK }} | |
CSC_KEY_PASSWORD: ${{ secrets.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 }} | |
APPLEID: ${{ secrets.APPLEID }} | |
APPLEID_PASSWORD: ${{ secrets.APPLEID_PASSWORD }} | |
CSC_LINK: ${{ secrets.CSC_LINK }} | |
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} | |
build_linux: | |
name: 'ubuntu ${{ github.event.inputs.message }}' | |
needs: check_updates | |
if: ${{ (needs.check_updates.outputs.should_run != 'false') && (github.event_name != 'workflow_dispatch' || (github.event_name == 'workflow_dispatch' && (contains(github.event.inputs.message, '[Linux]') || (!contains(github.event.inputs.message, '[macOS]') && !contains(github.event.inputs.message, '[Linux]') && !contains(github.event.inputs.message, '[Windows]'))))) }} | |
runs-on: ubuntu-20.04 | |
steps: | |
- name: Set env vars | |
run: | | |
echo "NPM_CACHE=$HOME/.npm" >> $GITHUB_ENV | |
echo "PNPM_CACHE=$HOME/.pnpm-store" >> $GITHUB_ENV | |
echo "ELECTRON_CACHE=$HOME/.cache/electron" >> $GITHUB_ENV | |
echo "ELECTRON_BUILDER_CACHE=$HOME/.cache/electron-builder" >> $GITHUB_ENV | |
echo "MANUAL_REBUILD_ON_NIGHTLY=${{ github.event_name == 'workflow_dispatch' && contains(github.event.inputs.message, '[nightly branch]') }}" >> $GITHUB_ENV | |
echo "SKIP_NOTARIZATION=${{ !contains(github.repository_owner, 'getferdi') }}" >> $GITHUB_ENV | |
- 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@v3 | |
if: ${{ github.event_name == 'schedule' || env.MANUAL_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@v3 | |
if: ${{ github.event_name != 'schedule' && env.MANUAL_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 electron modules | |
uses: actions/cache@v3 | |
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@v3 | |
env: | |
cache-name: cache-electron-builder-modules | |
with: | |
key: ${{ runner.os }}-${{ env.cache-name }} | |
path: ${{ env.ELECTRON_BUILDER_CACHE }} | |
- name: Use Node.js specified in the '.nvmrc' file | |
uses: actions/setup-node@v3 | |
with: | |
node-version-file: '.nvmrc' | |
- name: Install npm | |
run: npm i -gf npm@8.7.0 | |
- name: Install pnpm | |
uses: pnpm/action-setup@v2.0.1 | |
with: | |
version: 6.32.8 | |
- name: Install node dependencies | |
run: npm i | |
- name: Figure out used package.json version | |
run: echo "PACKAGE_VERSION=$(node -p 'require("./package.json").version')" >> $GITHUB_ENV | |
shell: bash | |
- name: Package recipes | |
run: pnpm i && pnpm 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' }} | |
env: | |
GH_TOKEN: ${{ secrets.FERDI_PUBLISH_TOKEN }} | |
CSC_IDENTITY_AUTO_DISCOVERY: false | |
SNAPCRAFT_LOGIN: ${{ secrets.SNAPCRAFT_LOGIN }} | |
run: | | |
sudo snap install snapcraft --classic | |
echo "$SNAPCRAFT_LOGIN" | snapcraft login --with - | |
npm run build -- --publish always -c.publish.provider=github -c.publish.owner=${{ github.repository_owner }} -c.snap.publish.provider=snapStore -c.snap.publish.repo=nightlies -c.snap.publish.channels=edge | |
snapcraft logout | |
shell: bash | |
- name: Build Ferdi with publish for 'release' beta branch | |
if: ${{ env.GIT_BRANCH_NAME == 'release' && contains(env.PACKAGE_VERSION, 'beta') }} | |
env: | |
GH_TOKEN: ${{ secrets.FERDI_PUBLISH_TOKEN }} | |
CSC_IDENTITY_AUTO_DISCOVERY: false | |
SNAPCRAFT_LOGIN: ${{ secrets.SNAPCRAFT_LOGIN }} | |
run: | | |
sudo snap install snapcraft --classic | |
echo "$SNAPCRAFT_LOGIN" | snapcraft login --with - | |
npm run build -- --publish always -c.publish.provider=github -c.publish.owner=${{ github.repository_owner }} -c.publish.repo=ferdi -c.snap.publish.provider=snapStore -c.snap.publish.repo=ferdi -c.snap.publish.channels=beta | |
snapcraft logout | |
shell: bash | |
- name: Build Ferdi with publish for 'release' stable branch | |
if: ${{ env.GIT_BRANCH_NAME == 'release' && !contains(env.PACKAGE_VERSION, 'beta') }} | |
env: | |
GH_TOKEN: ${{ secrets.FERDI_PUBLISH_TOKEN }} | |
CSC_IDENTITY_AUTO_DISCOVERY: false | |
SNAPCRAFT_LOGIN: ${{ secrets.SNAPCRAFT_LOGIN }} | |
run: | | |
sudo snap install snapcraft --classic | |
echo "$SNAPCRAFT_LOGIN" | snapcraft login --with - | |
npm run build -- --publish always -c.publish.provider=github -c.publish.owner=${{ github.repository_owner }} -c.publish.repo=ferdi -c.snap.publish.provider=snapStore -c.snap.publish.repo=ferdi -c.snap.publish.channels=stable | |
snapcraft logout | |
shell: bash | |
build_windows: | |
name: 'windows ${{ github.event.inputs.message }}' | |
needs: check_updates | |
if: ${{ (needs.check_updates.outputs.should_run != 'false') && (github.event_name != 'workflow_dispatch' || (github.event_name == 'workflow_dispatch' && (contains(github.event.inputs.message, '[Windows]') || (!contains(github.event.inputs.message, '[macOS]') && !contains(github.event.inputs.message, '[Linux]') && !contains(github.event.inputs.message, '[Windows]'))))) }} | |
runs-on: windows-latest | |
steps: | |
- name: Set env vars | |
run: | | |
echo "HOME=$USERPROFILE" >> $GITHUB_ENV | |
echo "MANUAL_REBUILD_ON_NIGHTLY=${{ github.event_name == 'workflow_dispatch' && contains(github.event.inputs.message, '[nightly branch]') }}" >> $GITHUB_ENV | |
echo "SKIP_NOTARIZATION=${{ !contains(github.repository_owner, 'getferdi') }}" >> $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@v3 | |
if: ${{ github.event_name == 'schedule' || env.MANUAL_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@v3 | |
if: ${{ github.event_name != 'schedule' && env.MANUAL_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: Use Node.js specified in the '.nvmrc' file | |
uses: actions/setup-node@v3 | |
with: | |
node-version-file: '.nvmrc' | |
- name: Install npm | |
run: npm i -gf npm@8.7.0 | |
- name: Install pnpm | |
uses: pnpm/action-setup@v2.0.1 | |
with: | |
version: 6.32.8 | |
- name: Install node dependencies | |
uses: nick-invision/retry@v2.4.0 | |
with: | |
command: npm i | |
timeout_minutes: 15 | |
max_attempts: 3 | |
retry_on: error | |
- name: Package recipes | |
run: pnpm i && pnpm run package | |
working-directory: ./recipes | |
shell: bash | |
- name: Run linter and tests | |
run: npm run lint && npm run test | |
shell: bash | |
- 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 }} | |
shell: bash | |
env: | |
GH_TOKEN: ${{ secrets.FERDI_PUBLISH_TOKEN }} | |
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 }} | |
WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }} | |
WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }} |