ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CI/CD (1) Test(FastAPI/Gitlab)
    이것저것 2024. 2. 13. 15:37

    프로잭트 생성 / 예제 코드 적용

    Dockerfile 구성

    FROM python:3.9-slim
    
    # Set environment variables
    ENV PYTHONDONTWRITEBYTECODE 1
    ENV PYTHONUNBUFFERED 1
    
    # Set the working directory in the container
    WORKDIR /app
    
    # Copy the current directory contents into the container at /app
    COPY . /app
    
    # Install any needed packages specified in requirements.txt
    RUN pip install --no-cache-dir -r requirements.txt
    
    # Make port 80 available to the world outside this container
    EXPOSE 80
    
    # Define the command to run your application
    CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

    requirements 구성

    fastapi==0.70.0
    uvicorn==0.15.0

    main.app 구성.

    from fastapi import FastAPI
    
    # Create an instance of the FastAPI class
    app = FastAPI()
    
    # Define a route
    
    @app.get("/")
    async def read_root():
        return {"message": "Hello, World!"}
    
    # Define another route
    @app.get("/items/{item_id}")
    async def read_item(item_id: int, q: str = None):
        return {"item_id": item_id, "q": q}

    커맨드 실행.

    docker build -t cicd:latest .
    
    docker run -it -d -p 38000:80 cicd:latest

    정상작동 확인.

    개발 프로잭트 첫번쨰 커밋 first commit

    프로젝트 ci 추가 및 적용

    .gitlab/workflows/ci.yml 파일 추가

    tests/test_main.py 파일 추가

     

    test_main.py

    # 경로를 잡아줘야대지만 연습용이라 무시함.
    import sys
    from os import path
    sys.path.append(path.dirname(path.dirname( path.abspath(__file__))))
    
    import unittest
    from fastapi.testclient import TestClient
    from app.main import app
    
    class TestApp(unittest.TestCase):
        def setUp(self):
            self.client = TestClient(app)
    
        def test_read_root(self):
            response = self.client.get("/")
            self.assertEqual(response.status_code, 200)
            self.assertEqual(response.json(), {"message": "Hello, World!"})
    
        def test_read_item(self):
            response = self.client.get("/items/1")
            self.assertEqual(response.status_code, 200)
            self.assertEqual(response.json(), {"item_id": 1, "q": None})
    
        def test_read_item_with_query_param(self):
            response = self.client.get("/items/1?q=test")
            self.assertEqual(response.status_code, 200)
            self.assertEqual(response.json(), {"item_id": 1, "q": "test"})
    
    if __name__ == "__main__":
        unittest.main()

    ci.yml

    # .gitlab-ci.yml
    
    # MEREGE checking
    # 파이프라인을 어떤 러너를 사용하여 실행할 것인지 정의합니다.
    # 여기서는 도커 러너를 사용합니다.
    image: docker:latest
    
    # 작업의 정의는 stages 섹션에 있습니다.
    stages:
      - build
      - test
      - deploy
    
    # 각 작업은 jobs 섹션에서 정의됩니다.
    # 이름을 부여하고 해당 작업이 속하는 단계를 지정합니다.
    # 스크립트는 해당 작업이 수행할 명령을 포함합니다.
    build_job:
      # 도커 파일을 빌드합니다.
      stage: build
      script:
        - ls
        - docker info
        - docker build -t cicd:latest .
    
    # 테스트 코드를 실행합니다.
    test_job:
      services:
        - docker:dind
      stage: test
      script:
        - python tests/test_main.py
    
    # 테스트가 완료되면 배포 작업을 해줍니다. 
    #TODO Docker hub 연동.
    deploy_job:
      services:
        - docker:dind
      stage: deploy
      script:
        - docker run -it -d -p 38000:80 cicd:latest

    push

    Gitlab CE version에서는 Runner가 없어서 내 PC에서 runner를 등록 혹은 다른 곳에서 러너를등록하여 해당 CI 파일을 실행할 수 있게 해줘야함

    Sttings/CI/CD → runners 이동

    Create Runner 등록.!

    Docker를 이용하여 runner 실행.

    docker run -d --name gitlab-runner2 --restart always \
      -v /srv/gitlab-runner/config:/etc/gitlab-runner \
      -v /var/run/docker.sock:/var/run/docker.sock \
      gitlab/gitlab-runner:v16.7.1
    
    docker exec -it gitlab-runner2 bash
    
    gitlab-runner register  --url Step1 값 --token Step1값.

     

    등록된 것 확인.

    ci.yml → 수정 .gitlab-ci.yml 로 해야함 (github랑 햇갈림 ;;`)

    시계모양 아이콘이 뜨면 정상적으로 적용 된걸 알 수 있다.

    스테이징 대기중인 모습

    실행 완료 된 후 모습

    이런 방식으로 gitlab에 있는 프로젝트 관리를 한다!

    끝!

    주의사항

    • .gitlab-ci.yml 파일 명, 위치 확인(루트)
    • docker 사용 시 docker runner에 볼륨에 docker dine 확인 → volumes ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
    • 제발 runner excuter 확인 잘 하기 !!!!

    댓글

Designed by Tistory.