
간단한 hello-word를 출력하는 프로젝트를 만들고 이를 git repository에 저장시켜야 된다. 우리는 git action에 진짜 실무처럼 test 코드를 돌리는 것까지 실습할 것이기 때문에 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파일을 만들어야 한다.
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에서 따로 등록을 해야한다.
위 작업에서 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에 푸쉬되는 것을 볼 수 있다.