Merge remote-tracking branch 'origin/next' into next #42
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: lint, test & push Docker image | |
on: | |
push: | |
branches: | |
- '*' | |
tags: | |
- '*' | |
pull_request: | |
branches: | |
- '*' | |
env: | |
# We tell Playwright not to download browser binaries because we use microsoft/playwright-github-action. | |
# https://github.com/microsoft/playwright/blob/v1.16.2/installation-tests/installation-tests.sh#L200-L216 | |
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' | |
REGISTRY: ghcr.io | |
IMAGE: klnavi-digitransit-ui | |
jobs: | |
# install dependencies, build shared components, cache both for subsequent jobs | |
install: | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
node-version: [16.x] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
# https://github.com/actions/cache/blob/8f1e2e02865c42348f9baddbbaafb1841dce610a/examples.md#node---yarn-2 | |
- name: Cache node_modules | |
id: cache-node-modules | |
uses: actions/cache@v3 | |
with: | |
path: '**/node_modules' | |
key: ${{ runner.os }}-node-modules-${{ hashFiles('**/yarn.lock') }} | |
- name: Cache .yarn/cache | |
if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' }} | |
uses: actions/cache@v3 | |
with: | |
path: '.yarn/cache' | |
key: yarn-cache-${{ github.ref_name }} | |
restore-keys: yarn-cache-v3 | |
- name: Install dependencies | |
if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' }} | |
run: yarn install --immutable --inline-builds | |
- name: cache shared components | |
id: cache-shared-components | |
uses: actions/cache@v3 | |
with: | |
path: 'digitransit-*' | |
key: ${{ runner.os }}-shared-components-v2-${{ hashFiles('digitransit-*') }} | |
- name: build shared components | |
if: ${{ steps.cache-shared-components.outputs.cache-hit != 'true' }} | |
run: yarn run build-workspaces | |
lint: | |
needs: install | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
node-version: [16.x] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: "Set time zone to Europe/Helsinki" | |
uses: zcong1993/setup-timezone@master | |
with: | |
timezone: "Europe/Helsinki" | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
# https://github.com/actions/cache/blob/8f1e2e02865c42348f9baddbbaafb1841dce610a/examples.md#node---yarn-2 | |
- name: Cache node_modules | |
id: cache-node-modules | |
uses: actions/cache@v3 | |
with: | |
path: '**/node_modules' | |
key: ${{ runner.os }}-node-modules-${{ hashFiles('**/yarn.lock') }} | |
- name: Cache .yarn/cache | |
if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' }} | |
uses: actions/cache@v3 | |
with: | |
path: '.yarn/cache' | |
key: yarn-v3-cache-${{ github.ref_name }} | |
restore-keys: yarn-v3-cache-v3 | |
- name: Install dependencies | |
if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' }} | |
run: yarn install --immutable | |
- name: cache shared components | |
id: cache-shared-components | |
uses: actions/cache@v3 | |
with: | |
path: 'digitransit-*' | |
key: ${{ runner.os }}-shared-components-${{ hashFiles('digitransit-*') }} | |
- name: Build shared components | |
if: ${{ steps.cache-shared-components.outputs.cache-hit != 'true' }} | |
run: yarn run build-workspaces | |
- name: Run linters | |
run: yarn lint | |
- name: lint SVG sprites using xmllint | |
run: | | |
sudo apt update | |
sudo apt install -y libxml2-utils --fix-missing | |
xmllint --nonet --noout static/assets/svg-sprite.*.svg | |
build: | |
needs: install | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
node-version: [16.x] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
# https://github.com/actions/cache/blob/8f1e2e02865c42348f9baddbbaafb1841dce610a/examples.md#node---yarn-2 | |
- name: Cache node_modules | |
id: cache-node-modules | |
uses: actions/cache@v3 | |
with: | |
path: '**/node_modules' | |
key: ${{ runner.os }}-node-modules-${{ hashFiles('**/yarn.lock') }} | |
- name: Cache .yarn/cache | |
if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' }} | |
uses: actions/cache@v3 | |
with: | |
path: '.yarn/cache' | |
key: yarn-cache-${{ github.ref_name }} | |
restore-keys: yarn-cache-v3 | |
- name: Install dependencies | |
if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' }} | |
run: yarn --immutable | |
- name: cache shared components | |
id: cache-shared-components | |
uses: actions/cache@v3 | |
with: | |
path: 'digitransit-*' | |
key: ${{ runner.os }}-shared-components-v2-${{ hashFiles('digitransit-*') }} | |
- name: build shared components | |
if: ${{ steps.cache-shared-components.outputs.cache-hit != 'true' }} | |
run: yarn run build-workspaces | |
- name: cache built Relay queries & UI | |
id: cache-ui-build | |
uses: actions/cache@v3 | |
with: | |
path: | | |
./_static | |
./manifest.json | |
./stats.json | |
./__generated__ | |
**/__generated__ | |
key: relay-ui-${{ github.sha }} | |
- name: build Relay queries & UI | |
if: ${{ steps.cache-ui-build.outputs.cache-hit != 'true' }} | |
run: | | |
yarn build | |
unit-test: | |
needs: install | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
node-version: [16.x] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: "Set time zone to Europe/Helsinki" | |
uses: zcong1993/setup-timezone@master | |
with: | |
timezone: "Europe/Helsinki" | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
# https://github.com/actions/cache/blob/8f1e2e02865c42348f9baddbbaafb1841dce610a/examples.md#node---yarn-2 | |
- name: Cache node_modules | |
id: cache-node-modules | |
uses: actions/cache@v3 | |
with: | |
path: '**/node_modules' | |
key: ${{ runner.os }}-node-modules-${{ hashFiles('**/yarn.lock') }} | |
- name: Cache .yarn/cache | |
if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' }} | |
uses: actions/cache@v3 | |
with: | |
path: '.yarn/cache' | |
key: yarn-v3-cache-${{ github.ref_name }} | |
restore-keys: yarn-v3-cache-v3 | |
- name: Install dependencies | |
if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' }} | |
run: yarn install --immutable | |
- name: cache shared components | |
id: cache-shared-components | |
uses: actions/cache@v3 | |
with: | |
path: 'digitransit-*' | |
key: ${{ runner.os }}-shared-components-${{ hashFiles('digitransit-*') }} | |
- name: Build shared components | |
if: ${{ steps.cache-shared-components.outputs.cache-hit != 'true' }} | |
run: yarn run build-workspaces | |
- name: cache built Relay queries | |
id: cache-relay | |
uses: actions/cache@v3 | |
with: | |
path: | | |
./__generated__ | |
**/__generated__ | |
key: ${{ runner.os }}-relay-${{ github.sha }} | |
- name: build Relay queries | |
if: ${{ steps.cache-relay.outputs.cache-hit != 'true' }} | |
run: | | |
yarn run relay | |
- name: Run unit tests | |
run: yarn run test-coverage | |
- name: Upload coverage to Codecov | |
uses: codecov/codecov-action@v3 | |
docker-push: | |
# Because we use one full CI run for a deployment of *each* instance (i.e. n deployments for n instances), | |
# in order to deploy reasonably quickly, we assume the the Docker build caches intermediate layers across | |
# CI runs. | |
# The docker/build-push-action's GitHub caching option (cache-from, cache-to, see https://github.com/docker/build-push-action/blob/v4/README.md#customizing) | |
# uses BuildKit's GitHub caching feature (https://github.com/moby/buildkit/blob/c81deef18855d952247915d3418371f405719a23/README.md#github-actions-cache-experimental), | |
# which follows the general GitHub Actions caching restrictions (https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#restrictions-for-accessing-a-cache). | |
# The means that Git tag CI runs *cannot* access each other's cached Docker layers, but only the default | |
# branch's one. This is why, on the default branch (`next`), we *do* build & cache the Docker layers | |
# but don't push and don't deploy the resulting image. | |
# todo: as of 2023-04-27, this fails because of https://github.com/moby/buildkit/issues/2887 | |
if: github.ref_name == 'next' || (github.ref_type == 'tag' && startsWith(github.ref_name, 'release_')) | |
needs: | |
- lint | |
- unit-test | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Set time zone to Europe/Helsinki | |
uses: zcong1993/setup-timezone@master | |
with: | |
timezone: "Europe/Helsinki" | |
- name: Create buildInfo.js file | |
run: | | |
echo -e "export const COMMIT_ID = \"${GITHUB_SHA}\";\nexport const BUILD_TIME = \"$(date -Iminutes -u)\";" >app/buildInfo.js | |
- name: Configure Docker Buildx | |
uses: docker/setup-buildx-action@v2 | |
- name: log into GitHub Container Registry | |
uses: docker/login-action@v2 | |
with: | |
registry: ${{ env.REGISTRY }} | |
username: ${{ github.actor }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: compute Docker image metadata | |
id: docker-meta | |
run: | | |
set -e -x -u -o pipefail # fail on errors | |
echo "image=${{ env.REGISTRY }}/${{ github.repository }}" >>$GITHUB_OUTPUT | |
echo "permanent-tag=$(date +"%Y-%m-%dT%H.%M.%S")-${GITHUB_SHA:0:7}" >>$GITHUB_OUTPUT | |
echo "release-tag=${{ github.ref_name }}" >>$GITHUB_OUTPUT | |
- name: build and push Docker image | |
uses: docker/build-push-action@v4 | |
with: | |
context: . | |
tags: | | |
${{ steps.docker-meta.outputs.image }}:latest | |
${{ steps.docker-meta.outputs.image }}:${{ steps.docker-meta.outputs.permanent-tag }} | |
${{ steps.docker-meta.outputs.image }}:${{ steps.docker-meta.outputs.release-tag }} | |
# https://github.com/docker/build-push-action/blob/9472e9021074a3cb3279ba431598b8836d40433f/docs/advanced/cache.md#github-cache | |
# https://github.com/moby/buildkit#registry-push-image-and-cache-separately | |
cache-from: type=gha | |
cache-to: type=gha,mode=max,oci-mediatypes=true,compression=zstd | |
push: true |