10주차 화요일, 47일차 Today I Learned
Docker, K8s (2)
: CI/CD와 Github Actions, Test 및 Dockerization
✏️ 학습 내용
1. Dockerization 실습
웹 서비스를 Docker로 구동하기 위해서는 테스트를 수행하고, Dockerfile을 만들어 Docker Image를 빌드하고, Docker Image를 Docker Hub로 푸시하면 된다. 이를 Github Actions로 구현하여 repo의 main에 코드가 머지될 때마다 수행하도록 자동화 할 수 있다.
실습에서는 hangman 프로그램을 flask를 사용하여 웹으로 노출할 것이다. 포트 번호는 어디든 바인딩 가능하게 지정하고, flask 관련 모듈을 설치하여 진행할 것이다.
Docker 컨테이너 내부 프로세스가 오픈한 포트번호를 외부로 노출해주는 것이 포트 맵핑 (포트 포워딩) 이다. Docker 컨테이너를 실행할 때 포트 맵핑을 통해 호스트 운영체제 단에서 접근되는 포트를 컨테이너 쪽으로 포워드해주어야 한다. (-p 옵셥을 사용한다)
Repo 구성
1) app.py : main script
2) requirements.txt : flask 모듈을 설치할 수 있다.
3) test.py : 유닛 테스트 로직이 들어있다.
4) README.md
hangman Dockerization 하기 :
1) Docker Build하기
2) Docker inspect
3) Docker run
4) Push
다른 서버에서 작동 확인 :
1) 리눅스 서버 실행
2) Github repo 클론 후 파일 확인
3) 파이썬 모듈 확인 후 설치
4) flask 모듈 실행
- 이 때, host, port 바인딩하여 지정해준다.
5) port open
2. CI/CD와 Github Actions
소프트웨어 빌드란 소프트웨어를 최종적으로 배포하기 이전의 패키지로 만드는 것이다. 이 코드가 안정성이 있고 원하는 대로 돌아가는지 보장하는 것이 필요하며, 따라서 테스트가 중요하다. 이 테스트를 위해서 Docker Image가 많이 사용된다.
Continuos Integration을 줄여서 CI라고 하는데, 이는 코드를 수정할 때마다 테스트를 돌려서 우리가 기대하는 대로 코드가 동작하고 있다는 것을 보장하기 위한 목적을 갖는다. 소프트웨어 엔지니어링 Practice의 하나로, 기본 원칙은 코드 repo는 하나만 유지하고, 코드 변경을 최대한 자주 반영하며 테스트를 최대한 추가하고, 빌드를 계속적으로 수행하는 것으로 한다. 그리고 성공한 빌드의 프로덕션 릴리스, 즉 자동 배포가 되는 것을 Continuous Delivery, CD라고 한다. CI로 테스트를 수행하고, CD로 소프트웨어를 배포한다.
Git은 분산 환경을 지원하는 소스 버전 컨트롤 시스템으로, 다수의 개발자가 공동 개발을 하고 코드 리뷰가 가능하며, 코드 백업 및 롤백이 가능하다. Github는 Git repo 호스팅 및 클라우드 서비스이다. 대부분의 회사들은 깃을 직접 설치해서 사용하기 보다는 깃허브를 사용한다.
Github Actions란 CI/CD를 Github 위에서 구현하기 위한 서비스로, 코드 테스트, 빌드, 배포 자동화 기능을 제공한다. 깃허브에서 액션 기능을 통해 Workflow라는 이름으로 코드가 메인/마스터나 브랜치에 추가되는 순간 CI/CD를 트리거하는 기능을 구현할 수 있다.
워크플로는 트리거 이벤트가 발생하면 시작되는 일련의 동작들을 지칭하며, Events, Jobs, Actions, Runner 같은 컴포넌트로 구성되어 있다. 워크플로를 위한 명령어들은 YAML 파일로 저장된다. 그리고 워크플로는 Job들로 나눠지며 각 Job은 일련의 스텝을 수행하고 각 스텝은 하나 혹은 그 이상의 명령어를 실행한다.
YAM or YAML :
환경 설정 파일에 많이 쓰인다. JSON과 사실상 동일하며 이들 간의 변환도 가능하다.
ON에 트리거 이벤트가 지정된다
3. Github Actions 실습 : 테스트, Dockerization
1) 테스트 추가
Python Application이란 CI Template을 사용하여, 테스트 코드 실행과 flaske8을 통한 코딩 스타일 체크가 가능하다.
1) 깃허브 액션 접속 후 Python Application [Configure]
2) YML 파일 수정 후 저장
3) 테스트를 제대로 트리거하는지 확인
- readme.md 파일에 코드 추가 후 홈 디렉토리에서 Details 버튼으로 확인
2) Dockerization 추가
Docker Image란 Template 사용하여, 도커에 로그인하여 빌드하고 푸시하는 기능을 제공한다.
1) 깃허브 액션 접속 후 Docker Image [Configure]
2) YML 파일 수정 후 저장
3) Docker User, Docker Password 세팅
- Repo의 Settings 메뉴에서 Secrets and Variables > Actions 아래에 repo secret을 등록
- 혹은 코드 내에서 env 삭제 후 run에 명시된 USER, PASSWORD 내용을 바꾸어도 된다.
- 이를 통해 해당 repo를 만들 수 있는 권한이 있음을 인증한다.
4) 작동 확인
- 깃허브 repo 내 Details로 확인 가능
- Docker Hub web에서 시간으로 확인 가능
- 터미널에서 해당 Image 삭제 후 다시 다운받고 실행하여 이상 없는지를 통해 확인 가능
💡 배운 점
- Dockerization 실습을 진행하고, 정상적으로 작동하는지 다른 서버에서 실행해보았다.
- 포트 맵핑 (포트 포워딩) 개념에 대해 새로 배웠다.
- Docker build, inspect, run, stop 명령어와 기타 옵션들을 사용해보았다.
- CI/CI, Github Actions에 대해 배우고 실습을 진행했다.
📝 남아있는 의문과 개선점
- Pork 라는 개념에 대해서 더 자세하게 공부해야 한다.
- CI/CD를 한 번 더 살펴보면 좋을 것 같다.
- Github Actions에 대해서 더 공부해야 한다. 많은 내용이 있을 것 같다.
- Workflow와 YAML 파일에 대해 더 알아보아야한다.
☁️ 소감
그동안 궁금했던 CI/CD, Github Actions에 대해 배웠다. 코드를 직접 작성해본 것이 아니라서 어려움은 없었지만, 재미있는 내용인 것 같다. 좀 더 연습해서 내용을 숙지하면 다음에 프로젝트를 수행할 때 사용해보고 싶다. 그 과정에서 에러사항이 발생하겠지만 이를 정리하는 과정도 즐거울 것 같다. 공동 작업이면 함부로 수행하지 못할 것도 같은데 버전 관리도 잘 숙지해서 시행해보고 싶다.
'Data Engineering > grepp 데브코스 : TIL' 카테고리의 다른 글
[TIL_2023.12.21] Docker, K8s (4) : Docker compose (+with airflow) (0) | 2023.12.21 |
---|---|
[TIL_2023.12.20] Docker, K8s (3) : Docker 명령어, Volume, cleanup, Multi-container로 구성된 소프트웨어 실행 (1) | 2023.12.20 |
[TIL_2023.12.18] Docker, K8s (1) : 도커 소개 및 설치, 간단한 예제 (1) | 2023.12.19 |
[TIL_2023.12.15] 데이터 파이프라인 (5) : OLTP 복사, ELT (0) | 2023.12.15 |
[TIL_2023.12.14] 데이터 파이프라인 (4) : PK 고유성, Backfill (0) | 2023.12.14 |