129 lines (129 loc) · 4.06 KB
/
backend.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
name: backend deploy
on:
workflow_dispatch:
branches:
- main
jobs:
prepare-test-db:
name: prepare test database
runs-on: ubuntu-latest
env:
FLY_API_TOKEN: ${{ secrets.FLY_POSTGRES_TOKEN }}
DATABASE_URL: ${{ secrets.DATABASE_URL_INTERGRATION_TEST }}
steps:
- uses: actions/checkout@v3
- uses: superfly/flyctl-actions/setup-flyctl@master
- uses: actions/cache@v3
with:
path: |
migration/target
key: ${{ runner.os }}-sea-orm-migration-${{ hashFiles('**migration/Cargo.lock') }}
- name: set fly-postgres proxy
run: nohup flyctl proxy 5432 -a marvinhsu-postgres &
- name: reset test database
run: |
cd migration
cargo run fresh
build:
name: build project
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/cache@v3
with:
path: |
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: cargo build
run: cargo build --release
- name: build docker image
run: docker build -t zero_to_production .
- name: save docker image
run: docker save -o zero_to_production.tar zero_to_production
- uses: actions/upload-artifact@v3
with:
name: zero_to_production.tar
path: zero_to_production.tar
retention-days: 1
unit-test:
name: run unit tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/cache@v3
with:
path: |
target
key: ${{ runner.os }}-cargo-test-${{ hashFiles('**/Cargo.lock') }}
- name: run test
run: cargo test --verbose
pytest:
name: run intregation tests
needs: [build,prepare-test-db]
runs-on: ubuntu-latest
env:
FLY_API_TOKEN: ${{ secrets.FLY_POSTGRES_TOKEN }}
DATABASE_URL: ${{ secrets.DATABASE_URL_INTERGRATION_TEST }}
steps:
- uses: actions/checkout@v3
- name: Install Poetry
uses: snok/install-poetry@v1
- uses: actions/cache@v3
with:
path: ~/.cache/pypoetry
key: ${{ runner.os }}-poetry-${{ hashFiles('**/pyproject.toml') }}
- name: Install pytest and requests
run: poetry install
- uses: superfly/flyctl-actions/setup-flyctl@master
- uses: actions/download-artifact@v3
with:
name: zero_to_production.tar
- name: load docker image
run: docker load -i zero_to_production.tar
- name: set fly-postgres proxy
run: nohup flyctl proxy 5432 -a marvinhsu-postgres &
- name: run image
run: |
docker run \
-e APP__ENVIRONMENT=test \
-e APP__DATABASE__PASSWORD=${{ secrets.DATABASE_PASSWORD_INTERGRATION_TEST }} \
--network host \
-d zero_to_production
- name: Run tests
run: poetry run pytest
migrate-db:
name: migrate production database
needs: pytest
runs-on: ubuntu-latest
env:
FLY_API_TOKEN: ${{ secrets.FLY_POSTGRES_TOKEN }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
steps:
- uses: actions/checkout@v3
- uses: superfly/flyctl-actions/setup-flyctl@master
- uses: actions/cache@v3
with:
path: |
migration/target
key: ${{ runner.os }}-sea-orm-migration-${{ hashFiles('**migration/Cargo.lock') }}
- name: set fly-postgres proxy
run: nohup flyctl proxy 5432 -a marvinhsu-postgres &
- name: migration database
run: |
cd migration
cargo run up
deploy:
name: Deploy app
needs: [unit-test, migrate-db, pytest]
runs-on: ubuntu-latest
env:
FLY_API_TOKEN: ${{ secrets.FLY_DEPLOY_TOKEN }}
steps:
- uses: actions/checkout@v3
- uses: actions/download-artifact@v3
with:
name: zero_to_production.tar
- uses: superfly/flyctl-actions/setup-flyctl@master
- name: load docker image
run: docker load -i zero_to_production.tar
- run: flyctl deploy --image zero_to_production