Skip to content

Commit

Permalink
Add new github workflows and run application with custom user
Browse files Browse the repository at this point in the history
  • Loading branch information
mmoila committed Dec 3, 2024
1 parent 317cdbe commit 0ac5fe3
Show file tree
Hide file tree
Showing 11 changed files with 120 additions and 51 deletions.
44 changes: 44 additions & 0 deletions .github/release-drafter.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name-template: 'v$RESOLVED_VERSION'
tag-template: 'v$RESOLVED_VERSION'
categories:
- title: 'Features'
label: 'feature'
- title: 'Bug fixes'
label: 'fix'
- title: 'Infra changes'
label: 'infra'
- title: 'Maintenance'
label: 'chore'
autolabeler:
- label: 'feature'
branch:
- '/feature\/.+/'
- label: 'fix'
branch:
- '/fix\/.+/'
- label: 'infra'
branch:
- '/infra\/.+/'
- label: 'chore'
branch:
- '/chore\/.+/'
- '/dependabot\/.+/'
version-resolver:
major:
labels:
- 'major'
minor:
labels:
- 'minor'
- 'feature'
patch:
labels:
- 'patch'
- 'fix'
- 'chore'
- 'infra'
default: patch
template: |
## Changes
$CHANGES
17 changes: 10 additions & 7 deletions .github/workflows/production.yml → .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
name: Production deployment
name: Application deployment to test and production

on:
push:
# On push to main branch deploy to test
branches: [main]
workflow_dispatch:
release:
# On release deploy to production
types: [released]

env:
IMAGE_NAME: ${{ secrets.ACR_REGISTRY_ADDRESS }}/vuorovaikutusalusta
IMAGE_NAME_TEST: ${{ secrets.ACR_REGISTRY_ADDRESS }}/vuorovaikutusalusta-test
IMAGE_NAME_PROD: ${{ secrets.ACR_REGISTRY_ADDRESS }}/vuorovaikutusalusta

jobs:
deploy:
name: Deploy to production
name: Deploy to test or production
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to registry
Expand All @@ -28,6 +31,6 @@ jobs:
uses: docker/build-push-action@v5
with:
push: true
cache-from: type=registry,ref=${{ env.IMAGE_NAME }}:latest
cache-from: type=registry,ref=${{ github.event_name == 'release' && env.IMAGE_NAME_PROD || env.IMAGE_NAME_TEST }}:latest
cache-to: type=inline
tags: ${{ env.IMAGE_NAME }}:latest
tags: ${{ github.event_name == 'release' && env.IMAGE_NAME_PROD || env.IMAGE_NAME_TEST }}:latest
4 changes: 2 additions & 2 deletions .github/workflows/pr-test.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
##
# Runs builds on GitHub pull requests to test that they should be working fine.
# Runs builds and e2e tests
##
name: Test builds
on:
Expand Down Expand Up @@ -43,7 +43,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18'
node-version: '20'
cache: 'npm'
cache-dependency-path: ./e2e/package-lock.json
- run: npm i
Expand Down
26 changes: 26 additions & 0 deletions .github/workflows/release-draft.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Release draft

on:
# Update release draft on pushes to the main branch
push:
branches: [main]
# Run on PRs only for autolabeler
pull_request:
types: [opened, reopened, synchronize]

permissions:
contents: read

jobs:
update-draft:
name: Update draft
permissions:
contents: write
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v6
with:
commitish: main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
33 changes: 0 additions & 33 deletions .github/workflows/test.yml

This file was deleted.

11 changes: 9 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,21 @@ RUN apk update && apk add \
ca-certificates \
ttf-freefont

# Add non-root user with explicit UID and GID
RUN addgroup --system --gid 1001 appUser && \
adduser --system --uid 1001 appGroup

WORKDIR ${APPDIR}

COPY --from=server-build ${APPDIR}/server ./
COPY --from=client-build ${APPDIR}/client/dist ./static/
COPY --chown=appUser:appGroup --from=server-build ${APPDIR}/server ./
COPY --chown=appUser:appGroup --from=client-build ${APPDIR}/client/dist ./static/

ENV TZ=Europe/Helsinki

# Define Chromium path, as it was not installed in the previous phase
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser

# Don't run the app as root
USER appUser

CMD npm start
18 changes: 14 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Vuorovaikutusalusta
# Kartalla

## Ohjelmiston taustaa

Expand All @@ -17,7 +17,7 @@ Kuva 1: ohjelmiston arkkitehtuuri ajoympäristössään

