-
Notifications
You must be signed in to change notification settings - Fork 3
135 lines (130 loc) · 4.57 KB
/
main.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
# This is a basic workflow to help you get started with Actions
# Reference: https://github.com/PyCQA/pylint/blob/master/.github/workflows/ci.yaml
name: Pipenv CI
# Controls when the action will run.
on:
# Triggers the workflow on push or pull request events but only for the main branch
pull_request:
branches:
- main
paths:
- api/**
push:
branches:
- main
paths:
- api/**
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
env:
CACHE_VERSION: 1
DEFAULT_PYTHON: "3.10"
PYTHON_ROOT_DIRS: ./app
API_DIRS: ./api
FIREBASE_DIRS: ./firebase
PIPENV_VENV_IN_PROJECT: true
DB_USER: postgres
DB_PASSWORD: postgres
DB_HOST: localhost
TESTDB_HOST: localhost
DB_PORT: 5432
DB_SCHEMA: postgres
FLASHSENSE_API_URL: http://flashsense.api.url.example/api
FIREBASE_CRED: ../key/firebase_credentials.json
FIREBASE_API_KEY: ${{ secrets.FIREBASE_API_KEY }}
SENDGRID_API_KEY: fake_api_key_for_sendgrid_test
SYSTEM_EMAIL: [email protected]
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
environment: test
strategy:
matrix:
node-version: [16.x]
outputs:
python-key: ${{ steps.generate-python-key.outputs.key }}
defaults:
run:
working-directory: ${{ env.API_DIRS }}
services:
postgres:
image: postgres
ports:
- 5432:5432
env:
POSTGRES_PASSWORD: ${{ env.DB_PASSWORD }}
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- name: Check out code from GitHub
uses: actions/checkout@v3
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Setup pipenv
run: |
pip install --user pipenv
- name: Generate partial Python venv restore key
id: generate-python-key
run: >-
echo "key=base-venv-${{ env.CACHE_VERSION }}-${{
hashFiles(format('{0}/Pipfile.lock', env.API_DIRS))
}}" >> "$GITHUB_OUTPUT"
- name: Restore Python virtual environment
id: cache-venv
uses: actions/cache@v3
with:
path: ${{ env.API_DIRS }}/.venv
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
steps.generate-python-key.outputs.key
}}
restore-keys: |
${{ runner.os }}-${{ steps.python.outputs.python-version }}-base-venv-${{ env.CACHE_VERSION }}-
- name: Create Python virtual environment
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
pipenv --python ${{ env.DEFAULT_PYTHON }}
sudo apt update
sudo apt install -y build-essential python3-dev libpq-dev
pipenv run python -m pip install -U pip
pipenv sync --dev
# Runs a linter for python
- name: Run formatting check
run: |
pipenv run black --check --diff ${{ env.PYTHON_ROOT_DIRS }}
pipenv run ruff check ${{ env.PYTHON_ROOT_DIRS }}
pipenv run mypy ${{ env.PYTHON_ROOT_DIRS }} --show-error-codes --no-error-summary
- name: Extract service account credentials
run: |
envsubst < ../key/.subst > ../key/firebase_credentials.json
env:
FIREBASE_CREDENTIALS_JSON: ${{ secrets.FIREBASE_CREDENTIALS_JSON }}
- name: Extract firebaserc
run: |
envsubst < ../firebase/.subst > ../firebase/.firebaserc
env:
FIREBASERC: ${{ secrets.FIREBASERC }}
- name: Setup node env
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: Install firebase local emulators
run: npm install -g [email protected]
- name: Run firebase and run pytest
run: |
firebase emulators:exec --import=./data-test \
"cd ../;\
cd ${{ env.API_DIRS }};\
pipenv run pytest ${{ env.PYTHON_ROOT_DIRS }}/tests --cov --cov-branch --cov-report=term-missing --cov-config=app/tests/.coveragerc"
working-directory: ${{ env.FIREBASE_DIRS }}