Skip to content
Snippets Groups Projects
.gitlab-ci.yml 9.79 KiB
stages:
  - build
  - test
  - check
  - deploy

.dind:
  tags:
    - exec-dind
  # see https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled
  # for image usage and settings for building with TLS and docker in docker
  image: docker:19.03.1
  services:
    - docker:19.03.1-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"

# Theodolite Helm Chart

lint-helm:
  stage: check
  image:
    name: alpine/helm:3.5.2
    entrypoint: [""]
  tags:
    - exec-docker
  script: helm lint execution/helm/


# Theodolite Benchmarks

.benchmarks:
  image: openjdk:11-jdk
  tags:
    - exec-docker
  variables:
    GRADLE_OPTS: "-Dorg.gradle.daemon=false"
  cache:
    paths:
      - .gradle
  before_script:
    - cd theodolite-benchmarks
    - export GRADLE_USER_HOME=`pwd`/.gradle

build-benchmarks:
  stage: build
  extends: .benchmarks
  script: ./gradlew --build-cache assemble
  artifacts:
    paths:
      - "theodolite-benchmarks/build/libs/*.jar"
      - "theodolite-benchmarks/*/build/libs/*.jar"
      - "theodolite-benchmarks/*/build/distributions/*.tar"
    expire_in: 6 hours

test-benchmarks:
  stage: test
  extends: .benchmarks
  needs:
    - build-benchmarks
  script: ./gradlew test --continue
  artifacts:
    reports:
      junit:
        - "theodolite-benchmarks/**/build/test-results/test/TEST-*.xml"

checkstyle-benchmarks:
  stage: check
  extends: .benchmarks
  needs:
    - build-benchmarks
    - test-benchmarks
  script: ./gradlew checkstyle --continue
  artifacts:
    paths:
      - "theodolite-benchmarks/*/build/reports/checkstyle/main.html"
    when: on_failure
    expire_in: 1 day

pmd-benchmarks:
  stage: check
  extends: .benchmarks
  needs:
    - build-benchmarks
    - test-benchmarks
  script: ./gradlew pmd --continue
  artifacts:
    paths:
      - "theodolite-benchmarks/*/build/reports/pmd/*.html"
    when: on_failure
    expire_in: 1 day

spotbugs-benchmarks:
  stage: check
  extends: .benchmarks
  needs:
    - build-benchmarks
    - test-benchmarks
  script: ./gradlew spotbugs --continue
  artifacts:
    paths:
      - "theodolite-benchmarks/*/build/reports/spotbugs/*.html"
    when: on_failure
    expire_in: 1 day

.deploy-benchmarks:
  stage: deploy
  extends:
    - .benchmarks
    - .dind
  needs:
    - build-benchmarks
    - checkstyle-benchmarks
    - pmd-benchmarks
    - spotbugs-benchmarks
  script:
    - DOCKER_TAG_NAME=$(echo $CI_COMMIT_REF_SLUG- | sed 's/^master-$//')
    - docker build --pull -t $IMAGE_NAME ./$JAVA_PROJECT_NAME
    - "[ ! $CI_COMMIT_TAG ] && docker tag $IMAGE_NAME $CR_HOST/$CR_ORG/$IMAGE_NAME:${DOCKER_TAG_NAME}latest"
    - "[ ! $CI_COMMIT_TAG ] && docker tag $IMAGE_NAME $CR_HOST/$CR_ORG/$IMAGE_NAME:$DOCKER_TAG_NAME$CI_COMMIT_SHORT_SHA"
    - "[ $CI_COMMIT_TAG ] && docker tag $IMAGE_NAME $CR_HOST/$CR_ORG/$IMAGE_NAME:$CI_COMMIT_TAG"
    - echo $CR_PW | docker login $CR_HOST -u $CR_USER --password-stdin
    - docker push $CR_HOST/$CR_ORG/$IMAGE_NAME
    - docker logout
  rules:
    - if: "$CR_HOST && $CR_ORG && $CR_USER && $CR_PW && $IMAGE_NAME && $JAVA_PROJECT_NAME && $CI_COMMIT_TAG"
      when: always
    - changes:
      - theodolite-benchmarks/*
      - theodolite-benchmarks/$JAVA_PROJECT_NAME/**/*
      - theodolite-benchmarks/kstreams-commons/**/*
      - theodolite-benchmarks/flink-commons/**/*
      - theodolite-benchmarks/load-generator-commons/**/*
      if: "$CR_HOST && $CR_ORG && $CR_USER && $CR_PW && $IMAGE_NAME && $JAVA_PROJECT_NAME"
      when: always
    - if: "$CR_HOST && $CR_ORG && $CR_USER && $CR_PW && $IMAGE_NAME && $JAVA_PROJECT_NAME"
      when: manual
      allow_failure: true

