pipeline { agent { label 'master' } stages { stage('Pre-Build Stage') { steps { withCredentials([[ $class: 'AmazonWebServicesCredentialsBinding', credentialsId: 'e4e458ba-8178-4cc7-af47-cbd9046e76ce', accessKeyVariable: 'AWS_ACCESS_KEY_ID', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) { sh ''' echo "Setting Environment Variables Stage" export AWS_REGION=${JENKINS_AWS_REGION} aws configure set region ${AWS_REGION} export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) ecrRepo=$(aws cloudformation --region ${AWS_REGION} describe-stack-resources --stack-name CdkStackALBEksBg | jq \'.StackResources[]|select(.ResourceType == "AWS::ECR::Repository").PhysicalResourceId\' | tr -d \'"\') preEcrRepo="${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/" export ECR_REPO_URI=$preEcrRepo$ecrRepo echo $ECR_REPO_URI export kubectlcmd=$(aws cloudformation --region ${AWS_REGION} describe-stacks --stack-name CdkStackALBEksBg | jq \'.Stacks[].Outputs[1].OutputValue\' | tr -d \'"\') kubeClusterName=$(aws cloudformation --region ${AWS_REGION} describe-stacks --stack-name CdkStackALBEksBg | jq \'.Stacks[].Outputs[0].OutputValue\' | tr -d \'"\') export CLUSTER_NAME=$kubeClusterName export ECR_REPO_URI=$ECR_REPO_URI CODEBUILD_RESOLVED_SOURCE_VERSION=01234abcdefgh export TAG=${CODEBUILD_RESOLVED_SOURCE_VERSION} set > ~/.vars cat ~/.vars ''' } } } stage ('Build & Containerize Stage') { steps { withCredentials([[ $class: 'AmazonWebServicesCredentialsBinding', credentialsId: 'e4e458ba-8178-4cc7-af47-cbd9046e76ce', accessKeyVariable: 'AWS_ACCESS_KEY_ID', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) { sh label: '', script: '''echo "===================" echo "Build Stage" echo "===================" echo "++++++++++++++++" source ~/.vars eval $kubectlcmd aws configure set region ${AWS_REGION} echo "++++++++++++++++" pwd ls -al cd amazon-eks-cicd-codebuild-eks-alb-bg/flask-docker-app $(aws ecr get-login --no-include-email) docker build -t $ECR_REPO_URI:$TAG . docker push $ECR_REPO_URI:$TAG ''' } } } stage ('Deploy to Green Env Stage') { steps { withCredentials([[ $class: 'AmazonWebServicesCredentialsBinding', credentialsId: 'e4e458ba-8178-4cc7-af47-cbd9046e76ce', accessKeyVariable: 'AWS_ACCESS_KEY_ID', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) { sh label: '', script: '''echo "===================" echo "Post-Build Stage" echo "===================" echo "++++++++++++++++" source ~/.vars eval $kubectlcmd aws configure set region ${AWS_REGION} echo "++++++++++++++++" kubectl get nodes -n flask-alb kubectl get deploy -n flask-alb kubectl get svc -n flask-alb isDeployed=$(kubectl get deploy -n flask-alb -o json | jq \'.items[0]\') deploy8080=$(kubectl get svc -n flask-alb -o wide | grep 8080: | tr \' \' \'\\n\' | grep app= | sed \'s/app=//g\') if [[ \\"$isDeployed\\" == \\"null\\" ]]; then kubectl apply -f k8s/flaskALBBlue.yaml && kubectl apply -f k8s/flaskALBGreen.yaml; else kubectl set image deployment/$deploy8080 -n flask-alb flask=$ECR_REPO_URI:$TAG; fi kubectl get deploy -n flask-alb kubectl get svc -n flask-alb ''' } } } stage ('Approval & Swap Blue/Green Env Stage') { input { message "Do you want to proceed for production deployment?" } steps { withCredentials([[ $class: 'AmazonWebServicesCredentialsBinding', credentialsId: 'e4e458ba-8178-4cc7-af47-cbd9046e76ce', accessKeyVariable: 'AWS_ACCESS_KEY_ID', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) { sh label: '', script: '''echo "===================" echo "Swap Stage" echo "===================" echo "++++++++++++++++" source ~/.vars eval $kubectlcmd aws configure set region ${AWS_REGION} echo "++++++++++++++++" kubectl get nodes -n flask-alb kubectl get deploy -n flask-alb kubectl get svc -n flask-alb deploy8080=$(kubectl get svc -n flask-alb -o wide | grep ' 8080:' | tr ' ' '\n' | grep app= | sed 's/app=//g') deploy80=$(kubectl get svc -n flask-alb -o wide | grep ' 80:' | tr ' ' '\n' | grep app= | sed 's/app=//g') echo $deploy80 $deploy8080 kubectl patch svc flask-svc-alb-blue -n flask-alb -p '{\"spec\":{\"selector\": {\"app\": \"'$deploy8080'\"}}}' kubectl patch svc flask-svc-alb-green -n flask-alb -p '{\"spec\":{\"selector\": {\"app\": \"'$deploy80'\"}}}' kubectl get deploy -n flask-alb kubectl get svc -n flask-alb ''' } } } } }