Dev./Github Actions

[Cloud] Github Actions: Lint

Ivan'show 2023. 8. 30.
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
반응형

댓글