pipeline { agent any triggers { githubPush() // This will trigger the pipeline when a new commit is pushed to the 'main' branch. } environment { // Define your AWS environment variables here ECR_REPO_NAME='arsit-ecr-repo' ECS_CLUSTER_NAME='arsit-ecs-cluster' ECS_SERVICE_NAME='arsit-ecs-service' ECS_TASK_DEFINITION='arsit-ecs-task' AWS_REGION='eu-west-2' // Define Linux folder paths for your terraform and applications codes JENKINS_WORKSPACE_FOR_TERRAFORMCODES='terraform' TERRAFORM_WORKSPACE='/var/lib/jenkins/workspace/iaas/terraform' // Define Docker image name and version DOCKERIMAGE_NAME='pythonapp' DOCKERIMAGE_TAG_VERSION='latest' DOCKERIMAGE_ID = '' } stages { stage('Checkout') { steps { script { // Checkout the code from GitHub checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'b66dea26-cddc-4ad5-bc33-15595ceebe9f', url: 'https://github.com/semiharsan/pythondemoapp.git']]) } } } stage('Create ECR Repository') { steps { script { withCredentials([[ $class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY', credentialsId: 'jenkins' ]]) { sh ''' set +e [ -d $JENKINS_WORKSPACE_FOR_TERRAFORMCODES ] && { echo "There is a $JENKINS_WORKSPACE_FOR_TERRAFORMCODES repository here. Let us remove it first" rm -rf $JENKINS_WORKSPACE_FOR_TERRAFORMCODES echo "$JENKINS_WORKSPACE_FOR_TERRAFORMCODES folder removed successfully. Let us download again with the latest version" git clone https://github.com/semiharsan/terraform.git cp -ar $JENKINS_WORKSPACE_FOR_TERRAFORMCODES/* $TERRAFORM_WORKSPACE chown -R jenkins:jenkins $TERRAFORM_WORKSPACE } || { echo "$JENKINS_WORKSPACE_FOR_TERRAFORMCODES folder not found. Let us download it from Git" git clone https://github.com/semiharsan/terraform.git cp -ar $JENKINS_WORKSPACE_FOR_TERRAFORMCODES/* $TERRAFORM_WORKSPACE chown -R jenkins:jenkins $TERRAFORM_WORKSPACE rm -rf $JENKINS_WORKSPACE_FOR_TERRAFORMCODES } set +e if ecrname=$(aws ecr describe-repositories --repository-names $ECR_REPO_NAME --query 'repositories[0].repositoryUri' --output text) > /dev/null 2>&1; then echo "There is an ECR repository with $ecrname name, so let us go to docker build step." else cd $TERRAFORM_WORKSPACE/AWS/ECR terraform init terraform apply -auto-approve fi ''' } } } } stage('Create ECS') { steps { script { sh ''' status=$(aws ecs describe-clusters --clusters $ECS_CLUSTER_NAME --query 'clusters[0].status' --output text) if [ "$status" = "ACTIVE" -o -z "$status" ]; then echo "Cluster is ACTIVE. Let us go to the Docker stage" else echo "Cluster is INACTIVE or None. Let us create it" cd $TERRAFORM_WORKSPACE/AWS/ECS terraform init terraform apply -auto-approve fi ''' } } } stage('Docker Build And Deploy To ECS') { steps { script { sh ''' ecrurl=$(aws ecr describe-repositories --repository-names $ECR_REPO_NAME --query 'repositories[0].repositoryUri' --output text) ecrid=$(aws ecr describe-repositories --repository-names $ECR_REPO_NAME --query 'repositories[0].registryId' --output text) DOCKERIMAGE_ID=$(docker images -q "$DOCKERIMAGE_NAME:$DOCKERIMAGE_TAG_VERSION") if [ -z "$DOCKERIMAGE_ID" ]; then echo "Docker image '$DOCKERIMAGE_NAME' not found. Let us create it" else echo "There is a cocker image with id $DOCKERIMAGE_ID, let us remove it first" docker rmi -f $DOCKERIMAGE_ID fi docker build -t $DOCKERIMAGE_NAME:$DOCKERIMAGE_TAG_VERSION . aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ecrid.dkr.ecr.$AWS_REGION.amazonaws.com docker tag $DOCKERIMAGE_NAME:$DOCKERIMAGE_TAG_VERSION $ecrurl:$DOCKERIMAGE_NAME docker push $ecrurl:$DOCKERIMAGE_NAME aws ecs update-service --cluster $ECS_CLUSTER_NAME --service $ECS_SERVICE_NAME --task-definition $ECS_TASK_DEFINITION --force-new-deployment ''' } } } } }