stages: - build - deploy .build_template: &build_template stage: build image: node:20-alpine cache: key: npm-cache paths: - node_modules/ variables: NPM_CONFIG_PRODUCTION: 'false' NODE_ENV: '' script: - echo "Installing dependencies..." - npm ci --no-audit --no-fund - echo "Building Next.js static export..." - npx next build artifacts: name: 'out-$CI_COMMIT_SHORT_SHA' paths: - out/ expire_in: 1 week .deploy_template: &deploy_template stage: deploy image: name: amazon/aws-cli:latest entrypoint: ['/bin/sh', '-c'] script: - set -e - aws --version - echo "Cleaning up newline characters in AWS credentials..." - export AWS_ACCESS_KEY_ID=$(echo $AWS_ACCESS_KEY_ID | tr -d '\r\n') - export AWS_SECRET_ACCESS_KEY=$(echo $AWS_SECRET_ACCESS_KEY | tr -d '\r\n') - echo "Deploying to s3://$S3_BUCKET in region $AWS_REGION" - aws s3api head-bucket --bucket "$S3_BUCKET" --region "$AWS_REGION" || aws s3api create-bucket --bucket "$S3_BUCKET" --region "$AWS_REGION" --create-bucket-configuration LocationConstraint="$AWS_REGION" - aws s3 sync ./out "s3://$S3_BUCKET" --delete --region "$AWS_REGION" --endpoint-url "https://s3.ap-southeast-3.amazonaws.com" # CloudFront invalidation - | STATUS="success" if [ -n "$CLOUDFRONT_DISTRIBUTION_ID" ]; then echo "Invalidating CloudFront cache..." if ! aws cloudfront create-invalidation --distribution-id "$CLOUDFRONT_DISTRIBUTION_ID" --paths "/*"; then echo "CloudFront invalidation failed." STATUS="failed" fi else echo "No CloudFront distribution specified — skipping invalidation" fi # Notifikasi Discord - | RUN_URL="${CI_PROJECT_URL}/-/pipelines/${CI_PIPELINE_ID}" if [ "$CI_COMMIT_BRANCH" = "development" ]; then ENVIRONMENT_NAME="WEB-LTI-DEV" elif [ "$CI_COMMIT_BRANCH" = "master" ]; then ENVIRONMENT_NAME="WEB-LTI-PROD" else ENVIRONMENT_NAME="UNKNOWN" fi if [ "$STATUS" = "success" ]; then COLOR=3066993 TITLE="✅ Deployment ${ENVIRONMENT_NAME} Succeeded" DESC="Deployment job on branch \`${CI_COMMIT_REF_NAME}\` completed successfully." else COLOR=15158332 TITLE="❌ Deployment ${ENVIRONMENT_NAME} Failed" DESC="Deployment job on branch \`${CI_COMMIT_REF_NAME}\` encountered issues." fi jq -n \ --arg title "$TITLE" \ --arg desc "$DESC" \ --arg color "$COLOR" \ --arg repo "$CI_PROJECT_PATH" \ --arg actor "$GITLAB_USER_LOGIN" \ --arg commit "$CI_COMMIT_SHA" \ --arg run_url "$RUN_URL" \ '{ username: "CI Bot - LTI WEB", embeds: [{ title: $title, description: $desc, color: ($color|tonumber), fields: [ {name: "Repository", value: $repo, inline: true}, {name: "Actor", value: $actor, inline: true}, {name: "Commit", value: $commit, inline: false}, {name: "Pipeline", value: ("[Open run](" + $run_url + ")"), inline: false} ] }] }' > payload.json curl -sS -H "Content-Type: application/json" -d @payload.json "$DISCORD_WEBHOOK_URL" # ====== DEVELOPMENT (Branch development) ====== build:dev: <<: *build_template rules: - if: '$CI_COMMIT_BRANCH == "development"' environment: name: development variables: NEXT_PUBLIC_API_BASE_URL: 'https://dev-api-lti.mbugroup.id' NEXT_PUBLIC_SSO_LOGIN_URL: 'https://dev-api-sso.mbugroup.id' deploy:dev: <<: *deploy_template needs: ['build:dev'] rules: - if: '$CI_COMMIT_BRANCH == "development"' variables: S3_BUCKET: 'dev-lti-erp.mbugroup.id' AWS_REGION: 'ap-southeast-3' CLOUDFRONT_DISTRIBUTION_ID: 'E1Z8XTA8XF1GIV' environment: name: development url: https://dev-lti-erp.mbugroup.id # ====== PRODUCTION ====== # build:production: # <<: *build_template # rules: # # pilih salah satu: pakai branch master ATAU pakai tags rilis # - if: '$CI_COMMIT_BRANCH == "master"' # # - if: '$CI_COMMIT_TAG' # kalau mau rilis via tag, uncomment ini dan hapus baris di atas # environment: # name: production # deploy:production: # <<: *deploy_template # needs: ["build:production"] # rules: # - if: '$CI_COMMIT_BRANCH == "master"' # # - if: '$CI_COMMIT_TAG' # selaras dengan rule di build:production # variables: # S3_BUCKET: "lti-erp.mbugroup.id" # CLOUDFRONT_DISTRIBUTION_ID: "ddfd" # environment: # name: production # url: https://royalgoldcapital.com