-
Notifications
You must be signed in to change notification settings - Fork 0
/
Jenkinsfile
155 lines (125 loc) · 5.33 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
135
136
137
138
139
140
141
142
pipeline {
agent any
environment {
PATH=sh(script:"echo $PATH:/usr/local/bin", returnStdout:true).trim()
AWS_REGION = "us-east-1"
ANS_KEYPAIR="jenkins-project"
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 = "techpro-repo/todo-app"
APP_NAME = "todo"
}
stages {
stage('Create Key Pair for Ansible') {
steps {
echo "Creating Key Pair for ${APP_NAME} App"
sh "aws ec2 create-key-pair --region ${AWS_REGION} --key-name ${ANS_KEYPAIR} --query KeyMaterial --output text > ${ANS_KEYPAIR}"
sh "chmod 400 ${ANS_KEYPAIR}"
}
}
stage('Create Infrastructure for the App') {
steps {
echo 'Creating Infrastructure for the App on AWS Cloud'
sh 'terraform init'
sh 'terraform apply --auto-approve'
}
}
stage('Create ECR Repo') {
steps {
echo 'Creating ECR Repo for App'
sh """
aws ecr describe-repositories --region ${AWS_REGION} --repository-name ${APP_REPO_NAME} || \
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()
}
sh 'echo ${NODE_IP}'
sh 'echo "REACT_APP_BASE_URL=http://${NODE_IP}:5000/" > ./react/client/.env'
sh 'cat ./react/client/.env'
sh 'docker build --force-rm -t "$ECR_REGISTRY/$APP_REPO_NAME:postgr" -f ./postgresql/dockerfile-postgresql .'
sh 'docker build --force-rm -t "$ECR_REGISTRY/$APP_REPO_NAME:nodejs" -f ./nodejs/dockerfile-nodejs .'
sh 'docker build --force-rm -t "$ECR_REGISTRY/$APP_REPO_NAME:react" -f ./react/dockerfile-react .'
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:postgr"'
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=jenkins_project 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 -i inventory_aws_ec2.yml --graph'
sh """
export ANSIBLE_PRIVATE_KEY_FILE="${WORKSPACE}/${ANS_KEYPAIR}"
export ANSIBLE_HOST_KEY_CHECKING=False
ansible-playbook -i ./inventory_aws_ec2.yml -e "compose_dir=${env.WORKSPACE}" ./playbook.yml
"""
}
}
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
aws ec2 delete-key-pair --region ${AWS_REGION} --key-name ${ANS_KEYPAIR}
rm -rf ${ANS_KEYPAIR}
"""
}
}
}
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
"""
sh """
aws ec2 delete-key-pair --region ${AWS_REGION} --key-name ${ANS_KEYPAIR}
rm -rf ${ANS_KEYPAIR}
"""
echo 'Deleting Terraform Stack due to the Failure'
sh 'terraform destroy --auto-approve'
}
}
}