728x90
반응형
CI 단계에서 보면 개발자 여러명이서 작업을 하다보면 포맷팅이 각자 다르기 떄문에 몇가지 방식으로 통일해서 사용하자고 약속해 놓은 게 있다.
개발자들이 직접 기억하고 약속을 지킬 수 없으니 프로그램으로 돌려서 일치 시키게 해주는 것.
파이썬 린트 중 하나인 블랙을 설치해서 적용시켜보자
pip install black
# 경로에 있는 모든 파일들을 점검하겠다.
black .
# 해당 경로아래에 있는 파일들만 점검하겠다.
black --check lion_app
위 내용을 CI.yml 파일에 적용시켜보자
하고자 하는 작업
- job 으로 분리하여 새로운 컨테이너를 만들고
- checkout 하여 코드에 접근한뒤
- python 을 셋팅하고
- black 을 설치하여 확인하고자 하는 경로의 파일들을 점검
# CI.yml
name: CI
on:
pull_request:
push:
branches:
- "main"
env:
IMAGE: ${{ vars.NCP_CONTAINER_REGISTRY }}/lion-app
IMAGE_TAG: ${{ vars.NCP_CONTAINER_REGISTRY }}/lion-app:latest
jobs:
lint:
name: Check lint (black)
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install black
run: pip install black
- name: Check black
run: black --check lion_app
build:
needs: lint
...
act 를 이용하여 테스트
테스트 작업 리스트 확인
act -l
#
kimminhyeok@Ivans-Mac dev_django_app % act -l
Stage Job ID Job name Workflow name Workflow file Events
0 build_push_to_ncp push to NCP container registry CD using Docker Image CD.yml workflow_dispatch,push
0 lint Check lint (black) CI CI.yml pull_request,push
0 echo-event echo event lesson1 lesson1.yml workflow_dispatch
0 docker-build docker build lesson1 lesson1.yml workflow_dispatch
0 deployment deployment CD by git pull lesson2.yml workflow_dispatch
0 get-workflow-name echo workflow name resusable workflow lesson4.yml workflow_call
0 greeting greeting resusable workflow lesson4.yml workflow_call
0 call-workflow call-workflow call workflow lesson4_caller.yml workflow_dispatch
0 get-workflow-name echo workflow name call workflow lesson4_caller.yml workflow_dispatch
0 on-success on-success workflow run lesson5.yml workflow_run
0 on-failure on-failure workflow run lesson5.yml workflow_run
0 upload upload Upload PR data lesson5_up.yml pull_request
0 download download Use the PR data lesson5_use.yml workflow_run
0 job1 job1 output handling output_handling.yml workflow_dispatch
1 deploy-staging deploy to staging CD using Docker Image CD.yml workflow_dispatch,push
1 build Build Image CI CI.yml push,pull_request
1 docker-images docker images lesson1 lesson1.yml workflow_dispatch
1 job2 job2 output handling output_handling.yml workflow_dispatch
결과 확인
act -j lint
#
kimminhyeok@Ivans-Mac dev_django_app % act -j lint
[CI/Check lint (black)] 🚀 Start image=ghcr.io/catthehacker/ubuntu:act-latest
...
[CI/Check lint (black)] ✅ Success - Main Install black
[CI/Check lint (black)] ⭐ Run Main Check black
[CI/Check lint (black)] 🐳 docker exec cmd=[bash --noprofile --norc -e -o pipefail /var/run/act/workflow/3] user= workdir=
| All done! ✨ 🍰 ✨
| 39 files would be left unchanged.
[CI/Check lint (black)] ✅ Success - Main Check black
[CI/Check lint (black)] ⭐ Run Post actions/setup-python@v4
[CI/Check lint (black)] 🐳 docker exec cmd=[node /var/run/act/actions/actions-setup-python@v4/dist/cache-save/index.js] user= workdir=
[CI/Check lint (black)] ✅ Success - Post actions/setup-python@v4
[CI/Check lint (black)] 🏁 Job succeeded
본격적인 테스트 코드 작성에 앞서 기존 코드 develop 하자
기존에 있던 내용에서 기능 접근 권한을 나누기 위해 모델링
# models.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Topic(models.Model):
# postgres 를 사용할 예정이기 때문에 -> postgres 에서는 Text 와 Char 를 같게 취급
# 그래서 스트링을 다루는 곳에서는 Text 사용 - 공식문서
name = models.TextField(max_length=100, unique=True)
is_private = models.BooleanField(default=False)
owner = models.ForeignKey(User, on_delete=models.PROTECT)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
posts: models.QuerySet["Post"]
def __str__(self) -> str:
return self.name
class Post(models.Model):
topic = models.ForeignKey(Topic, on_delete=models.CASCADE, related_name="posts")
title = models.TextField(max_length=200)
content = models.TextField()
owner = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self) -> str:
return self.title
# 추가된 부분
class TopicGroupUser(models.Model):
class groupChoices(models.IntegerChoices):
common = 0
admin = 1
topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
group = models.IntegerField(
default=0, choices=groupChoices.choices
) # 0 = common. 1 = admin
user = models.ForeignKey(User, on_delete=models.CASCADE)
이후
# migrations 만들어주고
python3 manage.py makemigrations
# local 환경에서 동작
docker-comppose up --build -d
변경사항을 반영하기위해 입력하는 아래의 명령어는
python3 manage.py migrate
직접 컨테이너에 접속해서 돌려야 하지만
# start
#!/bin/sh
# 파이썬 알파인을 쓰기 떄문에 bash 조차 없다.. 그래서 sh 로
python3 manage.py collectstatic --no-input
python3 manage.py migrate
gunicorn lion_app.wsgi:application --config lion_app/gunicorn_config.py
start 스크립트로 작업을 해두었기 때문에 바로
docker-comppose up --build -d
변경사항 확인
728x90
반응형
'Dev. > Github Actions' 카테고리의 다른 글
Github Actions: Version Release (1) | 2023.10.15 |
---|---|
[Cloud] Github Actions: Code develop for TEST (0) | 2023.08.29 |
[Cloud] Github Actions: Concept of CI (0) | 2023.08.28 |
[Cloud] CD: Github Actions - TEST & act (0) | 2023.08.24 |
[Cloud] CD: Github Actions - workflow_run & Dependency (0) | 2023.08.23 |
댓글