-
Notifications
You must be signed in to change notification settings - Fork 0
/
Jenkinsfile
134 lines (134 loc) · 5.61 KB
/
Jenkinsfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
pipeline{
agent any
tools {
terraform 'terraform'
}
environment {
PATH=sh(script:"echo $PATH:/usr/local/bin", returnStdout:true).trim()
AWS_REGION = "us-east-1"
AWS_ACCOUNT_ID=sh(script:'export PATH="$PATH:/usr/local/bin" && aws sts get-caller-identity --query Account --output text', returnStdout:true).trim()
ECR_REGISTRY="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com"
APP_REPO_NAME = "devenes-repo/todo-app"
APP_NAME = "todo"
HOME_FOLDER = "/home/ec2-user"
GIT_FOLDER = sh(script:'echo ${GIT_URL} | sed "s/.*\\///;s/.git$//"', returnStdout:true).trim()
}
stages{
stage("Create Infrastructure for the App"){
steps{
echo 'Creating Terraform Infrastructure for the application on AWS...'
sh 'terraform init'
sh 'terraform apply --auto-approve'
}
}
stage('Create ECR Repo') {
steps {
echo 'Creating ECR Repo for App'
sh """
aws ecr create-repository \
--repository-name ${APP_REPO_NAME} \
--image-scanning-configuration scanOnPush=false \
--image-tag-mutability MUTABLE \
--region ${AWS_REGION}
"""
}
}
stage('Build App Docker Image') {
steps {
echo 'Building App Image'
script {
env.NODE_IP = sh(script: 'terraform output -raw node_public_ip', returnStdout:true).trim()
env.DB_HOST = sh(script: 'terraform output -raw postgre_private_ip', returnStdout:true).trim()
}
sh 'echo ${DB_HOST}'
sh 'echo ${NODE_IP}'
sh 'envsubst < node-env-template > ./nodejs/server/.env'
sh 'cat ./nodejs/server/.env'
sh 'envsubst < react-env-template > ./react/client/.env'
sh 'cat ./react/client/.env'
sh 'docker build --force-rm -t "$ECR_REGISTRY/$APP_REPO_NAME:postgre" -f ./postgresql/Dockerfile .'
sh 'docker build --force-rm -t "$ECR_REGISTRY/$APP_REPO_NAME:nodejs" -f ./nodejs/Dockerfile .'
sh 'docker build --force-rm -t "$ECR_REGISTRY/$APP_REPO_NAME:react" -f ./react/Dockerfile .'
sh 'docker image ls'
}
}
stage('Push Image to ECR Repo') {
steps {
echo 'Pushing App Image to ECR Repo'
sh 'aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin "$ECR_REGISTRY"'
sh 'docker push "$ECR_REGISTRY/$APP_REPO_NAME:postgre"'
sh 'docker push "$ECR_REGISTRY/$APP_REPO_NAME:nodejs"'
sh 'docker push "$ECR_REGISTRY/$APP_REPO_NAME:react"'
}
}
stage('wait the instance') {
steps {
script {
echo 'Waiting for the instance'
id = sh(script: 'aws ec2 describe-instances --filters Name=tag-value,Values=ansible_postgresql Name=instance-state-name,Values=running --query Reservations[*].Instances[*].[InstanceId] --output text', returnStdout:true).trim()
sh 'aws ec2 wait instance-status-ok --instance-ids $id'
}
}
}
stage('Deploy the App') {
steps {
echo 'Deploy the App'
sh 'ls -l'
sh 'ansible --version'
sh 'ansible-inventory --graph'
ansiblePlaybook credentialsId: '<your Jenkins credential ID for SSH to use in Ansible>', disableHostKeyChecking: true, installation: 'ansible', inventory: 'inventory_aws_ec2.yml', playbook: 'docker_project.yml'
}
}
// stage('Test the Infrastructure') {
// steps {
// echo "Testing if the application is ready or not, by checking Public Ip Address of React server using curl"
// script {
// while(true) {
// try {
// react_ip = sh(script: 'terraform output -raw react_ip')
// sh "curl -s --connect-timeout 60 $react_ip"
// echo "Successfully reached the React server"
// break
// }
// catch(Exception) {
// echo 'Could not reach the React server'
// sleep(5)
// }
// }
// }
// }
// }
stage('Destroy the infrastructure'){
steps{
timeout(time:5, unit:'DAYS'){
input message:'Approve terminate'
}
sh """
docker image prune -af
terraform destroy --auto-approve
aws ecr delete-repository \
--repository-name ${APP_REPO_NAME} \
--region ${AWS_REGION} \
--force
"""
}
}
}
post {
always {
echo 'Deleting all local images'
sh 'docker image prune -af'
}
failure {
echo 'Delete the Image Repository on ECR due to the Failure'
sh """
aws ecr delete-repository \
--repository-name ${APP_REPO_NAME} \
--region ${AWS_REGION}\
--force
"""
echo 'Deleting Terraform Stack due to the Failure'
sh 'terraform destroy --auto-approve'
}
}
}