added Jenkinsfile for pipeline gitops workflow
This commit is contained in:
parent
6a722626fd
commit
a16a141798
147
.gitlab-ci.yml
147
.gitlab-ci.yml
|
|
@ -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
|
|
||||||
|
|
@ -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."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue