mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 13:31:56 +00:00
Update .gitlab-ci.yml file
This commit is contained in:
+27
-229
@@ -1,237 +1,35 @@
|
|||||||
stages:
|
|
||||||
- build
|
|
||||||
- gitops
|
|
||||||
|
|
||||||
variables:
|
|
||||||
AWS_REGION: ap-southeast-3
|
|
||||||
ECR_REGISTRY: 886436954922.dkr.ecr.ap-southeast-3.amazonaws.com
|
|
||||||
ECR_REPO_NAME: mbugroup/mas-presensi
|
|
||||||
ECR_REPOSITORY: ${ECR_REGISTRY}/${ECR_REPO_NAME}
|
|
||||||
|
|
||||||
DOCKER_HOST: unix:///var/run/docker.sock
|
|
||||||
DOCKER_TLS_CERTDIR: ""
|
|
||||||
DOCKER_BUILDKIT: "1"
|
|
||||||
|
|
||||||
workflow:
|
workflow:
|
||||||
rules:
|
rules:
|
||||||
# run untuk push & MR
|
# MR pipeline
|
||||||
- if: '$CI_PIPELINE_SOURCE == "push"'
|
|
||||||
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
||||||
|
when: always
|
||||||
|
|
||||||
|
# Push pipeline hanya untuk env branch
|
||||||
|
- if: '$CI_COMMIT_BRANCH == "development"'
|
||||||
|
when: always
|
||||||
|
- if: '$CI_COMMIT_BRANCH == "staging"'
|
||||||
|
when: always
|
||||||
|
- if: '$CI_COMMIT_BRANCH == "production"'
|
||||||
|
when: always
|
||||||
|
|
||||||
|
# Selain itu jangan buat pipeline
|
||||||
- when: never
|
- when: never
|
||||||
|
|
||||||
# =========================
|
include:
|
||||||
# Helper: login ECR
|
# khusus MR (notif)
|
||||||
# =========================
|
- local: "ci/merge_request.yml"
|
||||||
.ecr_login: &ecr_login |
|
rules:
|
||||||
AWS_CLI_ENV_ARGS=""
|
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
||||||
AWS_CLI_ENV_ARGS="$AWS_CLI_ENV_ARGS -e AWS_REGION=$AWS_REGION"
|
|
||||||
AWS_CLI_ENV_ARGS="$AWS_CLI_ENV_ARGS -e AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-}"
|
|
||||||
AWS_CLI_ENV_ARGS="$AWS_CLI_ENV_ARGS -e AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-}"
|
|
||||||
if [ -n "${AWS_SESSION_TOKEN:-}" ]; then
|
|
||||||
AWS_CLI_ENV_ARGS="$AWS_CLI_ENV_ARGS -e AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN"
|
|
||||||
fi
|
|
||||||
|
|
||||||
PASS="$(docker run --rm $AWS_CLI_ENV_ARGS public.ecr.aws/aws-cli/aws-cli:latest \
|
# khusus push ke branch env
|
||||||
ecr get-login-password --region "$AWS_REGION" || true)"
|
- local: "ci/development.yml"
|
||||||
if [ -z "$PASS" ]; then
|
rules:
|
||||||
echo "ERROR: Failed to get ECR login password."
|
- if: '$CI_COMMIT_BRANCH == "development"'
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "$PASS" | docker login --username AWS --password-stdin "$ECR_REGISTRY"
|
|
||||||
|
|
||||||
# =========================
|
- local: "ci/staging.yml"
|
||||||
# DEV (push ke development)
|
rules:
|
||||||
# =========================
|
- if: '$CI_COMMIT_BRANCH == "staging"'
|
||||||
build_push_dev:
|
|
||||||
stage: build
|
|
||||||
image: public.ecr.aws/docker/library/docker:27
|
|
||||||
tags: [self-hosted-dev]
|
|
||||||
rules:
|
|
||||||
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "development"'
|
|
||||||
variables:
|
|
||||||
IMAGE_TAG: "dev-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
before_script:
|
|
||||||
- set -eu
|
|
||||||
- docker version
|
|
||||||
- docker info
|
|
||||||
- *ecr_login
|
|
||||||
script: |
|
|
||||||
set -eu
|
|
||||||
echo "Build & push: $ECR_REPOSITORY:$IMAGE_TAG"
|
|
||||||
BASE_IMAGE="${NODE_BASE_IMAGE:-public.ecr.aws/docker/library/node:20-alpine}"
|
|
||||||
|
|
||||||
n=1
|
- local: "ci/production.yml"
|
||||||
until [ "$n" -gt 3 ]; do
|
rules:
|
||||||
docker pull "$BASE_IMAGE" && break
|
- if: '$CI_COMMIT_BRANCH == "production"'
|
||||||
echo "Pull base image failed (attempt $n/3), retrying..."
|
|
||||||
sleep $((n * 10))
|
|
||||||
n=$((n + 1))
|
|
||||||
done
|
|
||||||
[ "$n" -le 3 ] || (echo "ERROR: Failed pulling base image: $BASE_IMAGE" && exit 1)
|
|
||||||
|
|
||||||
docker build \
|
|
||||||
--build-arg NODE_IMAGE="$BASE_IMAGE" \
|
|
||||||
--build-arg NODE_ENV="${NODE_ENV:-dev}" \
|
|
||||||
--build-arg PORT="${PORT:-3000}" \
|
|
||||||
--build-arg NEXT_PUBLIC_API_BASE_URL="${NEXT_PUBLIC_API_BASE_URL:-/api}" \
|
|
||||||
--build-arg DATABASE_URL="${DATABASE_URL:-}" \
|
|
||||||
--build-arg AUTH_JWT_SECRET="${AUTH_JWT_SECRET:-}" \
|
|
||||||
--build-arg NEXT_PUBLIC_POWERSYNC_URL="${NEXT_PUBLIC_POWERSYNC_URL:-}" \
|
|
||||||
--build-arg POWERSYNC_PRIVATE_KEY="${POWERSYNC_PRIVATE_KEY:-}" \
|
|
||||||
--build-arg POWERSYNC_PUBLIC_KEY="${POWERSYNC_PUBLIC_KEY:-}" \
|
|
||||||
-t "$ECR_REPOSITORY:$IMAGE_TAG" \
|
|
||||||
.
|
|
||||||
|
|
||||||
docker push "$ECR_REPOSITORY:$IMAGE_TAG"
|
|
||||||
|
|
||||||
update_gitops_dev_presensi:
|
|
||||||
stage: gitops
|
|
||||||
image: public.ecr.aws/docker/library/alpine:3.20
|
|
||||||
tags: [self-hosted-dev]
|
|
||||||
rules:
|
|
||||||
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "development"'
|
|
||||||
needs: ["build_push_dev"]
|
|
||||||
variables:
|
|
||||||
IMAGE_TAG: "dev-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
GITOPS_BRANCH: main
|
|
||||||
VALUES_FILE: environments/mas-presensi/dev/mas-presensi-values-dev.yaml
|
|
||||||
GITOPS_REPO_URL: https://oauth2:${GITOPS_TOKEN}@gitlab.com/cristian.anggita.parjaman/gitops.git
|
|
||||||
before_script:
|
|
||||||
- set -eu
|
|
||||||
- apk add --no-cache git yq
|
|
||||||
- git config --global user.email "ci@gitlab"
|
|
||||||
- git config --global user.name "gitlab-ci"
|
|
||||||
script: |
|
|
||||||
set -eu
|
|
||||||
rm -rf gitops
|
|
||||||
git clone --depth 1 --branch "$GITOPS_BRANCH" "$GITOPS_REPO_URL" gitops
|
|
||||||
cd gitops
|
|
||||||
|
|
||||||
echo "Updating dev image.tag to $IMAGE_TAG"
|
|
||||||
yq -i '.image.tag = strenv(IMAGE_TAG)' "$VALUES_FILE"
|
|
||||||
|
|
||||||
git add "$VALUES_FILE"
|
|
||||||
if git diff --cached --quiet; then
|
|
||||||
echo "No changes to commit"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
git commit -m "mas-presensi dev deploy ${IMAGE_TAG}"
|
|
||||||
git push origin "$GITOPS_BRANCH"
|
|
||||||
|
|
||||||
# =========================
|
|
||||||
# PROD
|
|
||||||
# 1) MR dev -> prod (merge_request_event, target production) : build optional push
|
|
||||||
# 2) Setelah merge (push ke branch production) : build + push + update gitops
|
|
||||||
# =========================
|
|
||||||
|
|
||||||
# (A) MR pipeline (validate build dari state MR)
|
|
||||||
build_prod_mr:
|
|
||||||
stage: build
|
|
||||||
image: public.ecr.aws/docker/library/docker:27
|
|
||||||
tags: [self-hosted-dev]
|
|
||||||
rules:
|
|
||||||
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "production"'
|
|
||||||
variables:
|
|
||||||
IMAGE_TAG: "prod-mr-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
# kalau mau push juga saat MR, set di project/CI variable: PUSH_IMAGE=true
|
|
||||||
PUSH_IMAGE: "${PUSH_IMAGE:-false}"
|
|
||||||
before_script:
|
|
||||||
- set -eu
|
|
||||||
- docker version
|
|
||||||
- docker info
|
|
||||||
- *ecr_login
|
|
||||||
script: |
|
|
||||||
set -eu
|
|
||||||
echo "Build (MR) : $ECR_REPOSITORY:$IMAGE_TAG"
|
|
||||||
BASE_IMAGE="${NODE_BASE_IMAGE:-public.ecr.aws/docker/library/node:20-alpine}"
|
|
||||||
docker pull "$BASE_IMAGE" || true
|
|
||||||
|
|
||||||
docker build \
|
|
||||||
--build-arg NODE_IMAGE="$BASE_IMAGE" \
|
|
||||||
--build-arg NODE_ENV="${NODE_ENV:-production}" \
|
|
||||||
-t "$ECR_REPOSITORY:$IMAGE_TAG" \
|
|
||||||
.
|
|
||||||
|
|
||||||
if [ "$PUSH_IMAGE" = "true" ]; then
|
|
||||||
echo "Pushing image for MR..."
|
|
||||||
docker push "$ECR_REPOSITORY:$IMAGE_TAG"
|
|
||||||
else
|
|
||||||
echo "Skip push (MR)."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# (B) push ke production (hasil merge) => ini yang “build dari code merge”
|
|
||||||
build_push_prod:
|
|
||||||
stage: build
|
|
||||||
image: public.ecr.aws/docker/library/docker:27
|
|
||||||
tags: [self-hosted-dev]
|
|
||||||
rules:
|
|
||||||
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "production"'
|
|
||||||
variables:
|
|
||||||
IMAGE_TAG: "prod-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
before_script:
|
|
||||||
- set -eu
|
|
||||||
- docker version
|
|
||||||
- docker info
|
|
||||||
- *ecr_login
|
|
||||||
script: |
|
|
||||||
set -eu
|
|
||||||
echo "Build & push (prod): $ECR_REPOSITORY:$IMAGE_TAG"
|
|
||||||
BASE_IMAGE="${NODE_BASE_IMAGE:-public.ecr.aws/docker/library/node:20-alpine}"
|
|
||||||
|
|
||||||
n=1
|
|
||||||
until [ "$n" -gt 3 ]; do
|
|
||||||
docker pull "$BASE_IMAGE" && break
|
|
||||||
echo "Pull base image failed (attempt $n/3), retrying..."
|
|
||||||
sleep $((n * 10))
|
|
||||||
n=$((n + 1))
|
|
||||||
done
|
|
||||||
[ "$n" -le 3 ] || (echo "ERROR: Failed pulling base image: $BASE_IMAGE" && exit 1)
|
|
||||||
|
|
||||||
docker build \
|
|
||||||
--build-arg NODE_IMAGE="$BASE_IMAGE" \
|
|
||||||
--build-arg NODE_ENV="${NODE_ENV:-production}" \
|
|
||||||
--build-arg PORT="${PORT:-3000}" \
|
|
||||||
--build-arg NEXT_PUBLIC_API_BASE_URL="${NEXT_PUBLIC_API_BASE_URL:-/api}" \
|
|
||||||
--build-arg DATABASE_URL="${DATABASE_URL:-}" \
|
|
||||||
--build-arg AUTH_JWT_SECRET="${AUTH_JWT_SECRET:-}" \
|
|
||||||
--build-arg NEXT_PUBLIC_POWERSYNC_URL="${NEXT_PUBLIC_POWERSYNC_URL:-}" \
|
|
||||||
--build-arg POWERSYNC_PRIVATE_KEY="${POWERSYNC_PRIVATE_KEY:-}" \
|
|
||||||
--build-arg POWERSYNC_PUBLIC_KEY="${POWERSYNC_PUBLIC_KEY:-}" \
|
|
||||||
-t "$ECR_REPOSITORY:$IMAGE_TAG" \
|
|
||||||
.
|
|
||||||
|
|
||||||
docker push "$ECR_REPOSITORY:$IMAGE_TAG"
|
|
||||||
|
|
||||||
update_gitops_prod_presensi:
|
|
||||||
stage: gitops
|
|
||||||
image: public.ecr.aws/docker/library/alpine:3.20
|
|
||||||
tags: [self-hosted-dev]
|
|
||||||
rules:
|
|
||||||
- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "production"'
|
|
||||||
needs: ["build_push_prod"]
|
|
||||||
variables:
|
|
||||||
IMAGE_TAG: "prod-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
GITOPS_BRANCH: main
|
|
||||||
VALUES_FILE: environments/mas-presensi/prod/mas-presensi-values-prod.yaml
|
|
||||||
GITOPS_REPO_URL: https://oauth2:${GITOPS_TOKEN}@gitlab.com/cristian.anggita.parjaman/gitops.git
|
|
||||||
before_script:
|
|
||||||
- set -eu
|
|
||||||
- apk add --no-cache git yq
|
|
||||||
- git config --global user.email "ci@gitlab"
|
|
||||||
- git config --global user.name "gitlab-ci"
|
|
||||||
script: |
|
|
||||||
set -eu
|
|
||||||
rm -rf gitops
|
|
||||||
git clone --depth 1 --branch "$GITOPS_BRANCH" "$GITOPS_REPO_URL" gitops
|
|
||||||
cd gitops
|
|
||||||
|
|
||||||
echo "Updating prod image.tag to $IMAGE_TAG"
|
|
||||||
yq -i '.image.tag = strenv(IMAGE_TAG)' "$VALUES_FILE"
|
|
||||||
|
|
||||||
git add "$VALUES_FILE"
|
|
||||||
if git diff --cached --quiet; then
|
|
||||||
echo "No changes to commit"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
git commit -m "mas-presensi prod deploy ${IMAGE_TAG}"
|
|
||||||
git push origin "$GITOPS_BRANCH"
|
|
||||||
|
|||||||
Reference in New Issue
Block a user