Skip to content
Snippets Groups Projects
.gitlab-ci.yml 24.2 KiB
Newer Older
Varac's avatar
Varac committed
---
include:
  - /.gitlab/ci_templates/kaniko.yml
  - /.gitlab/ci_templates/ssh_setup.yml
  - template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
# Global templates and YAML anchors
# =================================
# Used in various stages/job definitions

# We don't use a `before_script` definition here because `extend` doesn't merge
# `before_script` but rather overwrites it.
# So we rather use [yaml anchors](https://docs.gitlab.com/ce/ci/yaml/README.html#anchors)
# here. Unfortunatly, anchors can't get included from files so we need to
# define them here.
.debug_information: &debug_information
  - |
    echo "Env vars:"
    echo
    echo "HOSTNAME:                  $HOSTNAME"
    echo "IP_ADDRESS:                $IP_ADDRESS"
    echo "Uptime:                    $(uptime)"
    echo "CLUSTER_DIR:               $CLUSTER_DIR"
    echo "ANSIBLE_HOST_KEY_CHECKING: $ANSIBLE_HOST_KEY_CHECKING"
    echo "KANIKO_BUILD_IMAGENAME:    $KANIKO_BUILD_IMAGENAME"
    echo "KANIKO build image ref:    ${CI_REGISTRY_IMAGE}/${KANIKO_BUILD_IMAGENAME}:${CI_CONTAINER_TAG}"
    echo "SSH_KEY_ID:                $SSH_KEY_ID"
    echo
    [ -d $CLUSTER_DIR ] && find $CLUSTER_DIR || echo "directory ${CLUSTER_DIR} not found"
    echo
    echo

# The dotenv report requires us to report the artifacts in every job that is
# required with a `needs:` from another job.
.report_artifacts:
  artifacts:
    paths:
      - clusters
    expire_in: 1 month
    when: always
    reports:
      dotenv:
        $CLUSTER_DIR/.cluster.env

# Rules that enable the cluster to be built and are applied to most steps
# (except for application-specific steps)
.general_rules:
  rules:
    - changes:
        - .gitlab-ci.yml
        - .gitlab/ci_scripts/*
        - Dockerfile
        - flux2/**/*
        - install/**/*
        - test/**/*
        - openappstack/**/*
        - requirements.txt
Varac's avatar
Varac committed
#
# Define the rules when/if app specific jobs are run.
# Just add the variable RESOURCE to the job like this:
Varac's avatar
Varac committed
#   variables:
#     RESOURCE: "eventrouter"
# and import the templates with i.e.
#   extends: .eventrouter_rules
# .eventrouter_rules will ensure that the job is only executed:
# - when files related to the app changed in the repo
# - A pipeline gets started from the UI and the job name is included in the
#   CI variable `TRIGGER_JOBS`
# - A commit is pushed containing the pattern TRIGGER_JOBS=.*<job name>
#   (i.e. TRIGGER_JOBS=ci-test-image-build,enable-nextcloud)
#
# Gitlab CI allows pushing CI vars via `git push` but a bug prevents this when
# using merge request pipelines (see https://gitlab.com/gitlab-org/gitlab/-/issues/326098)
.eventrouter_rules:
.loki_rules:
  extends:
    - .general_rules

