# =============================================================================
# GitLab CI/CD: Docker 빌드 & Registry 푸시
# =============================================================================
# - 2-Tier 아키텍처: WordPress + MySQL
# - 3-Tier 아키텍처: Nginx + FastAPI + MySQL
# - Self-hosted Runner로 빌드 시간 제한 우회
# - 변경된 서비스만 선택적 빌드
# =============================================================================

# =============================================================================
# 스테이지
# =============================================================================
# - build: Docker 이미지 빌드 및 푸시
# =============================================================================
stages:
  - build

# =============================================================================
# 환경 변수
# =============================================================================
# - Docker-in-Docker TLS 보안 설정 (Self-hosted 전용)
# - 2-Tier/3-Tier/Ingress 각 서비스별 이미지 이름 정의
# - Ingress-nginx: Coral, Green, Blue 3개 테마 이미지 환경변수
# =============================================================================
variables:
  DOCKER_TLS_CERTDIR: "/certs"
  DOCKER_HOST: "tcp://docker:2376"
  DOCKER_CERT_PATH: "/certs/client"
  DOCKER_TLS_VERIFY: "1"
  DOCKER_DRIVER: overlay2
  TIER2_MYSQL_IMAGE: $CI_REGISTRY_IMAGE/2tier-mysql
  TIER2_WORDPRESS_IMAGE: $CI_REGISTRY_IMAGE/2tier-wordpress
  TIER3_MYSQL_IMAGE: $CI_REGISTRY_IMAGE/3tier-mysql
  TIER3_NGINX_IMAGE: $CI_REGISTRY_IMAGE/3tier-nginx
  TIER3_FASTAPI_IMAGE: $CI_REGISTRY_IMAGE/3tier-fastapi
  INGRESS_NGINX_1_IMAGE: $CI_REGISTRY_IMAGE/ingress-nginx-1
  INGRESS_NGINX_2_IMAGE: $CI_REGISTRY_IMAGE/ingress-nginx-2
  INGRESS_NGINX_3_IMAGE: $CI_REGISTRY_IMAGE/ingress-nginx-3
  NFS_NGINX_IMAGE: $CI_REGISTRY_IMAGE/nfs-nginx

# =============================================================================
# Job 템플릿
# =============================================================================
# - docker:latest 이미지 사용
# - docker:dind 서비스 (TLS)
# - msi-linux 태그 Runner
# =============================================================================
.default-docker-build:
  stage: build
  image: docker:27.4.0
  tags:
    - msi-linux
  services:
    - name: docker:27.4.0-dind
      alias: docker
  before_script:
    - echo "Waiting for Docker daemon..."
    - sleep 5
    - until docker info >/dev/null 2>&1; do sleep 1; done
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"

# =============================================================================
# 2-Tier 빌드 Jobs
# =============================================================================
# - build-2tier-mysql: MySQL 이미지
# - build-2tier-wordpress: WordPress 이미지
# =============================================================================

build-2tier-mysql:
  extends: .default-docker-build
  script:
    - cd "on-premise-ict/day3-1217/2-tier/mysql"
    - docker build -t "$TIER2_MYSQL_IMAGE:$CI_COMMIT_SHORT_SHA" -t "$TIER2_MYSQL_IMAGE:latest" .
    - docker push "$TIER2_MYSQL_IMAGE:$CI_COMMIT_SHORT_SHA"
    - docker push "$TIER2_MYSQL_IMAGE:latest"
  rules:
    - if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "feat/on-premise-ict"
      changes:
        - "on-premise-ict/day3-1217/2-tier/mysql/**/*"

build-2tier-wordpress:
  extends: .default-docker-build
  script:
    - cd "on-premise-ict/day3-1217/2-tier/wordpress"
    - docker build -t "$TIER2_WORDPRESS_IMAGE:$CI_COMMIT_SHORT_SHA" -t "$TIER2_WORDPRESS_IMAGE:latest" .
    - docker push "$TIER2_WORDPRESS_IMAGE:$CI_COMMIT_SHORT_SHA"
    - docker push "$TIER2_WORDPRESS_IMAGE:latest"
  rules:
    - if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "feat/on-premise-ict"
      changes:
        - "on-premise-ict/day3-1217/2-tier/wordpress/**/*"

# =============================================================================
# 3-Tier 빌드 Jobs
# =============================================================================
# - build-3tier-mysql: MySQL 이미지
# - build-3tier-nginx: Nginx 이미지
# - build-3tier-fastapi: FastAPI 이미지
# =============================================================================

