-
Notifications
You must be signed in to change notification settings - Fork 168
190 lines (174 loc) · 7.86 KB
/
create_destroy_test_vm.yaml
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
name: Create/Destroy Test VM
on:
pull_request:
types: [opened, reopened, synchronize, labeled, unlabeled, closed]
jobs:
create_test_vm:
if: |
(
(
github.event.action == 'opened' ||
github.event.action == 'reopened' ||
github.event.action == 'synchronize'
) && contains(github.event.pull_request.labels.*.name, 'create-test-vm')
) ||
(
github.event.action == 'labeled' &&
github.event.label.name == 'create-test-vm'
)
runs-on: ubuntu-latest
steps:
- name: Checkout files
uses: actions/checkout@v2
- name: Install doctl
uses: digitalocean/action-doctl@v2
with:
token: ${{ secrets.DO_ACCESS_TOKEN }}
- name: Create new droplet and DNS records
run: |
NEW_DROPLET_NAME=zubhub-test-${{ github.event.pull_request.number }}
echo "NEW_DROPLET_NAME=$NEW_DROPLET_NAME" >> $GITHUB_ENV
# check if droplet already exists and exit script if it does
NEW_DROPLET_IP=$(doctl compute droplet get $NEW_DROPLET_NAME \
--format PublicIPv4 --no-header 2>/dev/null || true)
if [ -n "$NEW_DROPLET_IP" ] ; then
echo "Droplet already exists. Save droplet IP to env variable and exit..."
echo "NEW_DROPLET_IP=$NEW_DROPLET_IP" >> $GITHUB_ENV
exit 0
fi
# create new droplet
doctl compute droplet create $NEW_DROPLET_NAME --image \
${{ secrets.SOURCE_SNAPSHOT_ID }} --tag-name zubhub-test --size s-1vcpu-2gb \
--region nyc1 --enable-monitoring --ssh-keys ${{ secrets.DO_PUBLIC_SSHKEY_FP_TEMP }} --wait
# --region nyc1 --enable-monitoring --ssh-keys ${{ secrets.DO_PUBLIC_SSHKEY_FP }} --wait
sleep 30s
NEW_DROPLET_IP=$(doctl compute droplet get $NEW_DROPLET_NAME \
--format PublicIPv4 --no-header)
echo "NEW_DROPLET_IP=$NEW_DROPLET_IP" >> $GITHUB_ENV
# we only need records for frontend, media server and api server
FRONTEND_DOMAIN=${NEW_DROPLET_NAME}.unstructured.studio
API_DOMAIN=api.${FRONTEND_DOMAIN}
MEDIA_DOMAIN=media.${FRONTEND_DOMAIN}
echo "FRONTEND_DOMAIN=$FRONTEND_DOMAIN" >> $GITHUB_ENV
echo "API_DOMAIN=$API_DOMAIN" >> $GITHUB_ENV
echo "MEDIA_DOMAIN=$MEDIA_DOMAIN" >> $GITHUB_ENV
doctl compute domain records create unstructured.studio --record-type A --record-name \
$FRONTEND_DOMAIN --record-data $NEW_DROPLET_IP --record-ttl 60
doctl compute domain records create unstructured.studio --record-type A --record-name \
$API_DOMAIN --record-data $NEW_DROPLET_IP --record-ttl 60
doctl compute domain records create unstructured.studio --record-type A --record-name \
$MEDIA_DOMAIN --record-data $NEW_DROPLET_IP --record-ttl 60
- name: Copy file via scp
uses: appleboy/scp-action@master
with:
host: ${{env.NEW_DROPLET_IP}}
username: ${{ secrets.DO_BACKEND_USERNAME }}
key: ${{ secrets.DO_SSHKEY }}
source: "."
target: "/home/zubhub"
- name: Executing remote command
uses: appleboy/ssh-action@master
with:
host: ${{env.NEW_DROPLET_IP}}
username: ${{ secrets.DO_BACKEND_USERNAME }}
key: ${{ secrets.DO_SSHKEY }}
script: |
echo "========== env.frontend_domain: ${{env.FRONTEND_DOMAIN}}"
echo "========== env.api_domain: ${{env.API_DOMAIN}}"
echo "========== env.media_domain: ${{env.MEDIA_DOMAIN}}"
echo "========== frontend_domain: $FRONTEND_DOMAIN"
echo "========== api_domain: $API_DOMAIN"
echo "========== media_domain: $MEDIA_DOMAIN"
echo "========== {frontend_domain}: ${FRONTEND_DOMAIN}"
echo "========== {api_domain}: ${API_DOMAIN}"
echo "========== {media_domain}: ${MEDIA_DOMAIN}"
echo "========== env.new_droplet_ip: ${{env.NEW_DROPLET_IP}}"
echo "========== new_droplet_ip: $NEW_DROPLET_IP"
echo "========== {new_droplet_ip}: ${NEW_DROPLET_IP}"
# create env file for backend
cat << EOF > /home/zubhub_backend/.env
ENVIRONMENT=production
DEFAULT_FRONTEND_DOMAIN=$FRONTEND_DOMAIN
DEFAULT_BACKEND_DOMAIN=$API_DOMAIN
DEFAULT_DISPLAY_NAME=ZubHub
DEFAULT_FRONTEND_PROTOCOL=https
DEFAULT_BACKEND_PROTOCOL=https
SECRET_KEY=random string
DEBUG=1
STORE_MEDIA_LOCALLY=1
MEDIA_SECRET=random string
DEFAULT_MEDIA_SERVER_PROTOCOL=https
DEFAULT_MEDIA_SERVER_DOMAIN=$MEDIA_DOMAIN
POSTGRES_NAME=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_HOST=db
GF_ADMIN_USER=admin
GF_ADMIN_PASSWORD=admin
RABBITMQ_DEFAULT_USER=admin
RABBITMQ_DEFAULT_PASS=admin
CELERY_BROKER=amqp://admin:admin@rabbitmq:5672/
CELERY_BACKEND=django-db
CELERY_FLOWER_USER=admin
CELERY_FLOWER_PASSWORD=admin
PROXY_COUNT=0
DETECT_MISCONFIG=0
SUPERUSER_PASSWORD=dummy_password
EOF
# create env file for frontend
cat << EOF > /home/zubhub_frontend/zubhub/.env
GENERATE_SOURCEMAP=false
REACT_APP_NODE_ENV=production
REACT_APP_BACKEND_DEVELOPMENT_URL=
REACT_APP_BACKEND_PRODUCTION_URL=https://${API_DOMAIN}
REACT_APP_DOSPACE_ACCESS_KEY_ID=
REACT_APP_DOSPACE_ACCESS_SECRET_KEY=
REACT_APP_VIDEO_UPLOAD_URL=
REACT_APP_VIDEO_FOLDER_NAME=videos
REACT_APP_DEV_VIDEO_FOLDER_NAME=dev_videos
REACT_APP_VIDEO_UPLOAD_PRESET_NAME=video_upload_preset
REACT_APP_DEV_VIDEO_UPLOAD_PRESET_NAME=dev_video_upload_preset
EOF
# deploy project
cd /home/zubhub
sudo bash /home/zubhub/deploy_unscalable_fullstack.sh
destroy_test_vm:
if: |
github.event.action == 'closed' || (
github.event.action == 'unlabeled' && github.event.label.name == 'create-test-vm'
)
runs-on: ubuntu-latest
steps:
- name: Install doctl
uses: digitalocean/action-doctl@v2
with:
token: ${{ secrets.DO_ACCESS_TOKEN }}
- name: Get pr number
run: |
# for events like unlabelled, github.event.pull_request.number is available
if [ -n ${{ github.event.pull_request.number }} ] ; then
echo "PR_NUMBER=${{ github.event.pull_request.number }}" >> $GITHUB_ENV
exit 1
fi
# github.event.pull_request.number is not available in closed event
sudo apt-get install jq -y
PR_NUMBER=$(curl --silent --show-error -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
https://api.github.com/repos/${{ github.repository }}/commits/${{ github.sha }}/pulls | \
jq -r '.[0].number')
echo "PR_NUMBER=$(($PR_NUMBER))" >> $GITHUB_ENV
- name: Delete test droplet
run: |
NEW_DROPLET_NAME=zubhub-test-${{env.PR_NUMBER}}
echo "NEW_DROPLET_NAME=$NEW_DROPLET_NAME" >> $GITHUB_ENV
doctl compute droplet delete $NEW_DROPLET_NAME --force
- name: delete DNS records
run: |
FRONTEND_DOMAIN=${NEW_DROPLET_NAME}.unstructured.studio
API_DOMAIN=api.${FRONTEND_DOMAIN}
MEDIA_DOMAIN=media.${FRONTEND_DOMAIN}
doctl compute domain records delete unstructured.studio --record-name \
$FRONTEND_DOMAIN
doctl compute domain records delete unstructured.studio --record-name \
$API_DOMAIN
doctl compute domain records delete unstructured.studio --record-name \
$MEDIA_DOMAIN