Skip to content
Snippets Groups Projects
.gitlab-ci.yml 6.3 KiB
Newer Older
Mateusz Brawański's avatar
Mateusz Brawański committed
# Database Agent for Masters Thesis project.
#
# Copyright © 2023 Mateusz Brawański <Emzi0767>. All rights reserved.

image: mcr.microsoft.com/dotnet/sdk:7.0

variables:
  NUGET_PACKAGES_DIRECTORY: .nuget-cache
  SOURCE_CODE_PATH: src/*/
  OBJECTS_DIRECTORY: obj
  ARTIFACT_DIRECTORY: artifacts
  PUBLISH_DIRECTORY: publish
  DOCFX_SOURCE_BRANCH_NAME: $CI_COMMIT_BRANCH
  VERSION_SUFFIX: ci
  VERSION_BUILD_NUMBER: $CI_PIPELINE_IID
  VERSION_BUILD_NUMBER_FILE: ".build-no"

cache:
  key: $CI_JOB_STAGE-$CI_COMMIT_REF_SLUG
  paths:
  - $SOURCE_CODE_PATH$OBJECTS_DIRECTORY/project.assets.json
  - $SOURCE_CODE_PATH$OBJECTS_DIRECTORY/*.csproj.nuget.*
  - $NUGET_PACKAGES_DIRECTORY
  policy: pull-push

before_script:
- ([ -z "${CI_COMMIT_TAG:-}" ] && printf %05d "$VERSION_BUILD_NUMBER" > "$VERSION_BUILD_NUMBER_FILE") || echo "Building from tag"
- ([ -f .build/NuGet.config ] && cp .build/NuGet.config .) || echo "No additional NuGet configuration present."
- dotnet restore -v minimal --packages $NUGET_PACKAGES_DIRECTORY

stages:
- lint
- build
- test
- package
- deploy

lint:
  stage: lint
  script:
  - dotnet tool install -g dotnet-format
  - dotnet format --verify-no-changes --verbosity normal --report .
  artifacts:
    name: "${CI_PROJECT_TITLE}_${CI_JOB_NAME}_${CI_BUILD_REF_NAME}"
    paths:
    - "format-report.json"

build:
  stage: build
  dependencies:
  - lint
  needs:
  - job: lint
    artifacts: false
  script:
  - dotnet build --no-restore -v minimal -c Release --version-suffix "$VERSION_SUFFIX" -p:BuildNumber="$(cat "$VERSION_BUILD_NUMBER_FILE")"
  artifacts:
    name: "${CI_PROJECT_TITLE}_${CI_JOB_NAME}_${CI_BUILD_REF_NAME}"
    paths:
    - "**/obj"
    - "**/bin"

test:
  stage: test
  dependencies:
  - build
  needs:
  - build
  script:
  - dotnet test --no-restore --no-build -c Release --collect "XPlat Code Coverage" --test-adapter-path . --logger "junit;LogFilePath=./junit/junit-test-result.xml;MethodFormat=Class;FailureBodyFormat=Verbose"
Mateusz Brawański's avatar
Mateusz Brawański committed
  - apt-get update && apt-get install -y --no-install-recommends bc
  - chmod +x ./extract-coverage.sh
  - ./extract-coverage.sh ./tests/*/TestResults/*
  artifacts:
    paths:
      - tests/*/TestResults/*/coverage.cobertura.xml
      - tests/*/junit/junit-test-result.xml
    reports:
      coverage_report:
        coverage_format: cobertura
        path: tests/*/TestResults/*/coverage.cobertura.xml
      junit:
      - tests/*/junit/junit-test-result.xml
  coverage: /TOTAL_COVERAGE=(\d+.\d+)/

package:
  stage: package
  dependencies:
  - build
  - test
  needs:
  - job: test
    artifacts: false
  - build
  script:
  - dotnet publish src/*/*.csproj -v minimal -c Release -p:PublishTrimmed=true -p:PublishSingleFile=true -p:PublishReadyToRun=true --self-contained true -r win10-x64 --version-suffix "$VERSION_SUFFIX" -p:BuildNumber="$(cat "$VERSION_BUILD_NUMBER_FILE")" -o $PUBLISH_DIRECTORY
Mateusz Brawański's avatar
Mateusz Brawański committed
  artifacts:
    name: "${CI_PROJECT_TITLE}_${CI_JOB_NAME}_${CI_BUILD_REF_NAME}"
    paths:
    - $PUBLISH_DIRECTORY

