Commit 475bacde authored by Ruslan Konviser's avatar Ruslan Konviser
Browse files

chore: add Jenkinsfile (WIP)

parent 607e5742
Loading
Loading
Loading
Loading

Jenkinsfile

0 → 100644
+180 −0
Original line number Diff line number Diff line
pipeline {
    agent {
        label 'docker'
    }

    environment {
        DOCKER_BUILDKIT = 1 // Experimental faster build system
        REPO_NAME = "ever"
        IMAGE_CORE_API = "ever-core"
        IMAGE_ADMIN_WEB_ANGULAR = "ever-admin-web-angular"
        GITHUB_DOCKER_USERNAME = credentials('github-docker-username')
        GITHUB_DOCKER_PASSWORD = credentials('github-docker-password')
        GITHUB_DOCKER_REPO = "docker.pkg.github.com/ever-co/ever"
        GITHUB_DISPATCH_TOKEN = credentials('github-dispatch-token')
        GITHUB_TOKEN = credentials('github-token')
        CI_URL = "ci.ever.co"
        AWS_ACCESS_KEY_ID = credentials('aws-access-key')
        AWS_SECRET_ACCESS_KEY = credentials('aws-secret-key')
        AWS_DEFAULT_REGION = "us-east-1"
        AWS_ECR_REPO = """${sh(
            script: "aws ecr get-login --no-include-email --region ${env.AWS_DEFAULT_REGION} | grep -o 'https://.*' | sed -e 's|https://||g' | tr -d '\n'",
            returnStdout: true
        )}"""
        AWS_ECR_PASSWORD = """${sh(
            script: "aws ecr get-login-password --region ${env.AWS_DEFAULT_REGION}",
            returnStdout: true
        )}"""
        WORKFLOW_ID = """${sh(
            script: "curl --silent -X GET -H 'Accept: application/vnd.github.v3+json' https://api.github.com/repos/ever-co/$REPO_NAME-pulumi/actions/workflows/pulumi.yml | tr -s ' ' | tr -d '\r' | tr -d '\n' | grep -Eo '[0-9]{5,9}' | uniq",
            returnStdout: true
        )}"""
    }

    stages {
        stage("Clone") {
            steps{
                git branch: 'develop',
                    url: 'https://github.com/ever-co/ever.git'
                
                sh """
                    curl 'https://api.github.com/repos/ever-co/${REPO_NAME}/statuses/$GIT_COMMIT' -H 'Authorization: token ${GITHUB_TOKEN}' -H 'Content-Type: application/json' -X POST -d '{"state": "pending", "context": "Jenkins", "description": "Jenkins pipeline is running", "target_url": "https://$CI_URL/job/${JOB_NAME}/$BUILD_NUMBER/console"}'
                """
            }
            post {
                success {
                    echo "Cloning successful..."
                }
                failure {
                    echo "Cloning failed! See log for details. Terminating..."
                }
            }
        }
        stage("Docker Image Build") {
            parallel {
                stage("Core API Image") {
                    steps {
                        sh "docker build -t ${env.IMAGE_CORE_API} -f .deploy/core/Dockerfile ."
                    }
                    post{
                        success {
                            echo "Image for Core API built!"
                        }
                        failure {
                            echo "Core API Image build failed..."
                        }
                    }
                }
                stage("Admin Web Angular Image") {
                    steps {
                        sh "docker build -t ${env.IMAGE_ADMIN_WEB_ANGULAR} -f .deploy/admin-web-angular/Dockerfile ."
                    }
                    post {
                        success {
                            echo "Image for Admin Web Angular built!"
                        }
                        failure {
                            echo "Admin Web Angular image build failed..."
                        }
                    }
                }
            }
        }
        stage("Login to repositories") {
            steps {
                sh "docker login docker.pkg.github.com -u ${GITHUB_DOCKER_USERNAME} -p ${GITHUB_DOCKER_PASSWORD}"
                sh "docker login ${AWS_ECR_REPO} -u AWS -p ${AWS_ECR_PASSWORD}" // Login to AWS ECR
            }
        }
        stage ("Push To AWS ECR") {
            parallel {
                stage ("Core API Image") {
                    steps {
                        // Tag and push to ECR
                        sh "docker tag ${IMAGE_CORE_API} ${AWS_ECR_REPO}/${IMAGE_CORE_API}"
                        sh "docker push ${AWS_ECR_REPO}/${IMAGE_CORE_API}"
                        sh "docker rmi ${AWS_ECR_REPO}/${IMAGE_CORE_API}" // Cleans tag
                    }
                    post {
                        success {
                            echo "Successfuly pushed to ECR on build ${env.BUILD_ID}!"
                        }
                        failure {
                            echo "Push to ECR failed! See log for details..."
                        }
                    }
                }
                stage ("Admin Web Angular Image") {
                    steps {
                        sh "docker tag ${IMAGE_ADMIN_WEB_ANGULAR} ${AWS_ECR_REPO}/${IMAGE_ADMIN_WEB_ANGULAR}"
                        sh "docker push ${AWS_ECR_REPO}/${IMAGE_ADMIN_WEB_ANGULAR}"
                        sh "docker rmi ${AWS_ECR_REPO}/${IMAGE_ADMIN_WEB_ANGULAR}" // Cleans tag
                    }
                    post {
                        success {
                            echo "Successfully pushed to ECR on build ${env.BUILD_ID}!"
                        }
                        failure {
                            echo "Push to ECR failed! See log for details..."
                        }
                    }
                }
            }
        }
        stage ("Push to GitHub") {
            parallel {
                stage ("Core API Image") {
                    steps {
                        sh "docker tag ${IMAGE_CORE_API} ${GITHUB_DOCKER_REPO}/${IMAGE_CORE_API}"
                        sh "docker push ${GITHUB_DOCKER_REPO}/${IMAGE_CORE_API}"
                        sh "docker rmi ${GITHUB_DOCKER_REPO}/${IMAGE_CORE_API}"
                    }
                    post {
                        success {
                            echo "Successfully pushed to GitHub on build ${env.BUILD_ID}!"
                        }
                        failure {
                            echo "Push to GitHub failed! See log for details..."
                        }
                    }
                }
                stage ("Admin Web Angular Image") {
                    steps {
                        sh "docker tag ${IMAGE_CORE_API} ${GITHUB_DOCKER_REPO}/${IMAGE_CORE_API}"
                        sh "docker push ${GITHUB_DOCKER_REPO}/${IMAGE_CORE_API}"
                        sh "docker rmi ${GITHUB_DOCKER_REPO}/${IMAGE_CORE_API}"
                    }
                    post {
                        success {
                            echo "Successfully pushed to GitHub on build ${env.BUILD_ID}!"
                        }
                        failure {
                            echo "Push to GitHub failed! See log for details..."
                        }
                    }
                }
            }
        }
        stage ("Pulumi Update") {
            steps {
                sh """
                    curl -sX POST 'https://api.github.com/repos/ever-co/${REPO_NAME}-pulumi/actions/workflows/2319005/dispatches' -H 'Accept: application/vnd.github.v3+json' -H 'Authorization: token ${GITHUB_DISPATCH_TOKEN}' -d '{"ref": "master"}'
                """
            }
        }
    }
    post {
        success {
            echo "Ever CI/CD pipeline executed successfully!"
            sh """
                curl 'https://api.github.com/repos/ever-co/${REPO_NAME}/statuses/$GIT_COMMIT' -H 'Authorization: token ${GITHUB_TOKEN}' -H 'Content-Type: application/json' -X POST -d '{"state": "success", "context": "Jenkins", "description": "Jenkins pipeline succeeded", "target_url": "https://$CI_URL/job/${JOB_NAME}/$BUILD_NUMBER/console"}'
            """
		}
        failure {
            echo "Ever CI/CD pipeline failed..."
			sh """
                curl 'https://api.github.com/repos/ever-co/${REPO_NAME}/statuses/$GIT_COMMIT' -H 'Authorization: token ${GITHUB_TOKEN}' -H 'Content-Type: application/json' -X POST -d '{"state": "failure", "context": "Jenkins", "description": "Jenkins pipeline failed", "target_url": "https://$CI_URL/job/${JOB_NAME}/$BUILD_NUMBER/console"}'
            """
        }
    }
}
 No newline at end of file