Rapporteket som containerapplikasjon

Kort introduksjon

Siden 2025 har Rapporteket blitt levert som frittstående containerapplikasjoner driftet i et Kubernetes-klyngemiljø. Dette dokumentet foreslår metoder som skal bidra til en smidig og robust prosess fra utvikling til produksjonssetting gjennom hele applikasjonens livssyklus.

Containerinnhold

I denne løsningen representeres hvert register som en selvstendig containerapplikasjon i Rapporteket, det vil si at utrulling baseres på registerspesifikke containerbilder.

Samtidig deler alle registre i Rapporteket et felles sett med funksjoner, som systemmiljø og underliggende programvare. Disse etableres i et grunnleggende containerbilde som alle registerspesifikke containerbilder bygges på. Begge typer containerbilder beskrives nedenfor.

Grunnleggende containerbilde

Det finnes to grunnleggende image, base-r og base-r-alpine-latex. Ett er basert på Ubuntu Linux og ett er basert på Alpine Linux. Begge disse inneholder felles systembiblioteker, den gjeldende stabile R-versjonen (R-release) og et sett med felles R-pakker.

Utgangspunktet for Ubuntu-bildet er rocker/r-ver, som følger utviklingen av Ubuntu LTS. Utgangspunktet for Alpine-bildet er rhub/r-minimal. Begge følger utviklingen av R-release. Det vil si at versjonsnummeret til bildet tilsvarer R-versjonen.

Applikasjonscontainerbilde

Registerenes R Shiny-applikasjoner legges oppå ett av de grunnleggende containerbildene (se over). Kildekoden for hver registerapplikasjon forvaltes i Rapporteket-organisasjonen på GitHub, hvor bygging av disse bildene ligger. En typisk Dockerfile ser slik ut:

FROM rapporteket/base-r:main

WORKDIR /app/R

RUN --mount=type=secret,id=github_pat,env=GITHUB_PAT \
    --mount=type=bind,source=.,target=/app/R/pkg \
    R -e "remotes::install_local(path = './pkg')"

EXPOSE 3838

RUN adduser --uid 1000 --disabled-password rapporteket && \
    chown -R 1000 /app/R && \
    chmod -R 755 /app/R
USER 1000

CMD ["R", "-e", "options(shiny.port = 3838, shiny.host = \"0.0.0.0\"); packageName::run_app()"]

Pipeline for kontinuerlig integrasjon og leveranse (CI/CD)

For å sikre at endringer i applikasjonene i Rapporteket kan leveres på en rask og pålitelig måte, benyttes definerte arbeidsflyter.

CI/CD-verktøy og metoder

Siden alle kodearkiver forvaltes på GitHub, benyttes GitHub Actions til å håndheve retningslinjer og kjøre CI/CD-oppgaver. Disse oppgavene utføres både etter faste tidsplaner og som respons på foreslåtte kodeendringer.

Utrulling (Deployment)

I første trinn merkes den aktuelle applikasjonskoden med en utgivelsesversjon (release) fra main-grenen, og et nytt bilde bygges og distribueres til NHN automatisk. Denne applikasjonen legges i et kvalitetssikringsmiljø (QA) for funksjonell testing. Etter vellykket testing distribueres bildet til produksjonsmiljøet. Prosessen er ytterligere beskrevet i kapitlet Hvordan publisere ny versjon av en Rapporteket-applikasjon.

Sårbarhetsskanning

Overvåking av containerbilder utføres med Trivy. Grunnbildet overvåkes gjennom ukentlige skanninger for å avdekke nye trusler. Endringer i den underliggende koden skannes også som en del av alle pull requests for å hindre at nye sårbarheter introduseres i hovedprosjektet.

For tiden aksepteres sårbarheter med lav, moderat eller høy alvorlighetsgrad, mens sårbarheter med kritisk alvorlighetsgrad ikke aksepteres.