-
Notifications
You must be signed in to change notification settings - Fork 53
139 lines (115 loc) Β· 5.13 KB
/
prod.yml
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
name: CI-prod
on:
push:
branches:
- main
env:
REGISTRY: "registry.digitalocean.com/sandbox-registry"
API_IMAGE: "courses-backend"
NGINX_IMAGE: "courses-backend-proxy"
TAG: "stable"
TEST_CONTAINER_NAME: "test_db"
TEST_DB_NAME: "test"
TEST_DB_URI: "mongodb://localhost:27019"
APP_ENV: "prod"
jobs:
tests:
runs-on: ubuntu-latest
steps:
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: 1.17
- name: Checkout code
uses: actions/checkout@v2
- name: Unit Tests
run: go test --short ./...
- name: Create test db container
run: docker run --rm -d -p 27019:27017 --name $(echo $TEST_CONTAINER_NAME) -e MONGODB_DATABASE=$(echo $TEST_DB_NAME) mongo:4.4-bionic
- name: Integration Tests
run: GIN_MODE=release go test -v ./tests/
- name: Kill test db container
run: docker stop $(echo $TEST_CONTAINER_NAME)
build_and_push:
runs-on: ubuntu-latest
needs: tests
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Build API container image
run: docker build -f deploy/Dockerfile -t $(echo $REGISTRY)/$(echo $API_IMAGE):$(echo $TAG) .
- name: Build NGINX container image
run: docker build -f deploy/nginx/Dockerfile -t $(echo $REGISTRY)/$(echo $NGINX_IMAGE):$(echo $TAG) .
- name: Install doctl
uses: digitalocean/action-doctl@v2
with:
token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}
- name: Log in to DigitalOcean Container Registry with short-lived credentials
run: doctl registry login --expiry-seconds 600
- name: Push API image to DigitalOcean Container Registry
run: docker push $(echo $REGISTRY)/$(echo $API_IMAGE):$(echo $TAG)
- name: Push NGINX image to DigitalOcean Container Registry
run: docker push $(echo $REGISTRY)/$(echo $NGINX_IMAGE):$(echo $TAG)
deploy:
environment: production
runs-on: ubuntu-latest
needs: build_and_push
steps:
- uses: actions/checkout@master
- name: copy file via ssh password
uses: appleboy/scp-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSHKEY }}
source: "deploy/,!deploy/nginx,!deploy/Dockerfile"
target: "api"
strip_components: 1
- name: Deploy to Digital Ocean droplet via SSH action
uses: appleboy/[email protected]
env:
SERVER_NAME: "api-prod.creatly.me"
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSHKEY }}
envs: API_IMAGE,NGINX_IMAGE,TAG,REGISTRY,SERVER_NAME,APP_ENV
script: |
# Set env variables
export MONGO_URI="${{ secrets.MONGO_URI }}"
export MONGO_USER="${{ secrets.MONGO_USER }}"
export MONGO_PASS="${{ secrets.MONGO_PASS }}"
export PASSWORD_SALT="${{ secrets.PASSWORD_SALT }}"
export JWT_SIGNING_KEY="${{ secrets.JWT_SIGNING_KEY }}"
export SENDPULSE_LISTID="${{ secrets.SENDPULSE_LISTID }}"
export SENDPULSE_ID="${{ secrets.SENDPULSE_ID }}"
export SENDPULSE_SECRET="${{ secrets.SENDPULSE_SECRET }}"
export HTTP_HOST="${{secrets.HTTP_HOST}}"
export FONDY_MERCHANT_ID=${{secrets.FONDY_MERCHANT_ID}}
export FONDY_MERCHANT_PASS=${{secrets.FONDY_MERCHANT_PASS}}
export PAYMENT_CALLBACK_URL=${{secrets.PAYMENT_CALLBACK_URL}}
export PAYMENT_REDIRECT_URL=${{secrets.PAYMENT_REDIRECT_URL}}
export FRONTEND_URL=${{secrets.FRONTEND_URL}}
export SMTP_PASSWORD=${{secrets.SMTP_PASSWORD}}
export SERVER_NAME=$(echo $SERVER_NAME)
export REGISTRY=$(echo $REGISTRY)
export API_IMAGE=$(echo $API_IMAGE)
export NGINX_IMAGE=$(echo $NGINX_IMAGE)
export TAG=$(echo $TAG)
export APP_ENV=$(echo $APP_ENV)
export STORAGE_ENDPOINT=${{secrets.STORAGE_ENDPOINT}}
export STORAGE_BUCKET=${{secrets.STORAGE_BUCKET}}
export STORAGE_ACCESS_KEY=${{secrets.STORAGE_ACCESS_KEY}}
export STORAGE_SECRET_KEY="${{secrets.STORAGE_SECRET_KEY}}"
export CLOUDFLARE_API_KEY=${{secrets.CLOUDFLARE_API_KEY}}
export CLOUDFLARE_EMAIL=${{secrets.CLOUDFLARE_EMAIL}}
export CLOUDFLARE_ZONE_EMAIL=${{secrets.CLOUDFLARE_ZONE_EMAIL}}
export CLOUDFLARE_CNAME_TARGET=${{secrets.CLOUDFLARE_CNAME_TARGET}}
# Login into Digital Ocean Registry
docker login -u ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} -p ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} $(echo $REGISTRY)
# Run a new container from a new image
cd api
docker-compose stop
docker-compose rm -f
docker-compose pull
docker-compose up -d --force-recreate nginx