package-linux:
  stage: package
  dependencies:
  - build
  - test
  needs:
  - job: test
    artifacts: false
  - build
  script:
  - dotnet publish src/*/*.csproj -v minimal -c Release -p:PublishTrimmed=true -p:PublishSingleFile=true -p:PublishReadyToRun=true --self-contained true -r linux-${LINUX_RUNTIME} --version-suffix "$VERSION_SUFFIX" -p:BuildNumber="$(cat "$VERSION_BUILD_NUMBER_FILE")" -o ${PUBLISH_DIRECTORY}-linux-${LINUX_RUNTIME}
  artifacts:
    name: "${CI_PROJECT_TITLE}_${CI_JOB_NAME}_${CI_BUILD_REF_NAME}"
    paths:
    - ${PUBLISH_DIRECTORY}-linux-${LINUX_RUNTIME}
  parallel:
    matrix:
    - LINUX_RUNTIME: 'x64'
    - LINUX_RUNTIME: 'musl-x64'
    - LINUX_RUNTIME: 'arm64'
    - LINUX_RUNTIME: 'musl-arm64'

Mateusz Brawański's avatar
Mateusz Brawański committed
deploy-gitlab:
  stage: deploy
  dependencies:
  - package
  needs:
  - package
  script:
  - apt-get update && apt-get install -y --no-install-recommends zip curl
  - export workdir=$(pwd)
  # Windows
  - pushd ${PUBLISH_DIRECTORY}
  - zip -9v "${workdir}/${CI_PROJECT_NAME}-win64.zip" *
  - popd
  # Push
  - export PKG_VERSION=$(grep '<VersionPrefix>' src/*/*.csproj | sed -r 's/.*>(.*)<.*/\1/g')
  - 'curl -H "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file ${CI_PROJECT_NAME}-win64.zip "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${PKG_VERSION}/${CI_PROJECT_NAME}-win64.zip"'
  only:
  - tags
  artifacts:
    name: "${CI_PROJECT_TITLE}_${CI_JOB_NAME}_${CI_BUILD_REF_NAME}"
    paths:
    - ${CI_PROJECT_NAME}-win64.zip
    - ${CI_PROJECT_NAME}-linux-x64.tar.gz
    - ${CI_PROJECT_NAME}-linux-musl-x64.tar.gz

deploy-gitlab-linux:
  stage: deploy
  dependencies:
  - package-linux
  needs:
  - package-linux
  script:
  - apt-get update && apt-get install -y --no-install-recommends zip curl
  - export workdir=$(pwd)
  # Linux RUNTIME
  - pushd ${PUBLISH_DIRECTORY}-linux-${LINUX_RUNTIME}
  - tar cvzf "${workdir}/${CI_PROJECT_NAME}-linux-${LINUX_RUNTIME}.tar.gz" *
Mateusz Brawański's avatar
Mateusz Brawański committed
  - popd
Mateusz Brawański's avatar
Mateusz Brawański committed
  - export PKG_VERSION=$(grep '<VersionPrefix>' src/*/*.csproj | sed -r 's/.*>(.*)<.*/\1/g')
  - 'curl -H "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file ${CI_PROJECT_NAME}-linux-${LINUX_RUNTIME}.tar.gz "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${PKG_VERSION}/${CI_PROJECT_NAME}-linux-${LINUX_RUNTIME}.tar.gz"'
Mateusz Brawański's avatar
Mateusz Brawański committed
  only:
  - tags
  artifacts:
    name: "${CI_PROJECT_TITLE}_${CI_JOB_NAME}_${CI_BUILD_REF_NAME}"
    paths:
    - ${CI_PROJECT_NAME}-linux-${LINUX_RUNTIME}.tar.gz
  parallel:
    matrix:
    - LINUX_RUNTIME: 'x64'
    - LINUX_RUNTIME: 'musl-x64'
    - LINUX_RUNTIME: 'arm64'
    - LINUX_RUNTIME: 'musl-arm64'

deploy-docker:
  tags:
  - docker    
  stage: deploy
  image: docker:24.0.5-alpine3.18
  dependencies:
  - test
  needs:
  - job: test
    artifacts: false
Mateusz Brawański's avatar
Mateusz Brawański committed
  variables:
    DOCKER_HOST: tcp://docker:2375
    DOCKER_TLS_CERTDIR: ""  
  services:
  - docker:24.0.5-dind-alpine3.18
Mateusz Brawański's avatar
Mateusz Brawański committed
  before_script: []
  script:
Mateusz Brawański's avatar
Mateusz Brawański committed
  - export OUTPUT_IMAGE_TAG=$(printf "%s" "${CI_REGISTRY}/${CI_PROJECT_PATH}/${CI_PROJECT_NAME}" | tr '[:upper:]' '[:lower:]')
  - export PKG_VERSION=$(grep '<VersionPrefix>' src/*/*.csproj | sed -r 's/.*>(.*)<.*/\1/g')
  - docker login -u ${CI_REGISTRY_USER} -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
  - docker buildx create --use
  - docker buildx build -f $(find src -type f -name 'Dockerfile' | head -n1) --no-cache --provenance false --tag "${OUTPUT_IMAGE_TAG}:${PKG_VERSION}" --platform=linux/amd64 --pull --push .
  only:
  - tags