build-3tier-mysql:
  extends: .default-docker-build
  script:
    - cd "on-premise-ict/day3-1217/3-tier/mysql"
    - docker build -t "$TIER3_MYSQL_IMAGE:$CI_COMMIT_SHORT_SHA" -t "$TIER3_MYSQL_IMAGE:latest" .
    - docker push "$TIER3_MYSQL_IMAGE:$CI_COMMIT_SHORT_SHA"
    - docker push "$TIER3_MYSQL_IMAGE:latest"
  rules:
    - if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "feat/on-premise-ict"
      changes:
        - "on-premise-ict/day3-1217/3-tier/mysql/**/*"

build-3tier-nginx:
  extends: .default-docker-build
  script:
    - cd "on-premise-ict/day3-1217/3-tier/nginx"
    - docker build -t "$TIER3_NGINX_IMAGE:$CI_COMMIT_SHORT_SHA" -t "$TIER3_NGINX_IMAGE:latest" .
    - docker push "$TIER3_NGINX_IMAGE:$CI_COMMIT_SHORT_SHA"
    - docker push "$TIER3_NGINX_IMAGE:latest"
  rules:
    - if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "feat/on-premise-ict"
      changes:
        - "on-premise-ict/day3-1217/3-tier/nginx/**/*"

build-3tier-fastapi:
  extends: .default-docker-build
  script:
    - cd "on-premise-ict/day3-1217/3-tier/fastapi"
    - docker build -t "$TIER3_FASTAPI_IMAGE:$CI_COMMIT_SHORT_SHA" -t "$TIER3_FASTAPI_IMAGE:latest" .
    - docker push "$TIER3_FASTAPI_IMAGE:$CI_COMMIT_SHORT_SHA"
    - docker push "$TIER3_FASTAPI_IMAGE:latest"
  rules:
    - if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "feat/on-premise-ict"
      changes:
        - "on-premise-ict/day3-1217/3-tier/fastapi/**/*"


# =============================================================================
# Ingress-nginx 빌드 Jobs
# =============================================================================
# - build-ingress-nginx: 3개 컬러 테마 이미지 동시 빌드 (Matrix)
#   (lightcoral, lightgreen, lightblue 배경색 자동 적용)
# =============================================================================

build-ingress-nginx:
  extends: .default-docker-build
  parallel:
    matrix:
      - {IMAGE_NAME: $INGRESS_NGINX_1_IMAGE, BG_COLOR: "lightcoral"}
      - {IMAGE_NAME: $INGRESS_NGINX_2_IMAGE, BG_COLOR: "lightgreen"}
      - {IMAGE_NAME: $INGRESS_NGINX_3_IMAGE, BG_COLOR: "lightblue"}
  script:
    - |
      cd "on-premise-ict/day4-1218/ingress/nginx"
      # index.html의 배경색을 빌드 아규먼트로 전달받은 색상으로 변경
      sed -i "s/background-color: lightcoral;/background-color: $BG_COLOR;/g" index.html
      docker build -t "$IMAGE_NAME:$CI_COMMIT_SHORT_SHA" -t "$IMAGE_NAME:latest" .
      docker push "$IMAGE_NAME:$CI_COMMIT_SHORT_SHA"
      docker push "$IMAGE_NAME:latest"
  rules:
    - if: '$CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "feat/on-premise-ict"'
      changes:
        - "on-premise-ict/day4-1218/ingress/nginx/**/*"
        - ".gitlab-ci.yml"

# =============================================================================
# nfs-nginx 빌드 Jobs
# =============================================================================
# - build-nfs-nginx: NFS 환경 전용 Nginx 이미지 빌드 (README.md 수정 시 스킵)
# =============================================================================

build-nfs-nginx:
  extends: .default-docker-build
  script:
    - cd "on-premise-ict/day5-1219/nfs/nginx"
    - docker build -t "$NFS_NGINX_IMAGE:$CI_COMMIT_SHORT_SHA" -t "$NFS_NGINX_IMAGE:latest" .
    - docker push "$NFS_NGINX_IMAGE:$CI_COMMIT_SHORT_SHA"
    - docker push "$NFS_NGINX_IMAGE:latest"
  rules:
    # 1. README.md만 수정된 경우에는 빌드를 실행하지 않음 (when: never)
    - if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "feat/on-premise-ict"
      changes:
        - "on-premise-ict/day5-1219/nfs/nginx/README.md"
      when: never

    # 2. 그 외 폴더 내 파일 변경 시 빌드 실행
    - if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "feat/on-premise-ict"
      changes:
        - "on-premise-ict/day5-1219/nfs/nginx/**/*"
