Files
H3ConuMS-v2/.gitlab-ci.yml

127 lines
4.1 KiB
YAML

stages:
- verify
- test
- security
- build
workflow:
rules:
- if: $CI_COMMIT_TAG
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH
default:
interruptible: true
variables:
PIP_DISABLE_PIP_VERSION_CHECK: "1"
PIP_NO_INPUT: "1"
PYTHONDONTWRITEBYTECODE: "1"
dependency-source-policy:
stage: verify
image: "$INTERNAL_CONTAINER_PROXY/alpine:3.20"
script:
- test -n "$INTERNAL_CONTAINER_PROXY" || (echo "INTERNAL_CONTAINER_PROXY must point to the approved container-image proxy" && exit 1)
- test -n "$INTERNAL_PYPI_URL" || (echo "INTERNAL_PYPI_URL must point to the approved PyPI proxy" && exit 1)
- test -n "$INTERNAL_NPM_REGISTRY" || (echo "INTERNAL_NPM_REGISTRY must point to the approved npm proxy" && exit 1)
rules:
- if: $CI_COMMIT_BRANCH || $CI_MERGE_REQUEST_ID || $CI_COMMIT_TAG
backend-tests:
stage: test
image: "$INTERNAL_CONTAINER_PROXY/python:3.11-slim"
needs: ["dependency-source-policy"]
cache:
key:
files:
- backend/requirements.txt
paths:
- .cache/pip
variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
SECRET_KEY: "ci-test-secret-not-for-deployment"
CREDENTIAL_ENCRYPTION_KEY: "Q6NgOwoM3sna4ti4UeEo3Lo2cIzxc8wJMvMZ2cmw7lU="
DATABASE_URL: "sqlite:///./ci-test.db"
REDIS_URL: "redis://localhost:6379/15"
CASDOOR_ENDPOINT: "https://casdoor.example.test"
CASDOOR_CLIENT_ID: "ci-client"
CASDOOR_CLIENT_SECRET: "ci-client-secret"
CASDOOR_ORG_NAME: "ci-org"
CASDOOR_APP_NAME: "ci-app"
before_script:
- python -m pip install --index-url "$INTERNAL_PYPI_URL" --upgrade pip
- python -m pip install --index-url "$INTERNAL_PYPI_URL" -r backend/requirements.txt
script:
- cd backend
- python -m compileall -q app
- pytest -q --junitxml=../reports/backend-junit.xml
artifacts:
when: always
reports:
junit: reports/backend-junit.xml
paths:
- reports/backend-junit.xml
expire_in: 30 days
frontend-build:
stage: test
image: "$INTERNAL_CONTAINER_PROXY/node:20-alpine"
needs: ["dependency-source-policy"]
cache:
key:
files:
- frontend/package-lock.json
paths:
- frontend/.npm/
before_script:
- npm config set registry "$INTERNAL_NPM_REGISTRY"
script:
- cd frontend
- npm ci --cache .npm --prefer-offline
- npm run build
artifacts:
paths:
- frontend/dist/
expire_in: 7 days
python-dependency-audit:
stage: security
image: "$INTERNAL_CONTAINER_PROXY/python:3.11-slim"
needs: ["dependency-source-policy"]
cache:
key:
files:
- backend/requirements.txt
- ci/requirements-audit.txt
paths:
- .cache/pip
variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
before_script:
- python -m pip install --index-url "$INTERNAL_PYPI_URL" --upgrade pip
- python -m pip install --index-url "$INTERNAL_PYPI_URL" -r ci/requirements-audit.txt
script:
- mkdir -p reports
- pip-audit --index-url "$INTERNAL_PYPI_URL" -r backend/requirements.txt --format json --output reports/pip-audit.json
artifacts:
when: always
paths:
- reports/pip-audit.json
expire_in: 30 days
container-build:
stage: build
image: "$INTERNAL_CONTAINER_PROXY/docker:27-cli"
needs: ["backend-tests", "frontend-build", "python-dependency-audit"]
services:
- name: "$INTERNAL_CONTAINER_PROXY/docker:27-dind"
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
script:
- docker build --pull --build-arg "PYTHON_BASE_IMAGE=$INTERNAL_CONTAINER_PROXY/python:3.11-slim" --build-arg "PIP_INDEX_URL=$INTERNAL_PYPI_URL" --label "org.opencontainers.image.revision=$CI_COMMIT_SHA" --tag "h3c-onu-ms-backend:$CI_COMMIT_SHA" backend
- docker build --pull --build-arg "NODE_BASE_IMAGE=$INTERNAL_CONTAINER_PROXY/node:20-alpine" --build-arg "NGINX_BASE_IMAGE=$INTERNAL_CONTAINER_PROXY/nginx:alpine" --build-arg "NPM_CONFIG_REGISTRY=$INTERNAL_NPM_REGISTRY" --label "org.opencontainers.image.revision=$CI_COMMIT_SHA" --tag "h3c-onu-ms-frontend:$CI_COMMIT_SHA" frontend
rules:
- if: $CI_COMMIT_BRANCH || $CI_MERGE_REQUEST_ID || $CI_COMMIT_TAG