13. Git Action을 이용한 CI/CD

데일리·2024년 10월 25일
0
post-thumbnail

이전 포스팅에 이어서 이번엔 git에 push를 할 때 이미지를 자동으로 빌드해주고 push하는 CI를 만들어보자

1. 우선 프로젝트를 만들어보자

간단한 hello-word를 출력하는 프로젝트를 만들고 이를 git repository에 저장시켜야 된다. 우리는 git action에 진짜 실무처럼 test 코드를 돌리는 것까지 실습할 것이기 때문에 test코드도 추가해놓자!

위 사진의 폴더 구성처럼 구성해놓아야 한다. 여기서 주의할 점 몇가지가 있는데

  • github폴더가 아닌 .github 폴더라는 점
  • dockerFile 위치
  • .github가 최상단에 있어야된다는 점
  • test 폴더 위치

위의 주의사항 정도만 고려해서 폴더를 만들면 된다.

참고로 app.py와 테스트 코드는 최대한 간략하게 짰고 아래와 같다.

# app.py
from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello():
    return "Hello!!"


if __name__ == "__main__":
    app.run(host='0.0.0.0', port=7000)

#test.py
class Test_Example:
    def test_hello(self):
        assert True

이렇게 했으면 준비는 어느정도 되었고 그 다음은 git aciton에서 실행할 deploy파일을 만들어야 한다.

2. deploy파일 생성

name: DEV CI pipeline1

on:
  push:
    branches:
      - main


jobs:
  build:
    name: Test, Build, Push, Commit
    runs-on:  [ubuntu-latest]

    steps:
      # 1. Github Repository 체크아웃
      - name: Checkout repository
        uses: actions/checkout@v3

      # 2. 도커 로그인
      - name: Docker login
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}  # GitHub Secrets 사용
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build Image with cache
        run: |
          docker build -t [dockerHub-name]/[image-name]:latest .

      - name: Test with pytest
        run: |
          docker run -t --rm [dockerHub-name]/[image-name]:latest /bin/bash -c "PHASE=test pytest -rf --disable-warnings test/"

      - name: Push Image
        run: |
          docker push [dockerHub-name]/[image-name]:latest

      - name: Delete Docker Image
        if: always()
        run: |
          docker rmi [dockerHub-name]/[image-name]:latest

위에서 부터 설명하자면
name: 해당 deploy acion의 이름을 명시
on: 어떤 작업에 해당 action을 실행할 것인지 명시 -> 위에서는 main 브랜치에 푸쉬할 때에 실행한다고 명시해두었다. (push말고도 pr-check와 같은 작업에서도 진행 가능)
jobs: action에서 실행할 job들을 명시

참고로 이미지 delete는 해주는 것이 좋다. 저 이미지를 delete하지 않으면 이미지를 계속 누적해서 가지고 있어서 vm용량이 부족해져 vm이 터질 수 있기 때문에 해당 명령어를 넣어주는 것을 추천한다.

위의 jobs에서 도커에 로그인 및 빌드 푸쉬까지 진행한다.

여기서 도커 로그인에 secret은 github 홈페이지에서 settings - secrets and variables - action에서 따로 등록을 해야한다.

3. dockerFile 생성

위 작업에서 Build Image with cache 작업을 진행할 때 dockerFile에 작업을 진행하는데 그에 따른 dockerFile을 만들어 줘야 한다.

# Use an official Python runtime as a parent image
FROM python:3.9-slim

# Set the working directory in the container
WORKDIR /kube-study
# Copy the current directory contents into the container
COPY . /kube-study/

# Install any needed packages specified in requirements.txt
RUN pip install flask

RUN pip install pytest

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python",  "app/app.py"]

위 코드에서 주의할 점은 workDir, COPY에서 디렉토리 위치를 제대로 명시해줘야하고 필요한 라이브러리가 더 있다면 pip install [라이브러리]를 추가해주면된다.

위의 작업까지 해주고 git에 푸쉬해준다면 action에 동작하는 것을 볼 수 있다.

참고로 푸쉬할 때 dockerFile에서 에러가 난다면 매번 푸쉬하는 것이 번거로우니 IDE내에서 도커 필드를 할 수 있다. 

마찬가지로 deploy 파일 내부 명령어가 에러를 발생시키면 터미널에서 미리 테스트 해보고 성공했을 때 push해주면 된다!


위의 사진처럼 정상적으로 git action이 올라갔고 정상적으로 dockerHub에 푸쉬되는 것을 볼 수 있다.

다음에는 푸쉬된 이미지를 자동으로 VM에서 풀받는 포스팅으로 돌아오겠습니다~

profile
하루에 한편 씩 읽기 좋은 테크 로그

0개의 댓글