WASPC-CI #2334
This file contains 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
name: WASPC-CI | |
on: | |
push: | |
paths: | |
- 'waspc/**' | |
branches: | |
- main | |
- release | |
pull_request: | |
paths: | |
- 'waspc/**' | |
create: { tags: [v*] } | |
schedule: | |
# Additionally run once per week (At 00:00 on Sunday) to avoid loosing cache | |
# (GH deletes it after 7 days of not using it). | |
- cron: '0 0 * * 0' | |
env: | |
WASP_TELEMETRY_DISABLE: 1 | |
defaults: | |
run: | |
shell: bash | |
working-directory: waspc | |
jobs: | |
cancel: | |
name: Cancel redundant actions already in progress | |
runs-on: ubuntu-latest | |
steps: | |
- name: Cancel actions in progress of same workflow and same branch | |
uses: styfle/[email protected] | |
with: | |
access_token: ${{ github.token }} | |
build: | |
name: Build Wasp | |
runs-on: ${{ matrix.os }} | |
strategy: | |
matrix: | |
os: | |
# Using Ubuntu 20.04 due to recent GLIBC_2.34 version mismatch errors for | |
# users and other services. The strategy here is to pick a slightly older LTS | |
# version of Ubuntu to build on so glibc is not too new. glibc has great backward | |
# compatibility though, so older builds will run on new OSs (but not vice versa). | |
# We can return to `ubuntu-latest` when enough time has elapsed. | |
# Still looking into musl static binaries. | |
# Ref: https://github.com/wasp-lang/wasp/issues/650 | |
- ubuntu-20.04 | |
- macos-latest | |
- windows-latest | |
node-version: | |
- 'latest' | |
ghc: | |
- '8.10.7' | |
cabal: | |
- '3.6.2.0' | |
# In addition to the default matrix, we also want to run the build job for | |
# additional Node.js versions, to make sure that Wasp works with them. | |
# To reduce the number of jobs, we only test the Node.js versions on | |
# Ubuntu 20.04. | |
include: | |
- os: ubuntu-20.04 | |
node-version: 18 | |
ghc: '8.10.7' | |
cabal: '3.6.2.0' | |
- os: ubuntu-20.04 | |
node-version: 20 | |
ghc: '8.10.7' | |
cabal: '3.6.2.0' | |
steps: | |
- name: Configure git | |
working-directory: ~ | |
# For waspc parser tests, we need to make sure git doesn't convert line | |
# endings to CRLF during checkout on Windows because that would cause | |
# the test cases to fail. | |
run: | | |
git config --global core.autocrlf input | |
git config --global core.eol lf | |
- uses: 'actions/checkout@v3' | |
with: | |
# Workaround for a Github Checkout action bug | |
# https://github.com/actions/checkout/issues/1359#issuecomment-1567902034 | |
ref: ${{ github.event.pull_request.head.sha }} | |
# TODO: This is a temporary workaround for the failing GHCup installation on Ubuntu 20.04. | |
# The fix will be propagated in a few days, so we can remove this workaround then. | |
# https://github.com/actions/runner-images/issues/7061 | |
- name: Workaround runner image issue | |
if: matrix.os == 'ubuntu-20.04' | |
run: sudo chown -R $USER /usr/local/.ghcup | |
- name: Set up Haskell | |
id: setup-haskell-cabal | |
uses: haskell/actions/setup@v2 | |
with: | |
ghc-version: ${{ matrix.ghc }} | |
cabal-version: ${{ matrix.cabal }} | |
- name: Verify Haskell setup | |
run: | | |
ghc --version | |
cabal --version | |
- name: Set up Node | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: Cache | |
uses: actions/cache@v3 | |
with: | |
path: ${{ steps.setup-haskell-cabal.outputs.cabal-store }} | |
# TODO: Right now, actions/cache updates cache only if cache was not fe | |
# This is not ideal for us, because we would ideally update cache even if it | |
# was fetched, because we want to cache any newly installed packages. | |
# This was working normally on Travis and Appveyor. | |
# There is an issue for this, and for now we are using proposed "fix" from it, | |
# https://github.com/actions/cache/issues/342#issuecomment-673371329, | |
# which mitigates the problem by creating new cache for each job and then using | |
# the feature of restore-keys which makes sure that next cache picked is the | |
# latest one. However, this keeps creating new cache each time which is not | |
# ideal because caches keep getting evicted, so for example if Win job | |
# fails multiple times while others don't, its cache will likely get evicted, | |
# making it even slower to test and fix (uffff). | |
# When they fix this, we should remove ${{ github.run_id }} from the end of the key. | |
key: wasp-build-${{ matrix.os }}-${{ matrix.ghc }}-${{ hashFiles('waspc/waspc.cabal') }}-${{ hashFiles('waspc/cabal.project') }}-${{ github.run_id }} | |
restore-keys: wasp-build-${{ matrix.os }}-${{ matrix.ghc }}- | |
- name: Check Haskell code formatting | |
if: matrix.os == 'ubuntu-20.04' | |
run: ./run ormolu:check | |
- name: packages/ts-inspect - Run tests | |
if: matrix.os == 'ubuntu-20.04' || matrix.os == 'macos-latest' | |
run: | | |
cd packages/ts-inspect | |
npm ci | |
npm test | |
- name: Compile TS packages and move it into the Cabal data dir | |
if: matrix.os == 'ubuntu-20.04' || matrix.os == 'macos-latest' | |
run: ./tools/install_packages_to_data_dir.sh | |
- name: Build external dependencies | |
run: cabal build --enable-tests --enable-benchmarks --only-dependencies | |
- name: Build wasp code | |
run: cabal build all | |
- name: On MacOS, skip e2e tests with Docker since it is not installed | |
if: matrix.os == 'macos-latest' | |
run: export WASP_E2E_TESTS_SKIP_DOCKER=1 | |
- name: Run unit tests | |
run: cabal test cli-test waspc-test waspls-test | |
- name: Ensure examples/todoApp compiles and builds | |
if: matrix.os == 'ubuntu-20.04' || matrix.os == 'macos-latest' | |
run: ./examples/todoApp/ensure_app_compiles_and_builds.sh | |
- name: Headless - Cache Node Modules | |
id: headless-cache-node-modules | |
uses: actions/cache@v3 | |
if: matrix.os == 'ubuntu-20.04' | |
with: | |
path: ~/.npm | |
key: node-modules-${{ hashFiles('./waspc/headless-test/package-lock.json') }}-${{ matrix.os }}-${{ matrix.node-version }} | |
- name: Headless - Install Dependencies | |
id: headless-install-dependencies | |
if: matrix.os == 'ubuntu-20.04' | |
run: | | |
cd headless-test | |
npm ci | |
- name: Headless - Store Playwright's Version | |
id: headless-store-playwright-version | |
if: matrix.os == 'ubuntu-20.04' | |
run: | | |
cd headless-test | |
PLAYWRIGHT_VERSION=$(npm ls @playwright/test | grep @playwright | sed 's/.*@//') | |
echo "Playwright's Version: $PLAYWRIGHT_VERSION" | |
echo "PLAYWRIGHT_VERSION=$PLAYWRIGHT_VERSION" >> $GITHUB_ENV | |
- name: Headless - Cache Playwright Browsers for Playwright's Version | |
id: headless-cache-playwright-browsers | |
if: matrix.os == 'ubuntu-20.04' | |
uses: actions/cache@v3 | |
with: | |
path: ~/.cache/ms-playwright | |
key: playwright-browsers-${{ env.PLAYWRIGHT_VERSION }} | |
- name: Headless - Setup Playwright | |
id: headless-setup-playwright | |
if: steps.cache-playwright-browsers.outputs.cache-hit != 'true' && matrix.os == 'ubuntu-20.04' | |
run: | | |
cd headless-test | |
npx playwright install --with-deps | |
- name: Headless - Run Playwright Tests | |
id: headless-run-playwright-tests | |
if: matrix.os == 'ubuntu-20.04' | |
run: | | |
cd headless-test | |
npm ci | |
# Runs the tests with the debug flag so that we can see Wasp output | |
DEBUG=pw:webserver npx playwright test | |
- name: Run e2e tests | |
run: cabal test e2e-test | |
- name: Create binary package (Unix) | |
if: startsWith(github.ref, 'refs/tags/v') && (matrix.os == 'ubuntu-20.04' || matrix.os == 'macos-latest') && matrix.node-version == 'latest' | |
run: | | |
OS_NAME=`case "${{ runner.os }}" in Linux) echo "linux";; macOS) echo "macos";; *) exit 1;; esac` | |
mkdir artifacts | |
./tools/make_binary_package.sh "artifacts/wasp-$OS_NAME-x86_64.tar.gz" | |
- name: Create Github release | |
uses: ncipollo/release-action@v1 | |
if: startsWith(github.ref, 'refs/tags/v') && (matrix.os == 'ubuntu-20.04' || matrix.os == 'macos-latest') && matrix.node-version == 'latest' | |
with: | |
draft: true | |
allowUpdates: true | |
artifacts: 'waspc/artifacts/*' | |
artifactErrorsFailBuild: true | |
replacesArtifacts: true | |
token: ${{ secrets.GITHUB_TOKEN }} |