deploy-uc1-kstreams:
  extends: .deploy-benchmarks
  variables:
    IMAGE_NAME: "theodolite-uc1-kstreams-app"
    JAVA_PROJECT_NAME: "uc1-kstreams"

deploy-uc2-kstreams:
  extends: .deploy-benchmarks
  variables:
    IMAGE_NAME: "theodolite-uc2-kstreams-app"
    JAVA_PROJECT_NAME: "uc2-kstreams"

deploy-uc3-kstreams:
  extends: .deploy-benchmarks
  variables:
    IMAGE_NAME: "theodolite-uc3-kstreams-app"
    JAVA_PROJECT_NAME: "uc3-kstreams"

deploy-uc4-kstreams:
  extends: .deploy-benchmarks
  variables:
    IMAGE_NAME: "theodolite-uc4-kstreams-app"
    JAVA_PROJECT_NAME: "uc4-kstreams"

deploy-uc1-flink:
  extends: .deploy-benchmarks
  variables:
    IMAGE_NAME: "theodolite-uc1-flink"
    JAVA_PROJECT_NAME: "uc1-flink"

deploy-uc2-flink:
  extends: .deploy-benchmarks
  variables:
    IMAGE_NAME: "theodolite-uc2-flink"
    JAVA_PROJECT_NAME: "uc2-flink"

deploy-uc3-flink:
  extends: .deploy-benchmarks
  variables:
    IMAGE_NAME: "theodolite-uc3-flink"
    JAVA_PROJECT_NAME: "uc3-flink"

deploy-uc4-flink:
  extends: .deploy-benchmarks
  variables:
    IMAGE_NAME: "theodolite-uc4-flink"
    JAVA_PROJECT_NAME: "uc4-flink"

deploy-uc1-load-generator:
  extends: .deploy-benchmarks
  variables:
    IMAGE_NAME: "theodolite-uc1-workload-generator"
    JAVA_PROJECT_NAME: "uc1-load-generator"

deploy-uc2-load-generator:
  extends: .deploy-benchmarks
  variables:
    IMAGE_NAME: "theodolite-uc2-workload-generator"
    JAVA_PROJECT_NAME: "uc2-load-generator"

deploy-uc3-load-generator:
  extends: .deploy-benchmarks
  variables:
    IMAGE_NAME: "theodolite-uc3-workload-generator"
    JAVA_PROJECT_NAME: "uc3-load-generator"

deploy-uc4-load-generator:
  extends: .deploy-benchmarks
  variables:
    IMAGE_NAME: "theodolite-uc4-workload-generator"
    JAVA_PROJECT_NAME: "uc4-load-generator"
      

# Theodolite Framework

.theodolite:
  image: ghcr.io/graalvm/graalvm-ce:java11-21.0.0.2
  tags:
    - exec-docker
  variables:
    GRADLE_OPTS: "-Dorg.gradle.daemon=false"
  cache:
    paths:
      - .gradle/wrapper
      - .gradle/caches
  before_script:
    - cd theodolite-quarkus
    - export GRADLE_USER_HOME=`pwd`/.gradle

build-theodolite-jvm:
  stage: build
  extends: .theodolite
  script: ./gradlew --build-cache assemble
  artifacts:
    paths:
      - "theodolite-quarkus/build/lib/*"
      - "theodolite-quarkus/build/*-runner.jar"
    expire_in: 6 hours

build-theodolite-native:
  stage: build
  extends: .theodolite
  script:
    - gu install native-image # TODO move to image
    - ./gradlew --build-cache assemble -Dquarkus.package.type=native
  artifacts:
    paths:
      - "theodolite-quarkus/build/*-runner"
    expire_in: 6 hours

test-theodolite:
  stage: test
  extends: .theodolite
  needs:
    - build-theodolite-jvm
    - build-theodolite-native
  script: ./gradlew test --stacktrace

# Disabled for now
.ktlint-theodolite:
  stage: check
  extends: .theodolite
  needs:
    - build-theodolite-jvm
    - test-theodolite
  script: ./gradlew ktlintCheck --continue

# Disabled for now
.detekt-theodolite: 
  stage: check
  extends: .theodolite
  needs:
    - build-theodolite-jvm
    - test-theodolite
  script: ./gradlew detekt --continue

