Files
htwkalender/charts/ci-build-deploy.yml
2025-02-09 23:32:38 +01:00

227 lines
6.1 KiB
YAML

.build-image:
stage: build
image: docker:latest
services:
- docker:dind
tags:
- image
variables:
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
DOCKER_TLS_VERIFY: 1
DOCKER_CERT_PATH: "/certs/client"
before_script:
- echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
artifacts:
paths:
- .env_file
expire_in: 1 hour
.build-data-manager-image:
extends: .build-image
variables:
BUILD_TARGET: "prod"
BUILD_PATH: "./services"
DOCKERFILE: "./services/data-manager/Dockerfile"
script:
- |
docker build --pull \
-t $IMAGE_TAG \
-f $DOCKERFILE \
--target $BUILD_TARGET \
$BUILD_PATH
- docker push "$IMAGE_TAG"
after_script:
- echo "export DATA_MANAGER_IMAGE=$IMAGE_TAG" >> .env_file
build-data-manager-image-dev:
extends: .build-data-manager-image
variables:
IMAGE_TAG: "$CI_REGISTRY_IMAGE/data-manager:dev"
#rules:
# - if: $CI_COMMIT_BRANCH == "development"
# changes:
# - services/data-manager/**/*
build-data-manager-image-prod:
extends: .build-data-manager-image
variables:
IMAGE_TAG: "$CI_REGISTRY_IMAGE/data-manager:latest"
#rules:
# - if: $CI_COMMIT_BRANCH == "main"
# changes:
# - services/data-manager/**/*
.build-ical-image:
extends: .build-image
variables:
BUILD_TARGET: "prod"
BUILD_PATH: "./services"
DOCKERFILE: "./services/ical/Dockerfile"
script:
- echo "Build"
after_script:
- echo "export ICAL_IMAGE=$IMAGE_TAG" >> .env_file
build-ical-image-dev:
extends: .build-ical-image
variables:
IMAGE_TAG: "$CI_REGISTRY_IMAGE/ical:dev"
needs:
- job: build-data-manager-image-dev
#rules:
# - if: $CI_COMMIT_BRANCH == "development"
# changes:
# - services/ical/**/*
build-ical-image-prod:
extends: .build-ical-image
variables:
IMAGE_TAG: "$CI_REGISTRY_IMAGE/ical:latest"
needs:
- job: build-data-manager-image-prod
#rules:
# - if: $CI_COMMIT_BRANCH == "main"
# changes:
# - services/ical/**/*
.build-frontend-image:
extends: .build-image
variables:
BUILD_TARGET: "prod"
BUILD_PATH: "./frontend"
DOCKERFILE: "./frontend/Dockerfile"
script:
- echo "Build"
after_script:
- echo "export FRONTEND_IMAGE=$IMAGE_TAG" >> .env_file
build-frontend-image-dev:
extends: .build-frontend-image
variables:
IMAGE_TAG: "$CI_REGISTRY_IMAGE/frontend:dev"
needs:
- job: build-ical-image-dev
#rules:
# - if: $CI_COMMIT_BRANCH == "development"
# changes:
# - frontend/**/*
build-frontend-image-prod:
extends: .build-frontend-image
variables:
IMAGE_TAG: "$CI_REGISTRY_IMAGE/frontend:latest"
needs:
- job: build-ical-image-prod
#rules:
# - if: $CI_COMMIT_BRANCH == "main"
# changes:
# - frontend/**/*
.package-helm-chart:
stage: package
image:
name: alpine/helm:3
entrypoint: [""]
variables:
CHARTS_DIR: $CI_PROJECT_DIR/charts
VALUES_FILE: $CI_PROJECT_DIR/charts/values.yaml
CHART_FILE: $CI_PROJECT_DIR/charts/Chart.yaml
before_script:
- apk add --no-cache gettext
- echo "HELM_ARTIFACT_JOB_NAME=$CI_JOB_NAME" >> .env_file
- echo "PROJECT_URL=$PROJECT_URL" >> .env_file
- echo "PROJECT_NAME=$PROJECT_NAME" >> .env_file
- source .env_file
- echo "Updating deployment URLs..."
- yq e -i '(.dataManager.image.name) = env(DATA_MANAGER_IMAGE)' $VALUES_FILE
- yq e -i '(.ical.image.name) = env(ICAL_IMAGE)' $VALUES_FILE
- yq e -i '(.frontend.image.name) = env(FRONTEND_IMAGE)' $VALUES_FILE
- yq e -i '(.frontend.host) = env(PROJECT_URL)' $VALUES_FILE
after_script:
- yq e -i 'explode(.)' "$VALUES_FILE"
- helm dependency update $CHARTS_DIR
- helm package $CHARTS_DIR --destination ./
artifacts:
paths:
- "*.tgz"
- .env_file
expire_in: 1 hour
package-helm-chart-dev:
extends: .package-helm-chart
variables:
PROJECT_URL: $PROJECT_URL_DEV
PROJECT_NAME: $CI_PROJECT_NAME-dev
script:
- yq e -i '(.production) = false' $VALUES_FILE
needs:
- build-frontend-image-dev
#rules:
# - if: '$CI_COMMIT_BRANCH == "development"'
# changes:
# - services/data-manager/**/*
# - services/ical/**/*
# - frontend/**/*
package-helm-chart-prod:
extends: .package-helm-chart
variables:
PROJECT_URL: $PROJECT_URL_PROD
PROJECT_NAME: $CI_PROJECT_NAME
script:
- yq e -i '(.frontend.googleSiteVerification) = env(GOOGLE_VERIFICATION)' $VALUES_FILE
- |
cat <<EOF > configmap-google.yaml
{{- if .Values.production }}
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-google
namespace: $PROJECT_NAME
data:
$GOOGLE_VERIFICATION.html: |
google-site-verification: $GOOGLE_VERIFICATION.html
{{- end }}
EOF
- envsubst < configmap-google.yaml > $CHARTS_DIR/templates/configmap-google.yaml
needs:
- build-frontend-image-prod
#rules:
# - if: '$CI_COMMIT_BRANCH == "main"'
# changes:
# - services/data-manager/**/*
# - services/ical/**/*
# - frontend/**/*
.trigger_deploy:
stage: deploy
image: alpine:latest
before_script:
- apk add --no-cache curl
- source .env_file
script:
- echo "Triggering deploy pipeline ..."
- |
curl -X POST \
-F "token=$CI_DEPLOY_REPO_TRIGGER_TOKEN" \
-F "ref=$CI_DEPLOY_REPO_REF" \
-F "variables[UPSTREAM_PROJECT_NAME]=$PROJECT_NAME" \
-F "variables[UPSTREAM_PROJECT_ID]=$CI_PROJECT_ID" \
-F "variables[UPSTREAM_COMMIT_REF_NAME]=$CI_COMMIT_REF_NAME" \
-F "variables[UPSTREAM_HELM_ARTIFACT_JOB_NAME]=$HELM_ARTIFACT_JOB_NAME" \
-F "variables[UPSTREAM_REGISTRY_PATH]=$CI_REGISTRY_IMAGE" \
"$CI_API_V4_URL/projects/$CI_DEPLOY_REPO_ID/trigger/pipeline"
- "echo 'The $PROJECT_NAME can be viewed on: $PROJECT_URL'"
#rules:
# - if: '$CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "development"'
trigger-dev:
extends: .trigger_deploy
needs:
- package-helm-chart-dev
trigger-prod:
extends: .trigger_deploy
needs:
- package-helm-chart-prod