Skip to content

Add feedback page

Add feedback page #39

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