Skip to content

Commit d4be8f4

Browse files
author
Niclas Forsman
authored
Merge pull request #88 from TKOaly/deployment
Deployment
2 parents 65cb9da + 1fa9e4f commit d4be8f4

10 files changed

+76
-59
lines changed

.travis.yml

+27-34
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,37 @@
11
dist: trusty
22
sudo: required
3-
language: generic
43

5-
addons:
6-
apt:
7-
packages:
8-
- docker-ce
4+
branches:
5+
only:
6+
- master
7+
8+
services:
9+
- docker
10+
11+
before_install:
12+
- pip install --user awscli
13+
- export PATH=$PATH:$HOME/.local/bin
14+
15+
install:
16+
- curl -sLo /tmp/terraform.zip https://releases.hashicorp.com/terraform/0.12.28/terraform_0.12.28_linux_amd64.zip
17+
- unzip /tmp/terraform.zip -d /tmp
18+
- mv /tmp/terraform ~/bin
19+
- export PATH="~/bin:$PATH"
20+
21+
before_script:
22+
- terraform init "./deploy"
923

1024
jobs:
1125
include:
12-
- stage: test
13-
env:
14-
- DOCKER_COMPOSE_VERSION=1.22.0
15-
before_install:
16-
- sudo rm /usr/local/bin/docker-compose
17-
- curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
18-
- chmod +x docker-compose
19-
- sudo mv docker-compose /usr/local/bin
20-
- docker --version
21-
- docker-compose --version
22-
install:
23-
- docker-compose build
24-
- docker-compose up -d mysql
25-
- sleep 5
26-
- docker-compose run web yarn db:init
27-
after_script:
28-
- docker-compose down
29-
after_success:
30-
- codecov
31-
script:
32-
- docker-compose run web yarn lint
33-
- docker-compose run web yarn test
26+
- stage: build_push
27+
script: bash ./build_and_push_ecr.sh
28+
- stage: plan
29+
script: bash ./deploy/scripts/terraform_plan.sh $TRAVIS_BUILD_NUMBER
3430
- stage: deploy
35-
script: skip
36-
deploy:
37-
provider: script
38-
script: bash ./deploy-container.sh
39-
skip_cleanup: true
31+
script: bash ./deploy/scripts/terraform_apply.sh $TRAVIS_BUILD_NUMBER
32+
after_success: bash ./deploy/scripts/cleanup.sh $TRAVIS_BUILD_NUMBER
4033

4134
stages:
42-
- test
35+
- build_push
36+
- plan
4337
- name: deploy
44-
if: (NOT type IN (pull_request)) AND (branch = master)

Dockerfile

+2
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,6 @@ RUN yarn --dev --frozen-lockfile
1313

1414
COPY . /app/
1515

16+
EXPOSE 3001
17+
1618
CMD ["yarn", "start"]

build_and_push_ecr.sh

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/bin/bash
2+
3+
echo "Building and tagging docker image"
4+
docker build --shm-size 512M -t user-service .
5+
docker tag user-service:latest $AWS_ECR_URL/user-service:latest
6+
7+
echo "Logging into ecr"
8+
aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ECR_URL
9+
10+
echo "Pushing image to ecr"
11+
docker push $AWS_ECR_URL/user-service:latest

deploy/main.tf

+18-19
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ EOF
9696

