Skip to content
This repository was archived by the owner on Jul 2, 2024. It is now read-only.

Commit 90f421f

Browse files
Finish CI
1 parent b843804 commit 90f421f

File tree

1 file changed

+191
-0
lines changed

1 file changed

+191
-0
lines changed

lesson49.md

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,197 @@ Plan -> Code -> Build -> Test
532532

533533
Если автоматически не предложит, то всегда можно найти в поиске.
534534

535+
При нажатии кнопки `Configure` github предложит нам добавить файл `.github/workflows/django.yml`, причем название файл
536+
можно поменять, а путь нет, потому что как мы уже знаем `.github` это скрытая папка с точки зрения линукса, а `workflow`
537+
папка в которой github будет искать файлы конфигурации CI
538+
539+
Стандартный файл `django.yml`:
540+
541+
```yaml
542+
name: Django CI
543+
544+
on:
545+
push:
546+
branches: [ "master" ]
547+
pull_request:
548+
branches: [ "master" ]
549+
550+
jobs:
551+
build:
552+
553+
runs-on: ubuntu-latest
554+
strategy:
555+
max-parallel: 4
556+
matrix:
557+
python-version: [ 3.7, 3.8, 3.9 ]
558+
559+
steps:
560+
- uses: actions/checkout@v3
561+
- name: Set up Python ${{ matrix.python-version }}
562+
uses: actions/setup-python@v3
563+
with:
564+
python-version: ${{ matrix.python-version }}
565+
- name: Install Dependencies
566+
run: |
567+
python -m pip install --upgrade pip
568+
pip install -r requirements.txt
569+
- name: Run Tests
570+
run: |
571+
python manage.py test
572+
573+
```
574+
575+
Давайте рассмотрим это файл
576+
577+
`name` - название, тут может быть что угодно
578+
579+
`on` - команда которая описывает когда должна выполнятся текущая конфигурация, по дефолту это пуш в ветку мастер, или
580+
пул реквест на мастер, так как мы уже запретили пуш на мастер, этот пункт можно удалить
581+
582+
`jobs` - описание самих выполняемых команд
583+
584+
`build` - просто название, тут можно было написать, что угодно
585+
586+
`matrix/python-version` - список версий питона на которых необходимо запускать команды, предлагаю оставить только 3.9
587+
588+
`steps` - выполняемые шаги и зависимые модули. В нашем примере используется два дополнительных
589+
модуля `actions/checkout@v3`, `actions/setup-python@v3`. Первый для взаимодействия с пул реквестом, второй для запуска
590+
питона. И сами команды, обновить `pip`, запустить установку `requirements.txt` и запуск команды `python manage.py test`.
591+
592+
Весь этот процесс запустится на виртуальной машине принадлежащей github, но нам это и не важно, главное, что мы получим
593+
результат выполнения тестов, и если тесты не пройдут, то мы не сможем смержить пул реквест.
594+
595+
После наших небольших изменений мы получим такой файл:
596+
597+
```yaml
598+
name: Django CI
599+
600+
on:
601+
pull_request:
602+
branches: [ "master" ]
603+
604+
jobs:
605+
build:
606+
607+
runs-on: ubuntu-latest
608+
strategy:
609+
max-parallel: 4
610+
matrix:
611+
python-version: [ 3.9 ]
612+
613+
steps:
614+
- uses: actions/checkout@v3
615+
- name: Set up Python ${{ matrix.python-version }}
616+
uses: actions/setup-python@v3
617+
with:
618+
python-version: ${{ matrix.python-version }}
619+
- name: Install Dependencies
620+
run: |
621+
python -m pip install --upgrade pip
622+
pip install -r requirements.txt
623+
- name: Run Migrations # run migrations to create table in side car db container
624+
run: python manage.py migrate
625+
- name: Run Tests
626+
run: |
627+
python manage.py test
628+
629+
```
630+
631+
Сохраняем. Если мы добавили невозможность прямого коммита в мастер, то гитхаб предложит нам создать новую ветку и пул
632+
реквест, не забудьте его смержить!!!
633+
634+
По сути в максимально простом виде CI степ уже настроен, и для определённых условий будет даже работать.
635+
636+
Но, чего тут не хватает? Настройки базы данных! Ведь для запуска тестов, практически всегда необходима база данных!
637+
638+
Давайте добавим её в настройки.
639+
640+
Первым делом, нам необходимо добавить базу в описание запуска флоу. И добавить степ с миграцией нашей базы.
641+
642+
```yaml
643+
name: Django CI
644+
645+
on:
646+
pull_request:
647+
branches: [ "master" ]
648+
649+
jobs:
650+
build:
651+
652+
runs-on: ubuntu-latest
653+
services:
654+
postgres: # we need a postgres docker image to be booted a side car service to run the tests that needs a db
655+
image: postgres
656+
env: # the environment variable must match with app/settings.py if block of DATBASES variable otherwise test will fail due to connectivity issue.
657+
POSTGRES_USER: postgres
658+
POSTGRES_PASSWORD: postgres
659+
POSTGRES_DB: github-actions
660+
ports:
661+
- 5432:5432 # exposing 5432 port for application to use
662+
# needed because the postgres container does not provide a healthcheck
663+
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
664+
strategy:
665+
max-parallel: 4
666+
matrix:
667+
python-version: [ 3.9 ]
668+
669+
steps:
670+
- uses: actions/checkout@v3
671+
- name: Set up Python ${{ matrix.python-version }}
672+
uses: actions/setup-python@v3
673+
with:
674+
python-version: ${{ matrix.python-version }}
675+
- name: Install Dependencies
676+
run: |
677+
python -m pip install --upgrade pip
678+
pip install -r requirements.txt
679+
- name: Migrate
680+
run: python manage.py migrate
681+
- name: Run Tests
682+
run: |
683+
python manage.py test
684+
685+
```
686+
687+
В параметре `env` можно увидеть настроенные юзер, пароль и название базы.
688+
689+
Обратите внимание на параметр `options`, он нужен, что-бы мы выполняли все команды только после того как postgres
690+
загрузится.
691+
692+
Так же нам необходимо убедиться, что у нас в `requirements.txt` указан `psycopg2`
693+
694+
И внести изменения в `settings.py`
695+
696+
```python
697+
if os.getenv('GITHUB_WORKFLOW'):
698+
DATABASES = {
699+
'default': {
700+
'ENGINE': 'django.db.backends.postgresql',
701+
'NAME': 'github-actions',
702+
'USER': 'postgres',
703+
'PASSWORD': 'postgres',
704+
'HOST': 'localhost',
705+
'PORT': '5432'
706+
}
707+
}
708+
else:
709+
DATABASES = {
710+
'default': {
711+
'ENGINE': 'django.db.backends.postgresql',
712+
'NAME': os.getenv('DB_NAME'),
713+
'USER': os.getenv('DB_USER'),
714+
'PASSWORD': os.getenv('DB_PASSWORD'),
715+
'HOST': os.getenv('DB_HOST'),
716+
'PORT': os.getenv('DB_PORT')
717+
}
718+
}
719+
720+
721+
```
722+
723+
Обратите внимание переменная `GITHUB_WORKFLOW` будет добавлена автоматически при запуске.
724+
725+
Теперь наш CI полностью готов к работе!
535726

536727

537728

0 commit comments

Comments
 (0)