CI/CD과 Github Actions 소개
Github Actions 사용 1: 테스트 추가
Github Actions 사용 2: Dockerization 추가
소프트웨어 빌드
소프트웨어를 최종적으로 출시하기 위한 형태로 만드는 것
참여한 개발자가 많을수록 빌드가 중요
개발을 마치기 전부터 빌드하면 소프트웨어의 안정성을 증가시킬 수 있음(Continuous Integration)
빌드가 실패하는 경우, 다시 성공할 때까지 코드 변경 금지
Continuous Integration(CI)
소프트웨어 엔지니어링 관례 중 하나
기본 원칙
코드의 Repo는 하나만 유지(Master)
코드 변경사항을 최대한 자주 반영
Test Coverage 최대화
지속적인 빌드(자동화)
성공한 빌드의 배포(자동화)(Continous Deployment(CD))
Git
분산 환경을 지원하는 버전 관리 시스템(VCS)
파일의 변경사항을 추적하고, 여러 명의 사용자들 간의 작업을 조율
장점
다수의 개발자가 공동 개발 가능
코드 리뷰
코드(or 파일) 백업
코드(or 파일) 롤백
Github
Git Repo 호스팅 / 클라우드 서비스
웹 기반 인터페이스 제공
Copilot, Workflow, Issue, Wiki 등 다양한 기능 제공
코드가 Main(Master) 브랜치에 추가(Push, Merge)되는 순간 CI / CD 트리거
특정 브랜치만을 대상으로 설정 가능
Github Actions 기능을 통해 Workflow로 이를 구현 가능
Github Actions
Github 위에서 CI / CD를 구현하는 서비스
Workflow 구성
Events
Jobs
Actions
Runners
Github hosted runners
Self hosted runners
Workflow
트리거 이벤트가 발생하면 시작되는 일련의 동작
Workflow를 위한 명령어는 YAML 파일로 작성
Workflow는 Job으로 나눠지며, Job은 일련의 스텝을 수행
각각의 스텝은 Actions라고 불리는 하나 이상의 명령어를 실행
각각의 스텝은 윈도우나 리눅스 서버 위에서 runner에 의해 실행
Actions 탭에서 Python application 이라는 CI Template 사용
flake8: Python 코드에서 에러나 코딩 스타일 등의 이슈를 체크하는 툴
YML(or YAML) 파일과 JSON 파일은 서로 변환 가능
.github/workflow/python-app.yml
on:
push:
branches: ["main"]
pull_request:
branches: ["main"]
on
: 트리거 이벤트 지정
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- 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 pytest
run: |
pytest
Actions 탭에서 Docker Image라는 CI Template 사용
Docker Hub에 로그인하기 위해서 Repo의 Settings 탭 -> Security -> Secrets and Variables에 각각 DOCKER_USER, DOCKER_PASSWORD라는 이름의 변수를 만들고 저장
.github/workflows/docker-image.yml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: docker login
env:
DOCKER_USER: ${{secrets.DOCKER_USER}}
DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}
run:
docker login -u $DOCKER_USER -p $DOCKER_PASSWORD
- name: Build the Docker image
run: docker build --tag ${{secrets.DOCKER_USER}}/hangman:latest .
- name: docker push
run: docker push ${{secrets.DOCKER_USER}}/hangman:latest
포트포워딩: Docker Container 내부에서 실행 중인 서비스를 외부에서 접근할 수 있도록 포트를 매핑해주는 것
Docker Container 내부에 4000번 포트를 사용하는 서비스 포트포워딩
docker run -p 4000:4000 image_name