-
Notifications
You must be signed in to change notification settings - Fork 0
/
deployment.sh
172 lines (153 loc) · 5.53 KB
/
deployment.sh
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#!/bin/bash
# Default configuration
DOCKER_COMPOSE_DIR="WebpackBabelDockerDeploy"
EXPRESS_DIR="dist"
IP_DOCKER="localhost"
IP_EXPRESS="localhost"
USER="root"
BULD_ENV="prod"
DOCKERHUB_NAME_SPACE="810129"
VERSION="1.0.0"
DOCKER_TAG_SNAPSHOT=$(echo VERSION)-$( git rev-parse --short HEAD)-SNAPSHOT
SSH_KEYPEM_PATH=~/Desktop/ssh-keys-aws/REDHAT-KEYS.pem
SSH_KEYPUB_PATH=~/.ssh/id_rsa.pub
FLAG_FILE=~/.ssh/key_copied_flag
# Display usage help
display_help() {
cat <<EOF
Usage in order:
deployment.sh -m Display this help message.
deployment.sh -u Name of USER to deploy to the host
deployment.sh -i IP of the host to deploy Docker Compose
deployment.sh -s IP of the host to deploy Express server
deployment.sh -d Name of the Docker Compose Directory
deployment.sh -f Name of the Express Directory
deployment.sh -e Choose build environment: 'prod' or 'dev' (default is 'prod')
EOF
exit 0
}
# Parse command-line options
parse_options() {
while getopts ":u:i:s:d:f:e:m" opt; do
case $opt in
d) DOCKER_COMPOSE_DIR="$OPTARG" ;;
f) EXPRESS_DIR="$OPTARG" ;;
i) IP_DOCKER="$OPTARG" ;;
s) IP_EXPRESS="$OPTARG" ;;
u) USER="$OPTARG" ;;
e) BULD_ENV="$OPTARG" ;;
m) display_help ;;
\?) echo "Invalid option: -$OPTARG" >&2; exit 1 ;;
:) echo "Option -$OPTARG requires an argument." >&2; exit 1 ;;
esac
done
}
# Display configuration settings
display_configuration() {
echo "Your Docker Compose working directory is $DOCKER_COMPOSE_DIR"
echo "Your Express working directory is $EXPRESS_DIR"
echo "Your REMOTE DOCKER IP is $IP_DOCKER"
echo "Your REMOTE EXPRESS IP is $IP_EXPRESS"
echo "Your USER is $USER"
echo "Your build environment is $BULD_ENV"
}
# Copy public key to remote servers
copy_public_key() {
if [ ! -e "$FLAG_FILE" ]; then
if [ -f "$SSH_KEYPEM_PATH" ] && [ -f "$SSH_KEYPUB_PATH" ]; then
cat "$SSH_KEYPUB_PATH" | ssh -i "$SSH_KEYPEM_PATH" "$USER@$IP_DOCKER" "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
scp -r "$SSH_KEYPEM_PATH" "$USER@$IP_DOCKER":~/
touch "$FLAG_FILE" # Create flag file to indicate key has been copied
else
echo "Public or Private key not found"
fi
else echo "Flag file already exists"
fi
}
# Delete old versions and clean up Docker containers on Docker Compose host
cleanup_remote_hosts() {
if [ -d "$DOCKER_COMPOSE_DIR" ]; then
rm -Rf "$DOCKER_COMPOSE_DIR" ./"$DOCKER_COMPOSE_DIR.tar.gz"
rm -Rf "$EXPRESS_DIR" ./"$EXPRESS_DIR.tar.gz"
ssh -T "$USER@$IP_DOCKER" <<EOF
rm -Rf ~/PROJECTS/
mkdir ~/PROJECTS/
chmod -R 777 ~/PROJECTS/
docker stop \$(docker ps -a -q)
docker rm -f \$(docker ps -a -q)
sudo docker rmi "$DOCKERHUB_NAME_SPACE/spa-app:$DOCKER_TAG_SNAPSHOT"
IP_EXPRESS='$IP_EXPRESS'
chmod 400 ~/REDHAT-KEYS.pem
ssh -i ~/REDHAT-KEYS.pem $USER@$IP_EXPRESS "
sudo rm -Rf ~/EXPRESS/
mkdir ~/EXPRESS/
chmod -R 777 ~/EXPRESS/
"
EOF
fi
}
# Build and bundle the app based on the build environment
build_and_bundle_app() {
if [ "$BULD_ENV" == "dev" ]; then
npm run build-dev
else
npm run build-prod
fi
docker build -t "$DOCKERHUB_NAME_SPACE/spa-app:$DOCKER_TAG_SNAPSHOT" -f nginx/Dockerfile .
for component in spa-app; do
docker push "$DOCKERHUB_NAME_SPACE/$component:$DOCKER_TAG_SNAPSHOT"
done
}
# Deploy Docker Compose and Express server
deploy_services() {
# Create and copy project directories
mkdir "$DOCKER_COMPOSE_DIR"
cp -r ./nginx "./$DOCKER_COMPOSE_DIR"
cp -r ./docker-compose.yml "./$DOCKER_COMPOSE_DIR"
cp -r ./package.json "./$DOCKER_COMPOSE_DIR"
mkdir "$EXPRESS_DIR"
cp -r ./dist "./$EXPRESS_DIR"
cp -r ./server.js "./$EXPRESS_DIR"
cp -r ./package.json "./$EXPRESS_DIR"
# Compress the working directories
tar -zcvf "$DOCKER_COMPOSE_DIR.tar.gz" "$DOCKER_COMPOSE_DIR"
tar -zcvf "$EXPRESS_DIR.tar.gz" "$EXPRESS_DIR"
# Copy compressed directories to hosts
scp -r ./"$DOCKER_COMPOSE_DIR.tar.gz" "$USER@$IP_DOCKER:~/PROJECTS/"
scp -r ./"$EXPRESS_DIR.tar.gz" "$USER@$IP_DOCKER:~/"
# If the copy is successful
if [ $? -eq 0 ]; then
echo "Copy Folders successful"
ssh -T "$USER@$IP_DOCKER" <<EOF
cd ~/PROJECTS/
tar -xvzf "$DOCKER_COMPOSE_DIR.tar.gz"
cd "$DOCKER_COMPOSE_DIR"
sed -i "s#image: $DOCKERHUB_NAME_SPACE/spa-app:latest#image: $DOCKERHUB_NAME_SPACE/spa-app:$DOCKER_TAG_SNAPSHOT#g" docker-compose.yml
docker compose up -d
IP_EXPRESS='$IP_EXPRESS'
chmod 400 ~/REDHAT-KEYS.pem
scp -i ~/REDHAT-KEYS.pem -r ~/EXPRESS-FOLDER.tar.gz $USER@$IP_EXPRESS:~/EXPRESS/
ssh -T -i ~/REDHAT-KEYS.pem "$USER@$IP_EXPRESS" "
cd ~/EXPRESS/
tar -xvzf "$EXPRESS_DIR.tar.gz"
cd "$EXPRESS_DIR"
sudo npm install
sudo npm install -g pm2
sudo pm2 -f start server.js
"
EOF
else
echo "Deployment failed"
fi
}
# Main function
main() {
parse_options "$@"
display_configuration
copy_public_key
cleanup_remote_hosts
build_and_bundle_app
deploy_services
}
# Run the script
main "$@"