- Käynnistä Docker -ekosysteemi projektin juuresssa komennoilla `docker-compose build && docker-compose up -d`. Esiehto: lokaalisti tulee olla asennettuna [Docker -konttien hallintajärjestelmä](https://www.docker.com/products/docker-desktop)).
- Luo ympäristömuuttujille tiedosto polkuun `/server/.env` ja täytä se tarvittavilla muuttujilla ohjeen `/server/.template.env` mukaan.
- Toteuta uudet toiminnallisuudet omaan Git -haaraansa, esim. `feature/new-feature-name`. Valmistuessaan yhdistä tämä haara `develop` -haaraan, josta sovellusta ajetaan testiympäristössä. Kun on aika tehdä tuotantopäivitys, vie `develop` -haaran muutokset `master` -haaraan, josta sovellusta ajetaan tuotantoympäristössä.
- Toteuta uudet toiminnallisuudet omaan Git -haaraansa, esim. `feature/new-feature-name`. Valmistuessaan yhdistä tämä haara `develop` -haaraan, josta sovellusta ajetaan testiympäristössä. Kun on aika tehdä tuotantopäivitys, vie `develop` -haaran muutokset `main` -haaraan, josta sovellusta ajetaan tuotantoympäristössä.

<br>

Expand All @@ -29,6 +29,16 @@ Serveri ja tietokanta juttelevat keskenään yhteydellä, joka on määritetty y

Lokaalissa kehityksessä React käyttöliittymä ohjaa rajapintapyynnöt automaattisesti omaan porttiinsa. Toisin sanoen, mikäli käyttöliittymästä (portti 8080) tehdään HTTP pyyntö serverille (portti 3000), tätä ei tarvitse erikseen määrittää, vaan käyttöliittymä osaa ohjata liikenteen suoraan omasta portistaan serverin porttiin (8080 -> 3000).

Sovelluskehitys noudattaa perinteistä [Gitflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow#:~:text=The%20overall%20flow%20of%20Gitflow,branch%20is%20created%20from%20main&text=When%20a%20feature%20is%20complete%20it%20is%20merged%20into%20the,branch%20is%20created%20from%20main) -mallia, jossa uudet toiminnallisuudet toteutetaan omaan Git -haaraansa, esim. `feature/new-feature-name`. Valmistuessaan tämä haara yhdistetään `develop` -haaraan. Kun `develop` -haaraan kohdistuu muutoksia Githubissa, automaattinen integraatio käynnistyy, joka julkistaa haaraan viedyn uuden lähdekoodin Azureen testiympäristöön. Kun tulee aika tehdä tuotantopäivitys, yhdistetään `develop` -haaran muutokset `master` -haaraan. Githubissa `master` -haaran muutokset käynnistävät automaattisen integraation, joka julkistaa lähdekoodin Azuren DevOps -palveluun. Täältä lähdekoodi taas julkistetaan automaattisesti Azureen tuotantoympäristöön.
Sovelluskehitys noudattaa perinteistä [Gitflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow#:~:text=The%20overall%20flow%20of%20Gitflow,branch%20is%20created%20from%20main&text=When%20a%20feature%20is%20complete%20it%20is%20merged%20into%20the,branch%20is%20created%20from%20main) -mallia, jossa uudet toiminnallisuudet toteutetaan omaan Git -haaraansa, esim. `feature/new-feature-name`. Valmistuessaan tämä haara yhdistetään `main` -haaraan. Kun `main` -haaraan kohdistuu muutoksia Githubissa, automaattinen integraatio käynnistyy, joka julkistaa haaraan viedyn uuden lähdekoodin Azureen testiympäristöön. `main`-haaraan yhdistäminen täydentää automaattisesti `release`-luonnoksen, jonka julkaisun yhteydessä `main` haaran sisältö viedään automaattisen integraation kautta Azuren tuotantoympäristöön.

## TODO
## E2E-testaus

E2E testit ajetaan automaattisesti jokaisen pull requestin yhteydessä.

E2E-testiympäristö on toteutettu vastaavalla tavalla, kuin paikallinen kehitysympäristö sillä erolla, että E2E-testiympäristö käynnistetään `e2e`-kansiosta käsin. Testit ajetaan `Playwright`-kirjastoa käyttäen. Tietokannan sisältö tallennetaan erilliseen `db-data`-volumeen, joten E2E-testien ajaminen ei vaikuta kehitystietokannan sisältöön.

Testiympäristön käynnistämisen jälkeen seuraavat komennot ovat käytettävissä `./e2e`-polusta:

- `npm run codegen`: Avaa selainnäkymän, josta käsin pystyy luomaan testikomentoja interaktiivisesti
- `npm run test-ui`: Ajaa testit selainnäkymässä
- `npm test`: Ajaa testit headless-tilassa näyttäen vain tulosteen komentorivillä
10 changes: 9 additions & 1 deletion e2e/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ services:
build:
context: ../server
dockerfile: Dockerfile.develop
healthcheck:
interval: 15s
timeout: 30s
retries: 15
test: curl --fail http://localhost:3000/api/health || exit 1
volumes:
# Include .git for detecting changes in the workspace (e.g. only run tests on changed files)
- ../.git:/app/.git:cached
Expand All @@ -35,6 +40,9 @@ services:
DEFAULT_CTYPE: 'fi_FI.UTF8'
TZ: Europe/Helsinki
volumes:
- .db-data:/var/lib/postgresql:delegated
- db-data:/var/lib/postgresql:delegated
ports:
- '127.0.0.1:5432:5432'

volumes:
db-data:
4 changes: 3 additions & 1 deletion e2e/pages/surveyEditPage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,9 @@ export class SurveyEditPage {
} else {
await this._page.goto('http://localhost:8080/admin');
await this._page.getByRole('button', { name: 'Uusi kysely' }).click();
await this._page.waitForURL('http://localhost:8080/admin/kyselyt/**');
await this._page.waitForURL(
'http://localhost:8080/admin/kyselyt/*/perustiedot',
);
const urlParts = this._page.url().split('/');
const lastElement = urlParts[urlParts.length - 1];
this._surveyId = lastElement;
Expand Down
1 change: 1 addition & 0 deletions e2e/playwright.config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { PlaywrightTestConfig, devices } from '@playwright/test';

const config: PlaywrightTestConfig = {
retries: 1,
projects: [
{
name: 'Chrome',
Expand Down
3 changes: 2 additions & 1 deletion server/Dockerfile.develop
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ RUN apk update && apk add \
freetype \
harfbuzz \
ca-certificates \
ttf-freefont
ttf-freefont \
curl

WORKDIR /app/server
COPY package*.json ./
Expand Down

0 comments on commit 0ac5fe3

Please sign in to comment.