SW 빌드란?
개발한 소프트웨어를 최종적으로 출시하기 위한 형태로 만드는 것이다. 참여 개발자들이 많을수록 이 과정은 더더욱 중요해지며, 개발이 끝나기 전부터 빌드를 해서 테스트를 진행하면 SW의 안정성이 증대된다.
CI (Continuous Integration)
CI는 Software Engineering Practice의 하나로, 아래와 같은 기본 원칙을 가지고 있다.
- 코드 Repo는 하나만 유지한다. (Master or Main)
- 코드변경을 최대한 자주 반영
- 테스트를 최대한 추가
- 빌드를 계속적으로 수행 (자동화)
- 성공한 빌드의 프로덕션을 릴리스 (자동화)
- CD (Continuous Delivery): 배포
만약 빌드가 실패할 경우
새 코드의 commit으로 테스트가 실패하는 경우, 많은 회사들이 다시 빌드가 성공할 때까지 코드 변경을 금지시킨다. 규모가 큰 회사일수록 빌드 담당 엔지니어가 있고, 빌드 실패시 가벼운 형태로 페널티를 부여하기도 한다. 따라서 코드를 커밋하기 전, 자신의 환경에서 테스트가 잘 되는지 확인할 필요가 있다.
Github Actions
Github에서 제공하는 CI/CD 도구로, 특정 브랜치(ex. main)의 코드가 push/merge 등으로 수정됐을 때, 테스트를 수행하고 빌드하는 등의 과정을 workflow라는 이름으로 구현할 수 있도록 한다. Public Repo의 경우 무료로 이용 가능하며, Private Repo의 경우 이용 시간 또는 용량에 따라 유료로 이용할 수 있다.
Workflow 컴포넌트 구성
- Events
- Jobs
- Actions
- Runner
- Github hosted runners
- self hosted runners
Workflow
Workflow는 트리거 이벤트(코드 커밋, PR 생성, 다른 Workflow 성공 등)가 발생하면 시작되는 일련의 동작들을 지칭한다. Workflow를 위한 명령어들은 YAML 파일로 저장되며, Workflow는 각각의 Job으로 나눠진다.
Github Acitons 사용 방법
우선 Actions를 사용하고자 하는 repo에 접속해 상단 메뉴 중 Actions 버튼을 클릭한다.
해당 페이지에 접속하게 되면, Workflow를 지정할 YAML 파일을 직접 만들거나(상단 set up workflow yourself) Github에서 제공하는 템플릿을 선택해 사용할 수 있다.
나는 현재 진행중인 데브코스에서 제공받은 코드(hangman 웹 서비스)를 기준으로 진행했다.
https://github.com/JeongMinHyeok/hangman_web
Github Actions를 통해 main 브런치에 push 또는 PR이 있을 때, test.py(테스트 코드)를 실행해보려고 한다.
위 Actions 페이지에서 Python application이라는 CI tamplate을 선택한다.
test.py는 unittest 기능을 통해 이용할 것이고, flake8을 통해 코딩 스타일 등까지 체크해볼 예정이다.
# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
name: Python application
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.10
uses: actions/setup-python@v3
with:
python-version: "3.10"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8 pytest
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test with unittest
run: |
# test로 시작하는 모든 py파일에 대해 unittest 실행
python -m unittest discover -p 'test*.py'
YAML 파일은 위와같이 구성했다. main 브런치만을 대상으로 하며, python 3.10 환경에서 작동한다. pip 명령어를 통해 종속성 라이브러리를 설치한 뒤, flake8과 python -m unittest 명령어를 통해 테스트를 진행한다.
이후 우측 상단 Commit Changes 버튼을 클릭해 커밋하고, 변경한 점을 새로운 PR로 생성했다. PR에서 머지한 뒤 해당 브랜치는 삭제해주면 된다.
commit과 merge가 끝나게 되면, 커밋 메시지 옆에 주황색 불이 켜지는데, 이는 Github Actions가 실행되고 있다는 것을 뜻한다.
해당 버튼을 눌러보면 Github Actions의 상세 정보를 볼 수 있는데, 간단한 프로그램이다보니 금방 테스트가 완료된 것을 확인할 수 있다.
Details를 눌러 살펴보면 각 jobs의 단계별로 실행된 것을 확인 할 수 있다.
'Minding's Programming > Knowledge' 카테고리의 다른 글
[Python/Unittest] Unittest (0) | 2024.12.02 |
---|---|
[Docker] Docker Volume (0) | 2024.11.15 |
[BI/시각화] Superset (1) | 2024.10.31 |
[Snowflake] Snowflake 알아보기 (설치 방법) (0) | 2024.10.31 |
[Docker] Docker의 개념 및 기본 실행 명령어 (1) | 2024.10.28 |