-
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 확인 잘 하기 !!!!
반응형'이것저것' 카테고리의 다른 글