forked from tanem/express-bookshelf-realworld-example-app
-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy path.gitlab-ci.yml
134 lines (127 loc) · 4.44 KB
/
.gitlab-ci.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
stages:
- test
- deploy
- review
default:
image: node:14.17.0-alpine
cache:
key:
files:
- package-lock.json
paths:
- .npm/
before_script:
- npm ci --cache .npm --prefer-offline
.setup_ssh:
before_script:
- 'which ssh-agent || (apk add --update openssh curl bash git)'
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
lint:
stage: test
script:
- npm install
- npm run lint
- npm run check:format
deploy:
extends:
- .setup_ssh
stage: deploy
variables:
REPOSITORY_URL: '[email protected]:ci-cd-workshop1/backend.git'
DEPLOY_BRANCH: $CI_COMMIT_REF_NAME
DEPLOY_DST: '/home/deploy/app/$CI_COMMIT_REF_SLUG'
DB_NAME: $CI_COMMIT_REF_SLUG
script:
- npm i -g pm2
- ssh -q $SSH_USER@$SSH_HOST [[ ! -d "$DEPLOY_DST" ]] && pm2 deploy ecosystem.config.js production setup
- |
ssh -q $SSH_USER@$SSH_HOST <<EOF
echo "DB_NAME=$DB_NAME" > $DEPLOY_DST/.env
echo "DB_USER=$DB_USER" >> $DEPLOY_DST/.env
echo "DB_PASSWORD=$DB_PASSWORD" >> $DEPLOY_DST/.env
echo "SECRET=$SECRET" >> $DEPLOY_DST/.env
EOF
- pm2 deploy ecosystem.config.js production --update-env
environment:
name: production
url: http://$CI_COMMIT_REF_SLUG.$APP_HOST/
rules:
- if: $CI_COMMIT_BRANCH == 'main'
create_review_app:
extends:
- .setup_ssh
stage: review
variables:
REPOSITORY_URL: '[email protected]:ci-cd-workshop1/backend.git'
DEPLOY_DST: '/home/deploy/app/$CI_COMMIT_REF_SLUG'
DEPLOY_BRANCH: $CI_COMMIT_REF_NAME
DB_NAME: $CI_COMMIT_REF_SLUG
BRANCH_EXISTS_URL: 'https://gitlab.com/api/v4/projects/$FRONTEND_PROJECT_ID/repository/branches/$CI_COMMIT_REF_NAME'
CREATE_BRANCH_URL: 'https://gitlab.com/api/v4/projects/$FRONTEND_PROJECT_ID/repository/branches?branch=$CI_COMMIT_REF_NAME&ref=$CI_DEFAULT_BRANCH'
TRIGGER_PIPELINE_URL: 'https://gitlab.com/api/v4/projects/$FRONTEND_PROJECT_ID/pipeline?ref=$CI_COMMIT_REF_NAME'
script:
- npm i -g pm2
- ssh -q $SSH_USER@$SSH_HOST [[ ! -d "$DEPLOY_DST" ]] && pm2 deploy ecosystem.config.js production setup
- |
ssh -q $SSH_USER@$SSH_HOST <<EOF
echo "DB_NAME=$DB_NAME" > $DEPLOY_DST/.env
echo "DB_USER=$DB_USER" >> $DEPLOY_DST/.env
echo "DB_PASSWORD=$DB_PASSWORD" >> $DEPLOY_DST/.env
echo "SECRET=$SECRET" >> $DEPLOY_DST/.env
EOF
- pm2 deploy ecosystem.config.js production --update-env
- ssh -q $SSH_USER@$SSH_HOST "$DEPLOY_DST/current/bin/create-db-copy $DB_PASSWORD $DB_NAME"
- ssh -q $SSH_USER@$SSH_HOST "cd $DEPLOY_DST/current && env DB_NAME=$DB_NAME pm2 start ecosystem.config.js --env production --update-env"
- 'status_code=$(curl -I --header "PRIVATE-TOKEN: $PAT_TOKEN" --write-out "%{http_code}" --silent --output /dev/null "$BRANCH_EXISTS_URL")'
- '[[ "$status_code" -ne 204 ]] && status_code=$(curl -X POST --header "PRIVATE-TOKEN: $PAT_TOKEN" --write-out "%{http_code}" --silent --output /dev/null "$CREATE_BRANCH_URL")'
- '[[ "$status_code" -ne 400 ]] && echo "Branch already exists" && exit 0'
- 'curl -X POST --header "PRIVATE-TOKEN: $PAT_TOKEN" --write-out "%{http_code}" --silent --output /dev/null "$TRIGGER_PIPELINE_URL"'
environment:
name: review/$CI_COMMIT_REF_NAME
url: http://$CI_COMMIT_REF_SLUG.$APP_HOST/
on_stop: stop_review
rules:
- if: '$CI_MERGE_REQUEST_TITLE =~ /SKIP REVIEW/'
when: never
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
stop_review:
stage: review
extends:
- .setup_ssh
environment:
name: review/$CI_COMMIT_REF_NAME
action: stop
variables:
DEPLOY_DST: '/home/deploy/app/$CI_COMMIT_REF_SLUG'
script:
- |
ssh $SSH_USER@$SSH_HOST <<EOF
cd $DEPLOY_DST/current
pm2 delete ecosystem.config.js
EOF
rules:
- if: '$CI_MERGE_REQUEST_TITLE =~ /SKIP REVIEW/'
when: never
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: manual
reset_db:
stage: review
extends:
- .setup_ssh
variables:
DEPLOY_DST: '/home/deploy/app/$CI_COMMIT_REF_SLUG'
DB_NAME: $CI_COMMIT_REF_SLUG
script:
- |
ssh $SSH_USER@$SSH_HOST <<EOF
./$DEPLOY_DST/current/bin/create-db-copy "$DB_PASSWORD" "$DB_NAME"
EOF
rules:
- if: '$CI_MERGE_REQUEST_TITLE =~ /SKIP REVIEW/'
when: never
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: manual