.promtail_rules:
.nextcloud_rules:
  rules:
    - changes:
        - flux2/apps/$RESOURCE/*.yaml
        - flux2/cluster/optional/$RESOURCE/*.yaml
        - flux2/infrastructure/sources/nextcloud.yaml
        - install/install-app.sh
Varac's avatar
Varac committed
        - test/taiko/*
    - if: '$TRIGGER_JOBS =~ /enable-nextcloud/'
    - if: '$CI_COMMIT_MESSAGE =~ /TRIGGER_JOBS=.*enable-nextcloud/'
    - if: '$CI_COMMIT_BRANCH == "master"'
.kube_prometheus_stack_rules:
.cert_manager_rules:
  extends:
    - .general_rules
.local_path_provisioner_rules:
  extends:
    - .general_rules

.rocketchat_rules:
  rules:
    - changes:
        - flux2/apps/$RESOURCE/*.yaml
        - flux2/cluster/optional/$RESOURCE/*.yaml
        - flux2/infrastructure/sources/helm-stable.yaml
        - install/install-app.sh
Varac's avatar
Varac committed
        - test/taiko/*
    - if: '$TRIGGER_JOBS =~ /enable-rocketchat/'
    - if: '$CI_COMMIT_MESSAGE =~ /TRIGGER_JOBS=.*enable-rocketchat/'
    - if: '$CI_COMMIT_BRANCH == "master"'
.single_sign_on_rules:
  rules:
    - changes:
        - flux2/core/base/$RESOURCE/*.yaml
        - flux2/infrastructure/sources/single-sign-on.yaml
Maarten de Waard's avatar
Maarten de Waard committed
        - install/install-openappstack.sh
Varac's avatar
Varac committed
        - test/taiko/*
    - if: '$TRIGGER_JOBS =~ /enable-single-sign-on/'
    - if: '$CI_COMMIT_MESSAGE =~ /TRIGGER_JOBS=.*enable-single-sign-on/'
    - if: '$CI_COMMIT_BRANCH == "master"'
Varac's avatar
Varac committed
.wekan_rules:
  rules:
    - changes:
        - flux2/apps/$RESOURCE/*.yaml
        - flux2/cluster/optional/$RESOURCE/*.yaml
Varac's avatar
Varac committed
        - flux2/infrastructure/sources/wekan.yaml
        - install/install-app.sh
        - test/taiko/*
    - if: '$TRIGGER_JOBS =~ /enable-wekan/'
    - if: '$CI_COMMIT_MESSAGE =~ /TRIGGER_JOBS=.*enable-wekan/'
    - if: '$CI_COMMIT_BRANCH == "master"'

.wordpress_rules:
  rules:
    - changes:
        - flux2/apps/$RESOURCE/*.yaml
        - flux2/cluster/optional/$RESOURCE/*.yaml
        - flux2/infrastructure/sources/wordpress.yaml
        - install/install-app.sh
Varac's avatar
Varac committed
        - test/taiko/*
    - if: '$TRIGGER_JOBS =~ /enable-wordpress/'
    - if: '$CI_COMMIT_MESSAGE =~ /TRIGGER_JOBS=.*enable-wordpress/'
    - if: '$CI_COMMIT_BRANCH == "master"'
Varac's avatar
Varac committed

# Global declarations
# ===================

Varac's avatar
Varac committed
# https://docs.gitlab.com/ee/ci/yaml/README.html#workflowrules-templates
stages:
  - build
  - create-vps
Maarten de Waard's avatar
Maarten de Waard committed
  - kustomization
  - base-helm-release
  - install-apps
  - apps-helm-release
Varac's avatar
Varac committed
  - apps-ready
Varac's avatar
Varac committed
  - certs
  - health-test
  - integration-test
variables:
  SSH_KEY_ID: "411"
  HOSTNAME: "${CI_COMMIT_REF_SLUG}"
  ANSIBLE_HOST_KEY_CHECKING: "False"
  KANIKO_BUILD_IMAGENAME: "openappstack-ci"
  CLUSTER_DIR: "/builds/openappstack/openappstack/clusters/${CI_COMMIT_REF_SLUG}"
  image: "${CI_REGISTRY_IMAGE}/${KANIKO_BUILD_IMAGENAME}:${CI_CONTAINER_TAG}"
Varac's avatar
Varac committed
# Stage: build
# ============
#
Varac's avatar
Varac committed
# Builds CI test container image
Varac's avatar
Varac committed
# There are 2 moments in which we (re)build the container image. If some files are
# changed, or when the job is triggered with TRIGGER_JOBS.
Varac's avatar
Varac committed
ci-test-image-build:
  stage: build
  before_script:
    - *debug_information
  after_script:
    - |
      echo "CI_CONTAINER_TAG=${CI_COMMIT_REF_SLUG}" > .ci.env
  artifacts:
    paths:
      - .ci.env
    expire_in: 1 month
    when: always
    reports:
      dotenv:
        .ci.env
  environment:
    name: image/$CI_COMMIT_REF_SLUG
    url: https://open.greenhost.net:4567/openappstack/openappstack/openappstack-ci:${CI_COMMIT_REF_SLUG}
    on_stop: delete-image
    auto_stop_in: 3 weeks
Varac's avatar
Varac committed
  rules:
Varac's avatar
Varac committed
    # Automatically rebuild the container image if this file, the Dockerfile,
    # the installed requirements or the kaniko template change
Varac's avatar
Varac committed
    - changes:
        - Dockerfile
        - requirements.txt
        - .gitlab/ci_templates/kaniko.yml
    # Also rebuild when the CI variable contain this jobs name
    # or commit msg contains /TRIGGER_JOBS=.*ci-test-image-build/
    - if: '$TRIGGER_JOBS =~ /ci-test-image-build/'
    - if: '$CI_COMMIT_MESSAGE =~ /TRIGGER_JOBS=.*ci-test-image-build/'
  extends:
    - .kaniko_build
report-ci-image-tag:
  stage: build
  image: "curlimages/curl"
  before_script:
    - *debug_information
  script:
    - |
      TAG_INFORMATION=$(curl https://open.greenhost.net/api/v4/projects/openappstack%2Fopenappstack/registry/repositories/2/tags/${CI_COMMIT_REF_SLUG});
      echo "Tag information: ${TAG_INFORMATION}"
      if [ "$TAG_INFORMATION" == '{"message":"404 Tag Not Found"}' ]; then
        echo "CI_CONTAINER_TAG=master" > .ci.env
      else
        echo "CI_CONTAINER_TAG=${CI_COMMIT_REF_SLUG}" > .ci.env
      fi
  artifacts:
    paths:
      - .ci.env
    expire_in: 1 month
    when: always
    reports:
      dotenv:
        .ci.env
  rules:
    # Make sure this job does not run if ci-test-image-build runs
    - changes:
        - Dockerfile
        - requirements.txt
      when: never  # Never run on file changes that trigger ci-test-image-build
    - if: '$TRIGGER_JOBS =~ /ci-test-image-build/'
      when: never  # Never run when ci-test-image is triggered manually
    - if: '$CI_COMMIT_MESSAGE =~ /TRIGGER_JOBS=.*ci-test-image-build/'
      when: never  # Never run when ci-test-image is triggered manually
    - when: always
  interruptible: true


Varac's avatar
Varac committed
# Stage: create-vps
# =================
#
# Creates the vps for the pipeline

create-vps:
  stage: create-vps
  variables:
    SUBDOMAIN: "${CI_COMMIT_REF_SLUG}.ci"
    DOMAIN: "openappstack.net"
Varac's avatar
Varac committed
  script:
    - *debug_information
    # Creates a VPS based on a custom CI image for which the ansible playbook
    # has already run. See CONTRIBUTING.md#ci-pipeline-image for more info
    - bash .gitlab/ci_scripts/create_vps.sh
    # Make sure .ci.env variables are not lost
    - cat .ci.env >> ${CLUSTER_DIR}/.cluster.env
  extends:
    - .ssh_setup
    - .report_artifacts
    - .general_rules
    url: https://$FQDN
    on_stop: terminate-droplet
    auto_stop_in: 1 week
Varac's avatar
Varac committed
# Stage: setup-cluster
# ====================
#
# Installs OAS

test-dns:
  stage: setup-cluster
  script:
    - *debug_information
    - cd ansible/
    - pytest -v -s -m 'dns' --connection=ansible --ansible-inventory=${CLUSTER_DIR}/inventory.yml --hosts='ansible://*'
  extends:
    - .general_rules
  interruptible: true
setup-openappstack:
  stage: setup-cluster
  script:
    - *debug_information
    # Copy inventory files to ansible folder for use in install-apps step
Varac's avatar
Varac committed
    - chmod 700 ansible
    - cp ${CLUSTER_DIR}/inventory.yml ansible/
    # Set up cluster
    - python3 -m openappstack $HOSTNAME install
    # Customize env file, remove all comments and empty lines
    - sed "s/1.2.3.4/$IP_ADDRESS/; s/example.org/$FQDN/; s/acme_staging=false/acme_staging=true/; s/acme-v02/acme-staging-v02/; /^\s*#.*$/d; /^\s*$/d" install/.flux.env.example >> ${CLUSTER_DIR}/.flux.env
    # Deploy secret/oas-cluster-variables
    - cp install/kustomization.yaml ${CLUSTER_DIR}
    - kubectl apply -k ${CLUSTER_DIR}
    - bash ./install/install-openappstack.sh
Maarten de Waard's avatar
Maarten de Waard committed
    # TODO: Should also be removed or made up-to-date
Varac's avatar
Varac committed
    # Show versions of installed apps/binaries
Maarten de Waard's avatar
Maarten de Waard committed
    # - cd ansible
    # - ansible master -m shell -a 'oas-version-info.sh 2>&1'
  extends:
    - .ssh_setup
    - .report_artifacts
    - .general_rules
  interruptible: true
Maarten de Waard's avatar
Maarten de Waard committed
# Stage: kustomization
Varac's avatar
Varac committed
# ====================
#
Maarten de Waard's avatar
Maarten de Waard committed
# Tests if all kustomizations are ready
.kustomization-ready:
  stage: kustomization
  needs:
    - job: setup-openappstack
    - job: test-dns
Maarten de Waard's avatar
Maarten de Waard committed
  script:
    - *debug_information
    - cd ansible/
Maarten de Waard's avatar
Maarten de Waard committed
    - export KUBECONFIG="${PWD}/../clusters/${HOSTNAME}/kube_config_cluster.yml"
    - pytest -v -s -m 'kustomizations' --resource="$RESOURCE" --connection=ansible --ansible-inventory=${CLUSTER_DIR}/inventory.yml --hosts='ansible://*' --reruns 120 --reruns-delay 20
Maarten de Waard's avatar
Maarten de Waard committed
  extends:
    - .ssh_setup
Maarten de Waard's avatar
Maarten de Waard committed
  interruptible: true

Varac's avatar
Varac committed
core-kustomizations-ready:
Maarten de Waard's avatar
Maarten de Waard committed
  variables:
Varac's avatar
Varac committed
    RESOURCE: "core"
Maarten de Waard's avatar
Maarten de Waard committed
  extends:
    - .kustomization-ready

Varac's avatar
Varac committed
infrastructure-kustomizations-ready:
  variables:
    RESOURCE: "infrastructure"
  extends:
    - .kustomization-ready

monitoring-kustomizations-ready:
  variables:
    RESOURCE: "monitoring"
  extends:
    - .kustomization-ready

openappstack-kustomizations-ready:
  variables:
    RESOURCE: "openappstack"
  extends:
    - .kustomization-ready


Maarten de Waard's avatar
Maarten de Waard committed
.helm-release:
  script:
    - *debug_information
    - cd ansible/
Maarten de Waard's avatar
Maarten de Waard committed
    - export KUBECONFIG="${PWD}/../clusters/${HOSTNAME}/kube_config_cluster.yml"
    - pytest -v -s -m 'helmreleases' --resource="$RESOURCE" --namespace="$NAMESPACE" --connection=ansible --ansible-inventory=${CLUSTER_DIR}/inventory.yml --hosts='ansible://*' --reruns 120 --reruns-delay 20
  extends:
    - .ssh_setup
  interruptible: true
Maarten de Waard's avatar
Maarten de Waard committed
# Stage: base-helm-release
# ==================
#
# Checks helmreleases for oas base are ready

.base-helm-release:
  stage: base-helm-release
  needs:
    - job: core-kustomizations-ready
    - job: infrastructure-kustomizations-ready
    - job: openappstack-kustomizations-ready
Maarten de Waard's avatar
Maarten de Waard committed
    - job: setup-openappstack
    - job: test-dns
  extends:
    - .helm-release
Maarten de Waard's avatar
Maarten de Waard committed

cert-manager-helm-release:
  variables:
    RESOURCE: "cert-manager"
Varac's avatar
Varac committed
    NAMESPACE: "cert-manager"
Maarten de Waard's avatar
Maarten de Waard committed
    - .base-helm-release
    - .cert_manager_rules

Varac's avatar
Varac committed
eventrouter-helm-release:
  variables:
    RESOURCE: "eventrouter"
Varac's avatar
Varac committed
    NAMESPACE: "oas"
Maarten de Waard's avatar
Maarten de Waard committed
    - .base-helm-release
    - .eventrouter_rules
local-path-provisioner-helm-release:
  variables:
    RESOURCE: "local-path-provisioner"
Varac's avatar
Varac committed
    NAMESPACE: "kube-system"
Maarten de Waard's avatar
Maarten de Waard committed
    - .base-helm-release
Varac's avatar
Varac committed

loki-helm-release:
  variables:
    RESOURCE: "loki"
Varac's avatar
Varac committed
    NAMESPACE: "oas"
  extends:
Maarten de Waard's avatar
Maarten de Waard committed
    - .base-helm-release
    - .loki_rules

promtail-helm-release:
    RESOURCE: "promtail"
Varac's avatar
Varac committed
    NAMESPACE: "oas"
Maarten de Waard's avatar
Maarten de Waard committed
    - .base-helm-release
    - .promtail_rules
Maarten de Waard's avatar
Maarten de Waard committed
kube-prometheus-stack-helm-release:
Varac's avatar
Varac committed
  variables:
    RESOURCE: "kube-prometheus-stack"
Varac's avatar
Varac committed
    NAMESPACE: "oas"
Maarten de Waard's avatar
Maarten de Waard committed
    - .base-helm-release
    - .kube_prometheus_stack_rules
Maarten de Waard's avatar
Maarten de Waard committed
single-sign-on-helm-release:
Varac's avatar
Varac committed
  variables:
    RESOURCE: "single-sign-on"
Varac's avatar
Varac committed
    NAMESPACE: "oas"
Maarten de Waard's avatar
Maarten de Waard committed
    - .base-helm-release
    - .single_sign_on_rules
Maarten de Waard's avatar
Maarten de Waard committed
# Stage: install-apps
# ==================
#
# Checks if application needs to get installed

.enable_app_template:
  stage: install-apps
  script:
    - *debug_information
    # Add optional override values we need for the CI pipeline only
    - '[ -f ./install/overrides/oas-${RESOURCE}-override.yaml ] && kubectl apply -n oas-apps -f ./install/overrides/oas-${RESOURCE}-override.yaml'
    - bash ./install/install-app.sh ${RESOURCE}
Maarten de Waard's avatar
Maarten de Waard committed
  extends:
    - .ssh_setup
  interruptible: true

enable-nextcloud:
  variables:
    RESOURCE: "nextcloud"
Maarten de Waard's avatar
Maarten de Waard committed
  extends:
    - .enable_app_template
    - .nextcloud_rules

enable-rocketchat:
Varac's avatar
Varac committed
  variables:
    RESOURCE: "rocketchat"
Maarten de Waard's avatar
Maarten de Waard committed
    - .enable_app_template
    - .rocketchat_rules
Varac's avatar
Varac committed
enable-wekan:
  variables:
    RESOURCE: "wekan"
Varac's avatar
Varac committed
  extends:
    - .enable_app_template
    - .wekan_rules

Maarten de Waard's avatar
Maarten de Waard committed
enable-wordpress:
  variables:
    RESOURCE: "wordpress"
Maarten de Waard's avatar
Maarten de Waard committed
  extends:
    - .enable_app_template
    - .wordpress_rules

# Stage: apps-helm-release
# ====================
#
# Tests if all helm releases are ready

.apps-helm-release:
  stage: apps-helm-release
  extends:
    - .helm-release
Maarten de Waard's avatar
Maarten de Waard committed
  interruptible: true

nextcloud-helm-release:
  variables:
    RESOURCE: "nextcloud"
Varac's avatar
Varac committed
    NAMESPACE: "oas-apps"
Maarten de Waard's avatar
Maarten de Waard committed
  needs:
    - job: core-kustomizations-ready
    - job: infrastructure-kustomizations-ready
    - job: openappstack-kustomizations-ready
Maarten de Waard's avatar
Maarten de Waard committed
    - job: setup-openappstack
    - job: test-dns
    - job: enable-nextcloud
  extends:
    - .apps-helm-release
    - .nextcloud_rules

rocketchat-helm-release:
  variables:
    RESOURCE: "rocketchat"
Varac's avatar
Varac committed
    NAMESPACE: "oas-apps"
Maarten de Waard's avatar
Maarten de Waard committed
  needs:
    - job: core-kustomizations-ready
    - job: infrastructure-kustomizations-ready
    - job: openappstack-kustomizations-ready
Maarten de Waard's avatar
Maarten de Waard committed
    - job: setup-openappstack
    - job: test-dns
    - job: enable-rocketchat
  extends:
    - .apps-helm-release
    - .rocketchat_rules
Varac's avatar
Varac committed
wekan-helm-release:
  variables:
    RESOURCE: "wekan"
Varac's avatar
Varac committed
    NAMESPACE: "oas-apps"
Varac's avatar
Varac committed
  needs:
    - job: core-kustomizations-ready
    - job: infrastructure-kustomizations-ready
    - job: openappstack-kustomizations-ready
Varac's avatar
Varac committed
    - job: setup-openappstack
    - job: test-dns
    - job: enable-wekan
  extends:
    - .apps-helm-release
    - .wekan_rules

Varac's avatar
Varac committed
wordpress-helm-release:
  variables:
    RESOURCE: "wordpress"
Varac's avatar
Varac committed
    NAMESPACE: "oas-apps"
Maarten de Waard's avatar
Maarten de Waard committed
  needs:
    - job: core-kustomizations-ready
    - job: infrastructure-kustomizations-ready
    - job: openappstack-kustomizations-ready
Maarten de Waard's avatar
Maarten de Waard committed
    - job: setup-openappstack
    - job: test-dns
    - job: enable-wordpress
Maarten de Waard's avatar
Maarten de Waard committed
    - .apps-helm-release
Varac's avatar
Varac committed
# Stage: apps-ready
Varac's avatar
Varac committed
# ======================
Varac's avatar
Varac committed
#
# Tests apps for readiness state

Varac's avatar
Varac committed
.apps-deployment:
Varac's avatar
Varac committed
  stage: apps-ready
Varac's avatar
Varac committed
  script:
    - *debug_information
    - cd ansible/
Maarten de Waard's avatar
Maarten de Waard committed
    - export KUBECONFIG="${PWD}/../clusters/${HOSTNAME}/kube_config_cluster.yml"
Varac's avatar
Varac committed
    - pytest -v -s -m 'deployments' --resource="$RESOURCE" --namespace="$NAMESPACE" --connection=ansible --ansible-inventory=${CLUSTER_DIR}/inventory.yml --hosts='ansible://*' --reruns 120 --reruns-delay 10
Varac's avatar
Varac committed
  extends:
    - .ssh_setup
  interruptible: true
Varac's avatar
Varac committed
.apps-statefulset:
  stage: apps-ready
  script:
    - *debug_information
    - cd ansible/
    - export KUBECONFIG="${PWD}/../clusters/${HOSTNAME}/kube_config_cluster.yml"
    - pytest -v -s -m 'statefulsets' --resource="$RESOURCE" --namespace="$NAMESPACE" --connection=ansible --ansible-inventory=${CLUSTER_DIR}/inventory.yml --hosts='ansible://*' --reruns 120 --reruns-delay 10
  extends:
    - .ssh_setup
  interruptible: true

Varac's avatar
Varac committed
.apps-daemonset:
  stage: apps-ready
  script:
    - *debug_information
    - cd ansible/
    - export KUBECONFIG="${PWD}/../clusters/${HOSTNAME}/kube_config_cluster.yml"
    - pytest -v -s -m 'daemonsets' --resource="$RESOURCE" --namespace="$NAMESPACE" --connection=ansible --ansible-inventory=${CLUSTER_DIR}/inventory.yml --hosts='ansible://*' --reruns 120 --reruns-delay 10
  extends:
    - .ssh_setup
  interruptible: true

Varac's avatar
Varac committed
cert-manager-deployment:
    RESOURCE: "cert-manager"
Varac's avatar
Varac committed
    NAMESPACE: "cert-manager"
  needs:
    - job: cert-manager-helm-release
    - job: setup-openappstack  # Needs makes sure the artifacts from that job are downloaded
Varac's avatar
Varac committed
    - .apps-deployment
    - .cert_manager_rules

Varac's avatar
Varac committed
eventrouter-deployment:
Varac's avatar
Varac committed
  variables:
    RESOURCE: "eventrouter"
Varac's avatar
Varac committed
    NAMESPACE: "oas"
Varac's avatar
Varac committed
  needs:
    - job: eventrouter-helm-release
Varac's avatar
Varac committed
    - .apps-deployment
    - .eventrouter_rules
Varac's avatar
Varac committed
local-path-provisioner-deployment:
    RESOURCE: "local-path-provisioner"
Varac's avatar
Varac committed
    NAMESPACE: "kube-system"
  needs:
    - job: local-path-provisioner-helm-release
    - job: setup-openappstack
  extends:
Varac's avatar
Varac committed
    - .apps-deployment
Varac's avatar
Varac committed
loki-statefulset:
  variables:
    RESOURCE: "loki"
Varac's avatar
Varac committed
    NAMESPACE: "oas"
  needs:
    - job: loki-helm-release
    - job: setup-openappstack
  extends:
Varac's avatar
Varac committed
    - .apps-statefulset
    - .loki_rules

Varac's avatar
Varac committed
promtail-daemonset:
    RESOURCE: "promtail"
Varac's avatar
Varac committed
    NAMESPACE: "oas"
    - job: promtail-helm-release
    - job: setup-openappstack
Varac's avatar
Varac committed
    - .apps-daemonset
    - .promtail_rules
Varac's avatar
Varac committed
nextcloud-deployment:
Varac's avatar
Varac committed
  variables:
    RESOURCE: "nextcloud"
Varac's avatar
Varac committed
    NAMESPACE: "oas-apps"
Varac's avatar
Varac committed
  needs:
    - job: nextcloud-helm-release
    - job: setup-openappstack
Varac's avatar
Varac committed
    - .apps-deployment
    - .nextcloud_rules
Varac's avatar
Varac committed
kube-prometheus-stack-deployment:
Varac's avatar
Varac committed
  variables:
    RESOURCE: "kube-prometheus-stack"
Varac's avatar
Varac committed
    NAMESPACE: "oas"
Varac's avatar
Varac committed
  needs:
Maarten de Waard's avatar
Maarten de Waard committed
    - job: kube-prometheus-stack-helm-release
    - job: setup-openappstack
Varac's avatar
Varac committed
    - .apps-deployment
    - .kube_prometheus_stack_rules
Varac's avatar
Varac committed
rocketchat-deployment:
Varac's avatar
Varac committed
  variables:
    RESOURCE: "rocketchat"
Varac's avatar
Varac committed
    NAMESPACE: "oas-apps"
Varac's avatar
Varac committed
  needs:
    - job: rocketchat-helm-release
    - job: setup-openappstack
Varac's avatar
Varac committed
    - .apps-deployment
    - .rocketchat_rules
Varac's avatar
Varac committed
single-sign-on-deployment:
  variables:
    RESOURCE: "single-sign-on"
Varac's avatar
Varac committed
    NAMESPACE: "oas"
Varac's avatar
Varac committed
  needs:
    - job: single-sign-on-helm-release
    - job: setup-openappstack
Varac's avatar
Varac committed
    - .apps-deployment
    - .single_sign_on_rules
Varac's avatar
Varac committed
wekan-deployment:
Varac's avatar
Varac committed
  variables:
    RESOURCE: "wekan"
Varac's avatar
Varac committed
    NAMESPACE: "oas-apps"
Varac's avatar
Varac committed
  needs:
    - job: wekan-helm-release
    - job: setup-openappstack
  extends:
Varac's avatar
Varac committed
    - .apps-deployment
Varac's avatar
Varac committed
    - .wekan_rules

Varac's avatar
Varac committed
wordpress-statefulset:
Varac's avatar
Varac committed
  variables:
    RESOURCE: "wordpress"
Varac's avatar
Varac committed
    NAMESPACE: "oas-apps"
Varac's avatar
Varac committed
  needs:
    - job: wordpress-helm-release
    - job: setup-openappstack
Varac's avatar
Varac committed
    - .apps-statefulset
    - .wordpress_rules
Varac's avatar
Varac committed
# Stage: certs
# ================
Varac's avatar
Varac committed
# Test each app for proper certs
Varac's avatar
Varac committed
.apps-cert:
  stage: certs
  script:
    - *debug_information
    - pytest -v -s -m 'certs' --resource="$RESOURCE" --connection=ansible --ansible-inventory=${CLUSTER_DIR}/inventory.yml --hosts='ansible://*' --reruns 120 --reruns-delay 10
  extends:
    - .ssh_setup
  interruptible: true
Varac's avatar
Varac committed

nextcloud-cert:
  variables:
    RESOURCE: "nextcloud"
Varac's avatar
Varac committed
  needs:
Varac's avatar
Varac committed
    - job: nextcloud-deployment
    - job: setup-openappstack
  extends:
    - .apps-cert
    - .nextcloud_rules
Maarten de Waard's avatar
Maarten de Waard committed
kube-prometheus-stack-cert:
Varac's avatar
Varac committed
  variables:
    RESOURCE: "kube-prometheus-stack"
Varac's avatar
Varac committed
  needs:
Varac's avatar
Varac committed
    - job: kube-prometheus-stack-deployment
    - job: setup-openappstack
  extends:
    - .apps-cert
    - .kube_prometheus_stack_rules
Varac's avatar
Varac committed

rocketchat-cert:
  variables:
    RESOURCE: "rocketchat"
Varac's avatar
Varac committed
  needs:
Varac's avatar
Varac committed
    - job: rocketchat-deployment
    - job: setup-openappstack
  extends:
    - .apps-cert
    - .rocketchat_rules
Varac's avatar
Varac committed
single-sign-on-cert:
  variables:
    RESOURCE: "single-sign-on"
Varac's avatar
Varac committed
  needs:
Varac's avatar
Varac committed
    - job: single-sign-on-deployment
    - job: setup-openappstack
  extends:
    - .apps-cert
    - .single_sign_on_rules
Varac's avatar
Varac committed
wekan-cert:
  variables:
    RESOURCE: "wekan"
Varac's avatar
Varac committed
  needs:
Varac's avatar
Varac committed
    - job: wekan-deployment
Varac's avatar
Varac committed
    - job: setup-openappstack
  extends:
    - .apps-cert
    - .wekan_rules

Varac's avatar
Varac committed
wordpress-cert:
  variables:
    RESOURCE: "wordpress"
Varac's avatar
Varac committed
  needs:
Varac's avatar
Varac committed
    - job: wordpress-statefulset
    - job: setup-openappstack
  extends:
    - .apps-cert
    - .wordpress_rules
Varac's avatar
Varac committed


# Stage: health-test
# ==================
#
# General cluster health checks

testinfra:
  stage: health-test
    - *debug_information
Varac's avatar
Varac committed
    - pytest -v -s -m 'testinfra' --connection=ansible --ansible-inventory=${CLUSTER_DIR}/inventory.yml --hosts='ansible://*'
  extends:
    - .ssh_setup
    - .general_rules
  interruptible: true
Maarten de Waard's avatar
Maarten de Waard committed
kube-prometheus-stack-alerts:
Varac's avatar
Varac committed
  stage: health-test
Varac's avatar
Varac committed
  variables:
    # RESOURCE var is used in job specific rules (i.e. .kube_prometheus_stack_rules)
    RESOURCE: "kube-prometheus-stack"
    # Enforce python requests using the system cert store, where LE staging
    # cacert is added
    REQUESTS_CA_BUNDLE: "/etc/ssl/certs/ca-certificates.crt"
Varac's avatar
Varac committed
  allow_failure: true
  script:
    - *debug_information
    - export BASIC_AUTH_PW=$(python3 -m openappstack $HOSTNAME secrets | grep oas-prometheus-basic-auth | cut -d'=' -f2)
Varac's avatar
Varac committed
    - cd test/
    - pytest -s -m 'prometheus' --connection=ansible --ansible-inventory=${CLUSTER_DIR}/inventory.yml --hosts='ansible://*'
  extends:
    - .ssh_setup
    - .kube_prometheus_stack_rules
Varac's avatar
Varac committed
  needs:
Varac's avatar
Varac committed
    - job: kube-prometheus-stack-deployment
    - job: setup-openappstack
  interruptible: true
Varac's avatar
Varac committed

# Stage: integration-test
# =======================
#
Varac's avatar
Varac committed
# Runs integration tests for most apps using taiko
Varac's avatar
Varac committed
.taiko:
  stage: integration-test
Varac's avatar
Varac committed
  script:
    - *debug_information
Varac's avatar
Varac committed
    # Run the taiko tests for specific app
Varac's avatar
Varac committed
    - python3 -m openappstack $HOSTNAME test --apps $RESOURCE
Varac's avatar
Varac committed
  retry: 2
Varac's avatar
Varac committed
  artifacts:
    paths:
Varac's avatar
Varac committed
      - test/taiko/Screenshot*
Varac's avatar
Varac committed
    expire_in: 1 month
    when: on_failure
  extends:
    - .ssh_setup
  interruptible: true
Varac's avatar
Varac committed
  variables:
    RESOURCE: "grafana"
Varac's avatar
Varac committed
  needs:
Maarten de Waard's avatar
Maarten de Waard committed
    - job: kube-prometheus-stack-cert
    - job: setup-openappstack
Varac's avatar
Varac committed
    - .taiko
    - .kube_prometheus_stack_rules
Varac's avatar
Varac committed
nextcloud-taiko:
Varac's avatar
Varac committed
  variables:
    RESOURCE: "nextcloud"
Varac's avatar
Varac committed
  needs:
Varac's avatar
Varac committed
    - job: nextcloud-cert
    - job: setup-openappstack
Varac's avatar
Varac committed
    - .taiko
    - .nextcloud_rules
Varac's avatar
Varac committed
rocketchat-taiko:
Varac's avatar
Varac committed
  variables:
    RESOURCE: "rocketchat"
Varac's avatar
Varac committed
  needs:
Varac's avatar
Varac committed
    - job: rocketchat-cert
    - job: setup-openappstack
Varac's avatar
Varac committed
    - .taiko
    - .rocketchat_rules
Varac's avatar
Varac committed
  allow_failure: true
Varac's avatar
Varac committed
wekan-taiko:
  variables:
    RESOURCE: "wekan"
Varac's avatar
Varac committed
  needs:
    - job: wekan-cert
    - job: setup-openappstack
  extends:
    - .taiko
    - .wekan_rules

Varac's avatar
Varac committed
wordpress-taiko:
Varac's avatar
Varac committed
  variables:
    RESOURCE: "wordpress"
Varac's avatar
Varac committed
  needs:
Varac's avatar
Varac committed
    - job: wordpress-cert
    - job: setup-openappstack
Varac's avatar
Varac committed
    - .taiko
    - .wordpress_rules
Varac's avatar
Varac committed

# Terminates a droplet once the branch for it is deleted
terminate-droplet:
  # Stage has to be the same as the step that created the VPS
  # https://docs.gitlab.com/ee/ci/environments.html#automatically-stopping-an-environment
  stage: create-vps
  # Gets triggered by on_stop of create-vps job
  when: manual
  variables:
    GIT_STRATEGY: none
  script:
    - *debug_information
    - python3 -c "import greenhost_cloud; greenhost_cloud.terminate_droplets_by_name(\"^${CI_COMMIT_REF_SLUG}\")"
  environment:
    name: $CI_COMMIT_REF_SLUG
    action: stop

Varac's avatar
Varac committed
# Deletes a container image once a branch is deleted.
# Careful! When you run this step manually, you might have to trigger container
Varac's avatar
Varac committed
# image re-build as well
delete-image:
  stage: build
  when: manual
  variables:
    GIT_STRATEGY: none
  script:
    - *debug_information
    - "curl --request DELETE --header \"PRIVATE-TOKEN: ${CLEANER_TOKEN}\" https://open.greenhost.net/api/v4/projects/openappstack%2Fopenappstack/registry/repositories/2/tags/${CI_COMMIT_REF_SLUG}"
Varac's avatar
Varac committed
    name: image/$CI_COMMIT_REF_SLUG