[TIL] 개발환경 구축을 위한 Docker와 K8S 실습 (2)

이원진·2023년 6월 13일
0

데브코스

목록 보기
47/54
post-thumbnail

학습내용


  1. CI/CD과 Github Actions 소개

  2. Github Actions 사용 1: 테스트 추가

  3. Github Actions 사용 2: Dockerization 추가

1. CI/CD와 Github Actions 소개


  • 소프트웨어 빌드

    • 소프트웨어를 최종적으로 출시하기 위한 형태로 만드는 것

      • 테스트는 빌드의 일부로, 매우 중요한 과정

    • 참여한 개발자가 많을수록 빌드가 중요

    • 개발을 마치기 전부터 빌드하면 소프트웨어의 안정성을 증가시킬 수 있음(Continuous Integration)

    • 빌드가 실패하는 경우, 다시 성공할 때까지 코드 변경 금지

  • Continuous Integration(CI)

    • 소프트웨어 엔지니어링 관례 중 하나

    • 기본 원칙

      • 코드의 Repo는 하나만 유지(Master)

      • 코드 변경사항을 최대한 자주 반영

      • Test Coverage 최대화

      • 지속적인 빌드(자동화)

      • 성공한 빌드의 배포(자동화)(Continous Deployment(CD))

  • Git

    • 분산 환경을 지원하는 버전 관리 시스템(VCS)

      • CVS, SVN은 중앙 개발 환경으로 서버가 연결된 상태에서만 사용 가능

    • 파일의 변경사항을 추적하고, 여러 명의 사용자들 간의 작업을 조율

    • 장점

      • 다수의 개발자가 공동 개발 가능

      • 코드 리뷰

      • 코드(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

      • 트리거 이벤트가 발생하면 시작되는 일련의 동작

        • 트리거 이벤트: 코드 커밋, PR 생성, 다른 Workflow 성공 등

      • Workflow를 위한 명령어는 YAML 파일로 작성

      • Workflow는 Job으로 나눠지며, Job은 일련의 스텝을 수행

        • 각각의 스텝은 Actions라고 불리는 하나 이상의 명령어를 실행

        • 각각의 스텝은 윈도우나 리눅스 서버 위에서 runner에 의해 실행

          • 이를 Docker Image에서 수행 가능

2. Github Actions 사용 1: 테스트 추가


  • Actions 탭에서 Python application 이라는 CI Template 사용

  • flake8: Python 코드에서 에러나 코딩 스타일 등의 이슈를 체크하는 툴

    • 이러한 툴을 Linting tool이라고 부름

  • YML(or YAML) 파일과 JSON 파일은 서로 변환 가능

  • .github/workflow/python-app.yml

    on:
        push:
            branches: ["main"]
        pull_request:
            branches: ["main"]
    • on: 트리거 이벤트 지정

      • main 브랜치에 Push 되거나 PR이 만들어진 경우 workflow 실행

    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
    • jobs 밑에 CI 프로세스가 스텝(name)별로 기술

3. Github Actions 사용 2: Dockerization 추가


  • Actions 탭에서 Docker Image라는 CI Template 사용

  • Docker Hub에 로그인하기 위해서 Repo의 Settings 탭 -> Security -> Secrets and Variables에 각각 DOCKER_USER, DOCKER_PASSWORD라는 이름의 변수를 만들고 저장

    • 이를 YML 파일에서 ${{secrets.DOCKER_USER}}와 같은 형식으로 사용

  • .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

0개의 댓글