sysreptor/.gitlab-ci.yml

249 lines
9.3 KiB
YAML

stages:
- sync
- build-test
- test
- build-release
- release
- docs
image: docker:23.0.1
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
CI_REGISTRY_IMAGE: registry.internal.syslifters.com/reportcreator/reportcreator
services:
- docker:23.0.1-dind
.depends_docker:
before_script:
- i=0; while [ "$i" -lt 12 ]; do docker info && break; sleep 5; i=$(( i + 1 )) ; done
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD registry.internal.syslifters.com
- export DOCKER_BUILDKIT=1
build-test-api:
stage: build-test
extends: .depends_docker
script:
# Build container
- docker build --build-arg BUILDKIT_INLINE_CACHE=1 --target=api-test -t $CI_REGISTRY_IMAGE/api-test:$CI_COMMIT_SHORT_SHA .
- docker push $CI_REGISTRY_IMAGE/api-test:$CI_COMMIT_SHORT_SHA
test-api:
stage: test
needs: [build-test-api]
extends: .depends_docker
services:
- docker:20.10.16-dind
- postgres:14
artifacts:
when: always
paths:
- api/test-reports/junit.xml
- api/test-reports/coverage.xml
reports:
junit: api/test-reports/junit.xml
coverage_report:
coverage_format: cobertura
path: api/test-reports/coverage.xml
coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/' # Regex to match coverage report
variables:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_HOST_AUTH_METHOD: trust
script:
- mkdir api/test-reports
- docker run -e DATABASE_HOST=${POSTGRES_PORT_5432_TCP_ADDR} -e DATABASE_NAME=${POSTGRES_DB} -e DATABASE_USER=${POSTGRES_USER} -e DATABASE_PASSWORD=${POSTGRES_PASSWORD} --mount=type=bind,source=$PWD/api/test-reports,target=/app/api/test-reports $CI_REGISTRY_IMAGE/api-test:$CI_COMMIT_SHORT_SHA pytest -n auto --junitxml=test-reports/junit.xml --cov=reportcreator_api --cov-report=term --cov-report=xml:test-reports/coverage.xml
build-test-frontend:
stage: build-test
extends: .depends_docker
script:
- docker build --build-arg BUILDKIT_INLINE_CACHE=1 --target=frontend-test -t $CI_REGISTRY_IMAGE/frontend-test:$CI_COMMIT_SHORT_SHA .
- docker push $CI_REGISTRY_IMAGE/frontend-test:$CI_COMMIT_SHORT_SHA
test-frontend:
stage: test
needs: [build-test-frontend]
extends: .depends_docker
artifacts:
when: always
paths:
- frontend/test-reports
reports:
junit: frontend/test-reports/junit.xml
script:
- mkdir frontend/test-reports
- docker run --mount=type=bind,source=$PWD/frontend/test-reports,target=/app/frontend/test-reports $CI_REGISTRY_IMAGE/frontend-test:$CI_COMMIT_SHORT_SHA npm run test
sync:
stage: sync
rules:
- if: $CI_COMMIT_BRANCH == "main"
variables:
GIT_STRATEGY: clone
script:
- apk add git
- git checkout -b $CI_COMMIT_BRANCH
- git remote add public https://${GITHUB_USERNAME}:${GITHUB_TOKEN}@github.com/Syslifters/sysreptor.git
- git status
- git config --global user.email $GITHUB_USER_MAIL
- git config --global user.name $GITHUB_USERNAME
- git push public main
build-release:
stage: build-release
extends: .depends_docker
rules:
- if: $CI_COMMIT_TAG # Run this job when a tag is created
script:
# Parse version number, exit on invalid version number
- apk add python3 py3-pip
- VERSION_NUMBER_LEADING_ZEROS=$(echo "$CI_COMMIT_TAG" | sed -nr 's/^(prod|test|ltest)-([0-9]+\.[0-9]+([\.ab][0-9]+)?)$/\2/p')
- VERSION_NUMBER=$(python3 -c "from packaging.version import Version;print(Version('${VERSION_NUMBER_LEADING_ZEROS}'))")
# Ensure the version number is in the changelog for prod deployments
- if [[ $CI_COMMIT_TAG =~ '^prod-.*' ]]; then grep -qE "^## (v${VERSION_NUMBER}|v${VERSION_NUMBER_LEADING_ZEROS})" CHANGELOG.md || exit 1; fi
# Build containers
- docker pull $CI_REGISTRY_IMAGE/frontend-test:$CI_COMMIT_SHORT_SHA
- docker pull $CI_REGISTRY_IMAGE/api-test:$CI_COMMIT_SHORT_SHA
- docker build --cache-from $CI_REGISTRY_IMAGE/frontend-test:$CI_COMMIT_SHORT_SHA --cache-from $CI_REGISTRY_IMAGE/api-test:$CI_COMMIT_SHORT_SHA --build-arg VERSION=$VERSION_NUMBER --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
- cd languagetool && docker build -t $CI_REGISTRY_IMAGE/languagetool:$CI_COMMIT_SHORT_SHA . && cd ..
- docker push $CI_REGISTRY_IMAGE/languagetool:$CI_COMMIT_SHORT_SHA
release_job_docker:
stage: release
needs: [build-release]
extends: .depends_docker
rules:
- if: $CI_COMMIT_TAG # Run this job when a tag is created
script:
- docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
- docker pull $CI_REGISTRY_IMAGE/languagetool:$CI_COMMIT_SHORT_SHA
- docker image tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
- docker image tag $CI_REGISTRY_IMAGE/languagetool:$CI_COMMIT_SHORT_SHA $CI_REGISTRY_IMAGE/languagetool:$CI_COMMIT_TAG
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
- docker push $CI_REGISTRY_IMAGE/languagetool:$CI_COMMIT_TAG
release_job_release:
stage: release
needs: [release_job_docker]
image: registry.gitlab.com/gitlab-org/release-cli:latest
script:
- echo "works"
rules:
- if: $CI_COMMIT_TAG # Run this job when a tag is created
release:
tag_name: "$CI_COMMIT_TAG"
description: "$CI_COMMIT_TAG"
release_job_github:
stage: release
needs: [build-release]
extends:
- .depends_docker
variables:
GIT_STRATEGY: clone
rules:
- if: $CI_COMMIT_TAG =~ /^prod-.*/ # Run this job on prod deployments
script:
# Set version number
- apk add python3 py3-pip
- VERSION_NUMBER_LEADING_ZEROS=$(echo "$CI_COMMIT_TAG" | sed -nr 's/^(prod|test|ltest)-([0-9]+\.[0-9]+([\.ab][0-9]+)?)$/\2/p')
- VERSION_NUMBER=$(python3 -c "from packaging.version import Version;print(Version('${VERSION_NUMBER_LEADING_ZEROS}'))")
- echo "# Do not modify. This file is automatically generated." > deploy/.env
- echo "# Make changes to host.env instead." >> deploy/.env
- echo "SYSREPTOR_VERSION=${VERSION_NUMBER}" >> deploy/.env
# Generate api notice file
- docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
- docker run -u0 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA /app/api/generate_notice.sh
- CONTAINER_ID=$(docker ps -qa --filter "ancestor=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA")
- docker cp $CONTAINER_ID:/app/api/NOTICE api/NOTICE
# Delete unnecessary files
- rm -rf docs/docs/s docs/README.md docs/reporting_software.yml docs/wip docs/hooks.py dev .vscode api/.vscode
# Publish to github
- apk add git github-cli
# Create a GitHub release with pre-built JS files
# Copy pre-built frontend files
- docker cp $CONTAINER_ID:/app/api/static api/src/
- docker cp $CONTAINER_ID:/app/api/frontend/index.html api/src/frontend/index.html
- sed -i "/^src\/static$/d" api/.gitignore
- sed -i "s/target:\ api/target:\ api-prebuilt/g" deploy/docker-compose.yml
# Copy pre-built rendering files
- docker cp $CONTAINER_ID:/app/rendering/dist rendering/dist
- sed -i "/^dist$/d" rendering/.gitignore
- rm -rf api/.vscode
# Create archive
- mkdir -p /tmp/sysreptor
- cp -r * .gitignore .dockerignore /tmp/sysreptor
- tar -czf /tmp/source-prebuilt.tar.gz -C /tmp sysreptor --exclude=sysreptor/.git
- git remote add public https://${GITHUB_USERNAME}:${GITHUB_TOKEN}@github.com/Syslifters/sysreptor.git
- git config --global user.email $GITHUB_USER_MAIL
- git config --global user.name $GITHUB_USERNAME
# Upload to GitHub
- gh release create "${VERSION_NUMBER}" /tmp/source-prebuilt.tar.gz --title="${VERSION_NUMBER}" --target="${CI_COMMIT_SHA}"
build-docs:
image: python:latest
stage: docs
needs: []
artifacts:
when: always
paths:
- docs/site/
expire_in: 2 days
allow_failure:
exit_codes: 127
script:
- cd docs
- pip3 install -r requirements.txt
- set +e
- python3 -c 'from hooks import *; generate_software_lists()' || EXIT_CODE=$?
- set -e
# Pack demo data archives
- for archive_dir in ../demo_data/*; do reptor packarchive "$archive_dir" -o "docs/assets/${archive_dir##*/}.tar.gz"; done
# Fetch remote docs from reptor CLI
- mkdir -p docs/cli && cd docs/cli
- git init && git remote add -f origin https://github.com/Syslifters/reptor.git
- git config core.sparseCheckout true
- echo "docs" >> .git/info/sparse-checkout
- LATEST_RELEASE_TAG=$(git describe --tags `git rev-list --tags --max-count=1`)
- git pull origin $LATEST_RELEASE_TAG
- mv docs/* .
- rm -rf docs .git
- cd ../..
# Build docs
- mkdocs build
deploy-docs:
image: python:latest
stage: docs
needs: [build-docs]
rules:
- if: $CI_COMMIT_TAG =~ /^prod-.*/ # Run this job on prod deployments
when: always
- if: $CI_COMMIT_TAG || $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: manual
allow_failure:
exit_codes: 127
script:
- cd docs
- git clone https://${GITHUB_USERNAME}:${GITHUB_TOKEN}@github.com/Syslifters/sysreptor-docs.git ghpages
- ls -lA
- cd ghpages
- ls -lA
- git config --global user.email $GITHUB_USER_MAIL
- git config --global user.name $GITHUB_USERNAME
- shopt -u dotglob
- rm -rf *
- cp -r ../site/* .
- git add .
- git commit -m "INIT"
- git reset $(git commit-tree HEAD^{tree} -m "INIT")
- git push --force