9797
resource "aws_iam_role_policy" "user_service_execution_role_policy" {
9898
name = "user-service-execution-role-policy"
99-
role = "${aws_iam_role.user_service_execution_role.id}"
99+
role = aws_iam_role.user_service_execution_role.id
100100

101101
policy = <<EOF
102102
{
@@ -123,7 +123,7 @@ EOF
123123

124124
resource "aws_security_group" "user_service_task_sg" {
125125
name = "user-service-task-sg"
126-
vpc_id = "${data.aws_vpc.tekis_vpc.id}"
126+
vpc_id = data.aws_vpc.tekis_vpc.id
127127

128128
ingress {
129129
from_port = 3001
@@ -141,10 +141,10 @@ resource "aws_security_group" "user_service_task_sg" {
141141
}
142142

143143
resource "aws_alb_target_group" "user_service_lb_target_group" {
144-
name = "cb-target-group"
144+
name = "users-target-group"
145145
port = 3001
146146
protocol = "HTTP"
147-
vpc_id = "${data.aws_vpc.tekis_vpc.id}"
147+
vpc_id = data.aws_vpc.tekis_vpc.id
148148
target_type = "ip"
149149

150150
health_check {
@@ -154,16 +154,16 @@ resource "aws_alb_target_group" "user_service_lb_target_group" {
154154
}
155155

156156
resource "aws_alb_listener_rule" "user_service_listener_rule" {
157-
listener_arn = "${data.aws_lb_listener.alb_listener.arn}"
157+
listener_arn = data.aws_lb_listener.alb_listener.arn
158158

159159
action {
160160
type = "forward"
161-
target_group_arn = "${aws_alb_target_group.user_service_lb_target_group.arn}"
161+
target_group_arn = aws_alb_target_group.user_service_lb_target_group.arn
162162
}
163163

164164
condition {
165165
host_header {
166-
values = ["event-api.tko-aly.fi"]
166+
values = ["users.tko-aly.fi"]
167167
}
168168
}
169169
}
@@ -174,12 +174,12 @@ resource "aws_cloudwatch_log_group" "user_service_cw" {
174174
}
175175

176176
resource "aws_ecs_task_definition" "user_serivce_task" {
177-
family = "service"
177+
family = "user-service"
178178
network_mode = "awsvpc"
179179
requires_compatibilities = ["FARGATE"]
180180
cpu = 256
181181
memory = 512
182-
execution_role_arn = "${aws_iam_role.user_service_execution_role.arn}"
182+
execution_role_arn = aws_iam_role.user_service_execution_role.arn
183183
container_definitions = <<DEFINITION
184184
[
185185
{
@@ -204,12 +204,11 @@ resource "aws_ecs_task_definition" "user_serivce_task" {
204204
}
205205
},
206206
"environment": [
207-
{"name": "NODE_ENV", "valueFrom": "production"},
208-
{"name": "COOKIE_DOMAIN", "valueFrom": "tko-aly.fi"},
209-
{"name": "API_VERSION", "valueFrom": "v1"},
210-
{"name": "USERSERVICE_PORT", "valueFrom": "5001"},
211-
{"name": "DEFAULT_LOCALE", "valueFrom": "fi"},
212-
{"name": "COOKIE_DOMAIN", "valueFrom": "tko-aly.fi"}
207+
{"name": "NODE_ENV", "value": "production"},
208+
{"name": "COOKIE_DOMAIN", "value": "tko-aly.fi"},
209+
{"name": "API_VERSION", "value": "v1"},
210+
{"name": "USERSERVICE_PORT", "value": "3001"},
211+
{"name": "DEFAULT_LOCALE", "value": "fi"}
213212
],
214213
"secrets": [
215214
{"name": "DB_HOST", "valueFrom": "${data.aws_ssm_parameter.user_service_db_host.arn}"},
@@ -228,18 +227,18 @@ DEFINITION
228227

229228
resource "aws_ecs_service" "user_service" {
230229
name = "user-service"
231-
cluster = "${data.aws_ecs_cluster.cluster.id}"
232-
task_definition = "${aws_ecs_task_definition.user_serivce_task.arn}"
230+
cluster = data.aws_ecs_cluster.cluster.id
231+
task_definition = aws_ecs_task_definition.user_serivce_task.arn
233232
desired_count = 1
234233
launch_type = "FARGATE"
235234

236235
network_configuration {
237236
security_groups = ["${aws_security_group.user_service_task_sg.id}"]
238-
subnets = "${data.aws_subnet_ids.user_service_subnets.ids}"
237+
subnets = data.aws_subnet_ids.user_service_subnets.ids
239238
}
240239

241240
load_balancer {
242-
target_group_arn = "${aws_alb_target_group.user_service_lb_target_group.arn}"
241+
target_group_arn = aws_alb_target_group.user_service_lb_target_group.arn
243242
container_name = "user_service_task"
244243
container_port = 3001
245244
}

deploy/scripts/cleanup.sh

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
aws s3 rm s3://user-service-state/plan-$1

deploy/scripts/terraform_apply.sh

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
2+
aws s3 cp s3://user-service-state/plan-$1 plan_output-$1
3+
terraform apply plan_output-$1

deploy/scripts/terraform_plan.sh

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
2+
terraform plan --out=./plan_output-$1 "./deploy"
3+
aws s3 cp plan_output-$1 s3://user-service-state/plan-$1

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"csurf": "^1.10.0",
4141
"dotenv": "^8.2.0",
4242
"express": "4.17.1",
43-
"express-mysql-session": "^2.0.1",
43+
"express-mysql-session": "^2.1.4",
4444
"express-session": "^1.16.2",
4545
"helmet": "^3.21.1",
4646
"i18n": "^0.8.3",

src/App.ts

+8-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Raven from "raven";
99
import cookieParser from "cookie-parser";
1010
import express from "express";
1111
import session from "express-session";
12-
import SessionFileStore from "session-file-store";
12+
import MySQLSessionStore from "express-mysql-session";
1313
import helmet from "helmet";
1414
import sassMiddleware from "node-sass-middleware";
1515
import Path from "path";
@@ -69,16 +69,20 @@ app.use(
6969
}),
7070
);
7171

72-
const FileStore = SessionFileStore(session);
73-
7472
// Session
7573
app.use(
7674
session({
7775
cookie: { secure: "auto", maxAge: 60000 },
7876
resave: true,
7977
saveUninitialized: true,
8078
secret: process.env.SESSION_SECRET || "unsafe",
81-
store: new FileStore({ path: Path.resolve(__dirname, "..", ".sessions") }),
79+
store: new MySQLSessionStore({
80+
host: process.env.DB_HOST,
81+
port: Number(process.env.DB_PORT),
82+
user: process.env.DB_USER,
83+
password: process.env.DB_PASSWORD,
84+
database: process.env.DB_NAME
85+
})
8286
}),
8387
);
8488

yarn.lock

+1-1
Original file line numberDiff line numberDiff line change
@@ -1501,7 +1501,7 @@ [email protected]:
15011501
resolved "https://registry.yarnpkg.com/expect-ct/-/expect-ct-0.2.0.tgz#3a54741b6ed34cc7a93305c605f63cd268a54a62"
15021502
integrity sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g==
15031503

1504-
express-mysql-session@^2.0.1:
1504+
express-mysql-session@^2.1.4:
15051505
version "2.1.4"
15061506
resolved "https://registry.yarnpkg.com/express-mysql-session/-/express-mysql-session-2.1.4.tgz#fa32cb9035dbfbff57daaa6bd310f583819e1f7b"
15071507
integrity sha512-Fcq168xVI8jtIJLhVHLJvBCvJlHnFWCcPmtt93UrWH38T2YsB919KrMCCh57/YkECkfff/L5zTQ95K1DxfOixg==

0 commit comments

Comments
 (0)