From a16a141798f60539eaab506ca8e1c9ad1842d01c Mon Sep 17 00:00:00 2001 From: Syifa Date: Wed, 22 Oct 2025 09:03:42 +0700 Subject: [PATCH] added Jenkinsfile for pipeline gitops workflow --- .gitlab-ci.yml | 147 ------------------------------------------------- Jenkinsfile | 115 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 147 deletions(-) delete mode 100644 .gitlab-ci.yml create mode 100644 Jenkinsfile diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index ac68972..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,147 +0,0 @@ -stages: - - build - - push - - deploy - -variables: - DOCKER_DRIVER: overlay2 - DOCKER_IMAGE_BACKEND: $CI_REGISTRY/$CI_PROJECT_PATH/backend - DOCKER_IMAGE_FRONTEND: $CI_REGISTRY/$CI_PROJECT_PATH/frontend - GITOPS_REPO: "https://gitlab.com/mauuldya/datasiswa-workflow/datasiswa-gitops.git" - -# ========================================== -# 🔧 BEFORE SCRIPT (GLOBAL) -# ========================================== -before_script: - - echo "🔑 Logging in to GitLab Container Registry..." - - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin - -# ========================================== -# 🔹 BUILD BACKEND IMAGE -# ========================================== -build_backend: - stage: build - image: docker:latest - services: - - docker:dind - script: - - echo "🔧 Building backend image..." - - docker build -t "$DOCKER_IMAGE_BACKEND:latest" -t "$DOCKER_IMAGE_BACKEND:$CI_COMMIT_SHORT_SHA" ./backend - only: - - main - -# ========================================== -# 🔹 BUILD FRONTEND IMAGE -# ========================================== -build_frontend: - stage: build - image: docker:latest - services: - - docker:dind - script: - - echo "🔧 Building frontend image..." - - docker build -t "$DOCKER_IMAGE_FRONTEND:latest" -t "$DOCKER_IMAGE_FRONTEND:$CI_COMMIT_SHORT_SHA" ./frontend - only: - - main - -# ========================================== -# 🔹 PUSH BOTH IMAGES -# ========================================== -push_images: - stage: push - image: docker:latest - services: - - docker:dind - needs: - - build_backend - - build_frontend - script: - - echo "🚀 Pushing both images to GitLab Registry..." - - docker push "$DOCKER_IMAGE_BACKEND:latest" - - docker push "$DOCKER_IMAGE_BACKEND:$CI_COMMIT_SHORT_SHA" - - docker push "$DOCKER_IMAGE_FRONTEND:latest" - - docker push "$DOCKER_IMAGE_FRONTEND:$CI_COMMIT_SHORT_SHA" - only: - - main - -# ========================================== -# 🔹 DEPLOY TO DEV (GitOps) -# ========================================== -deploy_dev: - stage: deploy - image: alpine:3.19 - needs: [push_images] - variables: - KUSTOMIZE_PATH: "k8s/overlays/dev" - before_script: - - apk add --no-cache git bash sed - - git config --global user.email "gitlab-ci@example.com" - - git config --global user.name "GitLab CI Bot" - script: - - echo "📦 Cloning GitOps repo..." - - git clone "https://$GITOPS_USERNAME:$GITOPS_TOKEN@gitlab.com/mauuldya/datasiswa-workflow/datasiswa-gitops.git" - - cd datasiswa-gitops - - echo "🛠 Updating DEV image tags..." - - sed -i "s|registry.gitlab.com/.*/backend:.*|$DOCKER_IMAGE_BACKEND:$CI_COMMIT_SHORT_SHA|g" "$KUSTOMIZE_PATH/patch-deployment.yaml" - - sed -i "s|registry.gitlab.com/.*/frontend:.*|$DOCKER_IMAGE_FRONTEND:$CI_COMMIT_SHORT_SHA|g" "$KUSTOMIZE_PATH/patch-deployment.yaml" - - git add . - - git commit -m "🔄 Update DEV images to $CI_COMMIT_SHORT_SHA [skip ci]" || echo "⚠️ No changes to commit" - - git push "https://$GITOPS_USERNAME:$GITOPS_TOKEN@gitlab.com/mauuldya/datasiswa-workflow/datasiswa-gitops.git" dev - environment: - name: dev - only: - - main - -# ========================================== -# 🔹 DEPLOY TO STAGING -# ========================================== -deploy_staging: - stage: deploy - image: alpine:3.19 - variables: - KUSTOMIZE_PATH: "k8s/overlays/staging" - before_script: - - apk add --no-cache git bash sed - - git config --global user.email "gitlab-ci@example.com" - - git config --global user.name "GitLab CI Bot" - script: - - echo "📦 Cloning GitOps repo..." - - git clone "https://$GITOPS_USERNAME:$GITOPS_TOKEN@gitlab.com/mauuldya/datasiswa-workflow/datasiswa-gitops.git" - - cd datasiswa-gitops - - echo "🛠 Updating STAGING image tags..." - - sed -i "s|registry.gitlab.com/.*/backend:.*|$DOCKER_IMAGE_BACKEND:$CI_COMMIT_SHORT_SHA|g" "$KUSTOMIZE_PATH/patch-deployment.yaml" - - sed -i "s|registry.gitlab.com/.*/frontend:.*|$DOCKER_IMAGE_FRONTEND:$CI_COMMIT_SHORT_SHA|g" "$KUSTOMIZE_PATH/patch-deployment.yaml" - - git add . - - git commit -m "🔄 Update STAGING images to $CI_COMMIT_SHORT_SHA [skip ci]" || echo "⚠️ No changes to commit" - - git push "https://$GITOPS_USERNAME:$GITOPS_TOKEN@gitlab.com/mauuldya/datasiswa-workflow/datasiswa-gitops.git" staging - environment: - name: staging - only: - - staging - -# ========================================== -# 🔹 DEPLOY TO PRODUCTION -# ========================================== -deploy_production: - stage: deploy - image: alpine:3.19 - variables: - KUSTOMIZE_PATH: "k8s/overlays/production" - before_script: - - apk add --no-cache git bash sed - - git config --global user.email "gitlab-ci@example.com" - - git config --global user.name "GitLab CI Bot" - script: - - echo "📦 Cloning GitOps repo..." - - git clone "https://$GITOPS_USERNAME:$GITOPS_TOKEN@gitlab.com/mauuldya/datasiswa-workflow/datasiswa-gitops.git" - - cd datasiswa-gitops - - echo "🛠 Updating PRODUCTION image tags..." - - sed -i "s|registry.gitlab.com/.*/backend:.*|$DOCKER_IMAGE_BACKEND:$CI_COMMIT_SHORT_SHA|g" "$KUSTOMIZE_PATH/patch-deployment.yaml" - - sed -i "s|registry.gitlab.com/.*/frontend:.*|$DOCKER_IMAGE_FRONTEND:$CI_COMMIT_SHORT_SHA|g" "$KUSTOMIZE_PATH/patch-deployment.yaml" - - git add . - - git commit -m "🚀 Deploy PRODUCTION $CI_COMMIT_SHORT_SHA [skip ci]" || echo "⚠️ No changes to commit" - - git push "https://$GITOPS_USERNAME:$GITOPS_TOKEN@gitlab.com/mauuldya/datasiswa-workflow/datasiswa-gitops.git" main - environment: - name: production - only: - - production diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..d93be59 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,115 @@ +pipeline { + agent any + + environment { + REGISTRY = "docker.io/syifamaulidya" + BACKEND_NAME = "backend-app" + FRONTEND_NAME = "frontend-app" + GITOPS_REPO = "https://git.winteraccess.id/syifa/datasiswa-gitops.git" + GITOPS_BRANCH = "main" + } + + stages { + + stage('Checkout Source Code') { + steps { + echo "Cloning main app repository..." + checkout scm + } + } + + stage('Build & Push Backend') { + steps { + script { + echo "Building backend image..." + withCredentials([usernamePassword(credentialsId: 'gitops-dockerhub', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) { + sh ''' + docker login -u $DOCKER_USER -p $DOCKER_PASS + cd backend + docker build -t $REGISTRY/$BACKEND_NAME:$BUILD_NUMBER . + docker push $REGISTRY/$BACKEND_NAME:$BUILD_NUMBER + docker tag $REGISTRY/$BACKEND_NAME:$BUILD_NUMBER $REGISTRY/$BACKEND_NAME:latest + docker push $REGISTRY/$BACKEND_NAME:latest + ''' + } + env.BACKEND_TAG = "${REGISTRY}/${BACKEND_NAME}:${BUILD_NUMBER}" + } + } + } + + stage('Build & Push Frontend') { + steps { + script { + echo "Building frontend image..." + withCredentials([usernamePassword(credentialsId: 'gitops-dockerhub', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) { + sh ''' + docker login -u $DOCKER_USER -p $DOCKER_PASS + cd frontend + docker build -t $REGISTRY/$FRONTEND_NAME:$BUILD_NUMBER . + docker push $REGISTRY/$FRONTEND_NAME:$BUILD_NUMBER + docker tag $REGISTRY/$FRONTEND_NAME:$BUILD_NUMBER $REGISTRY/$FRONTEND_NAME:latest + docker push $REGISTRY/$FRONTEND_NAME:latest + ''' + } + env.FRONTEND_TAG = "${REGISTRY}/${FRONTEND_NAME}:${BUILD_NUMBER}" + } + } + } + + stage('Set Environment') { + steps { + script { + if (env.BRANCH_NAME == 'dev') { + env.DEPLOY_OVERLAY = 'overlays/dev' + } else if (env.BRANCH_NAME == 'staging') { + env.DEPLOY_OVERLAY = 'overlays/staging' + } else if (env.BRANCH_NAME == 'production') { + env.DEPLOY_OVERLAY = 'overlays/production' + } else { + error("Branch tidak dikenali! Harus dev / staging / production.") + } + + echo "Environment selected → ${env.DEPLOY_OVERLAY}" + } + } + } + + stage('Update GitOps Repo') { + steps { + script { + echo "Updating manifests in GitOps repo..." + withCredentials([usernamePassword(credentialsId: 'gitea-token-gitops', usernameVariable: 'GITEA_USER', passwordVariable: 'GITEA_PASS')]) { + sh ''' + rm -rf gitops + git -c http.sslVerify=false clone -b $GITOPS_BRANCH https://$GITEA_USER:$GITEA_PASS@git.winteraccess.id/syifa/datasiswa-gitops.git gitops + cd gitops + + # Update tag image backend & frontend + sed -i "s|${REGISTRY}/${BACKEND_NAME}:[^ ]*|${BACKEND_TAG}|g" ${DEPLOY_OVERLAY}/patch-deployment.yaml + sed -i "s|${REGISTRY}/${FRONTEND_NAME}:[^ ]*|${FRONTEND_TAG}|g" ${DEPLOY_OVERLAY}/patch-deployment.yaml + + git config user.name "jenkins" + git config user.email "jenkins@gitea.local" + git add . + git commit -m "Update ${DEPLOY_OVERLAY} → backend:${BUILD_NUMBER}, frontend:${BUILD_NUMBER}" || echo "No changes" + git push origin $GITOPS_BRANCH + ''' + } + } + } + } + } + + post { + success { + echo "Deployment successful to ${DEPLOY_OVERLAY}" + } + failure { + echo "Deployment failed, check logs." + } + always { + cleanWs() + echo "Pipeline finished and workspace cleaned." + } + } +} \ No newline at end of file