deploy-theodolite:
  stage: deploy
  extends:
    - .theodolite
    - .dind
  needs:
    - build-theodolite-native
    - test-theodolite
  script:
    - DOCKER_TAG_NAME=$(echo $CI_COMMIT_REF_SLUG- | sed 's/^master-$//')
    - docker build -f src/main/docker/Dockerfile.native -t theodolite .
    #- docker build -f src/main/docker/Dockerfile.jvm -t theodolite .
    - "[ ! $CI_COMMIT_TAG ] && docker tag theodolite $CR_HOST/$CR_ORG/theodolite:${DOCKER_TAG_NAME}latest"
    - "[ ! $CI_COMMIT_TAG ] && docker tag theodolite $CR_HOST/$CR_ORG/theodolite:$DOCKER_TAG_NAME$CI_COMMIT_SHORT_SHA"
    - "[ $CI_COMMIT_TAG ] && docker tag theodolite $CR_HOST/$CR_ORG/theodolite:$CI_COMMIT_TAG"
    - echo $CR_PW | docker login $CR_HOST -u $CR_USER --password-stdin
    - docker push $CR_HOST/$CR_ORG/theodolite
    - docker logout
  rules:
    - if: "$CR_HOST && $CR_ORG && $CR_USER && $CR_PW && $CI_COMMIT_TAG"
      when: always
    - changes:
      - theodolite-quarkus/**/*
      if: "$CR_HOST && $CR_ORG && $CR_USER && $CR_PW"
      when: always
    - if: "$CR_HOST && $CR_ORG && $CR_USER && $CR_PW"
      when: manual
      allow_failure: true


# Theodolite SLO Checker: Lag Trend

deploy-slo-checker-lag-trend:
  stage: deploy
  extends:
    - .dind
  script:
    - DOCKER_TAG_NAME=$(echo $CI_COMMIT_REF_SLUG- | sed 's/^master-$//')
    - docker build --pull -t theodolite-slo-checker-lag-trend slope-evaluator
    - "[ ! $CI_COMMIT_TAG ] && docker tag theodolite-slo-checker-lag-trend $CR_HOST/$CR_ORG/theodolite-slo-checker-lag-trend:${DOCKER_TAG_NAME}latest"
    - "[ $CI_COMMIT_TAG ] && docker tag theodolite-slo-checker-lag-trend $CR_HOST/$CR_ORG/theodolite-slo-checker-lag-trend:$CI_COMMIT_TAG"
    - echo $CR_PW | docker login $CR_HOST -u $CR_USER --password-stdin
    - docker push $CR_HOST/$CR_ORG/theodolite-slo-checker-lag-trend
    - docker logout
  rules:
    - if: "$CR_HOST && $CR_ORG && $CR_USER && $CR_PW && $CI_COMMIT_TAG"
      when: always
    - changes:
      - slope-evaluator/**/*
      if: "$CR_HOST && $CR_ORG && $CR_USER && $CR_PW"
      when: always
    - if: "$CR_HOST && $CR_ORG && $CR_USER && $CR_PW"
      when: manual
      allow_failure: true


# Theodolite Random Scheduler

deploy-random-scheduler:
  stage: deploy
  extends:
    - .dind
  script:
    - DOCKER_TAG_NAME=$(echo $CI_COMMIT_REF_SLUG- | sed 's/^master-$//')
    - docker build --pull -t theodolite-random-scheduler execution/infrastructure/random-scheduler
    - "[ ! $CI_COMMIT_TAG ] && docker tag theodolite-random-scheduler $CR_HOST/$CR_ORG/theodolite-random-scheduler:${DOCKER_TAG_NAME}latest"
    - "[ $CI_COMMIT_TAG ] && docker tag theodolite-random-scheduler $CR_HOST/$CR_ORG/theodolite-random-scheduler:$CI_COMMIT_TAG"
    - echo $CR_PW | docker login $CR_HOST -u $CR_USER --password-stdin
    - docker push $CR_HOST/$CR_ORG/theodolite-random-scheduler
    - docker logout
  rules:
    - if: "$CR_HOST && $CR_ORG && $CR_USER && $CR_PW && $CI_COMMIT_TAG"
      when: always
    - changes:
      - execution/infrastructure/random-scheduler/**/*
      if: "$CR_HOST && $CR_ORG && $CR_USER && $CR_PW"
      when: always
    - if: "$CR_HOST && $CR_ORG && $CR_USER && $CR_PW"
      when: manual
      allow_failure: true