1. CI/CD
1. CI/CD란?
1. 정의
- CI: Continuous Integration (지속적인 통합)
- CD: Continuous Delivery / Deployment (지속적인 제공/배포)
2. 특징
- 자동화된 빌드, 테스트, 배포
- 안정적이고 빠른 코드 제공 가능
- 스크럼 기반의 애자일 개발과 잘 어울림
3. 전통적인 배포 vs 현대적 배포
| 구분 | 전통적 방식 | 현대적 방식 |
|---|
| 배포 방식 | 수동, 롤백 어려움 | 자동화된 테스트 + 배포 |
| 서버 구성 | 개별 설정 필요 | Docker 등으로 표준화 |
| 속도 | 느림 | 빠름 |
2. Docker 기초
1. 왜 Docker인가?
- 환경 차이 없이 동일한 컨테이너 환경에서 실행 가능
- 독립적이고 확장성 있는 배포 가능
- CI/CD와의 궁합 좋음
- 호스트 OS에 영향 없음
3. Docker 설치
Windows
- WSL2 설치:
wsl --install
- Ubuntu 22.04 설치
- Docker GPG 키 및 리포지토리 설정 후 설치
- Docker Desktop 설정에서 WSL 연동
4. Container 실행 테스트
docker image pull nginx:1.25.3-alpine
docker run -d -p 8001:80 --name webserver01 nginx:1.25.3-alpine
curl localhost:8001
5. Docker Image 관리
1. 개념
- Stateless: 상태 비저장
- Immutable: 변경 불가 이미지
2. 주요 명령어
docker pull nginx:latest
docker image inspect nginx:latest
docker image history nginx:latest
docker login
docker logout
6. Docker Container 관리
1. Image vs Container
- Image: 레시피(붕어빵 틀)
- Container: 실행된 인스턴스(붕어빵)
2. 주요 명령어
docker run -ti --name test ubuntu:22.04
docker start test
docker attach test
docker ps -a
docker stop test
docker rm test
docker logs test
docker inspect test
3. 포트, 로그, 리소스 확인
docker port test
docker stats test
docker logs -f test
7. Docker 파일 생성 및 실행 실습
mkdir nodejsapp && cd nodejsapp
docker buildx build -t node-test:1.0 .
docker run -itd -p 6060:6060 --name=node-test node-test:1.0
curl http://localhost:6060
8. 정리 및 정리 명령어
1. 리소스 정리
docker container prune
docker image prune
docker system prune
2. Github & CI/CD
1. Github Actions란?
정의
- Github에 내장된 CI/CD 도구
.github/workflows 디렉토리에 YAML 파일 작성
- 무료 제공: 500MB 저장공간 + 월 2000분
2. Github Actions로 CI 구성
예시 워크플로우
name: CI
on:
push:
branches: [develop, feature/*]
pull_request:
branches: [develop]
jobs:
ci:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v4
- name: java setup
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: '17'
- name: run unittest
run: ./gradlew clean test
3. Github Actions로 CD 구성
예시 워크플로우
name: CD
on:
push:
branches: [main]
jobs:
cd:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v4
- name: java setup
uses: actions/setup-java@v3
with:
distribution: 'adopt'
java-version: '17'
- name: run unittest
run: ./gradlew clean test
- name: deploy to heroku
uses: akhileshns/heroku-deploy@v3.12.12
with:
heroku_api_key: ${{ secrets.HEROKU_API_KEY }}
heroku_app_name: "sampleapp-github-actions"
heroku_email: "nbcdocker@proton.me"
4. Github Actions 주요 구성 요소
| 구성 요소 | 설명 |
|---|
| Workflow | 전체 자동화된 프로세스 |
| Event | 트리거(예: push, PR) |
| Runner | 작업을 실행하는 가상머신 |
| Job | 여러 Step 묶음 |
| Step | 개별 명령 또는 Action |
| Action | 재사용 가능한 기능 단위 |
5. 예제 실행
간단한 데모 워크플로우
name: GitHub Actions Demo
on: [push]
jobs:
Explore-GitHub-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🎉 자동 트리거됨!"
- run: echo "🐧 OS: ${{ runner.os }}"
- name: Check out repository
uses: actions/checkout@v4
6. Spring Boot + Github Actions (CI)
- develop, feature 브랜치에 push 또는 PR 발생 시 gradle test 실행
✔ 예시: .github/workflows/run-test.yaml
name: Run Test
on:
push:
branches: [develop, feature/*]
pull_request:
branches: [develop]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v4
- name: java setup
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: '17'
- name: make executable gradlew
run: chmod +x ./gradlew
- name: run unittest
run: ./gradlew clean test
7. Cloudtype 배포 자동화
1. 개념 흐름
- feature/** → PR 생성 → 자동 테스트
- PR 성공 시 → main 브랜치 merge
- main → 자동 배포 to cloudtype
2. PR 테스트용: test-pr.yml
name: test every pr
on:
workflow_dispatch:
pull_request:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: setup jdk
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
- name: Grant execute permission
run: chmod +x ./gradlew
- name: gradlew test
run: ./gradlew test
3. Cloudtype 배포용: deploy-main.yml
name: Deploy to cloudtype
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Connect deploy key
uses: cloudtype-github-actions/connect@v1
with:
token: ${{ secrets.CLOUDTYPE_TOKEN }}
ghtoken: ${{ secrets.GHP_TOKEN }}
- name: Deploy
uses: cloudtype-github-actions/deploy@v1
with:
token: ${{ secrets.CLOUDTYPE_TOKEN }}
project: nbc.docker/cicd
stage: main
yaml: |
name: cicd
app: java@17
options:
ports: 8080
context:
git:
url: git@github.com:${{ github.repository }}
ref: ${{ github.ref }}
preset: java-springboot
8. 환경 설정 가이드
1. Cloudtype
- 가입: cloudtype.io
- 카드 등록 후 무료 요금제 활성화 필요
- API 키 발급 후 Github Secrets에 등록
2. Github Secrets 등록
| Key | 설명 |
|---|
GHP_TOKEN | Github Personal Token |
CLOUDTYPE_TOKEN | Cloudtype API Key |
3. Docker
1. Dockerfile로 나만의 Docker Image 만들기
1. 개념
- Dockerfile은 앱 실행을 위한 모든 환경 설정 레시피
- 동일한 환경, 자동화된 이미지 생성, 재사용 가능
2. 예제
FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx
COPY index.html /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
3. 명령어 정리
| 명령어 | 설명 |
|---|
| FROM | 베이스 이미지 지정 |
| RUN | 명령 실행 |
| COPY | 파일 복사 |
| CMD / ENTRYPOINT | 컨테이너 시작 시 실행 명령 |
| EXPOSE | 외부 노출 포트 설정 |
| WORKDIR | 작업 디렉토리 설정 |
| ENV | 환경변수 설정 |
| USER | 사용자 변경 |
2. Docker Compose를 사용한 멀티 컨테이너 관리
1. Docker Compose란?
- 여러 컨테이너를 하나의 YAML 파일로 정의
- 의존성 관리, 포트 설정, 환경변수 관리 가능
2. 예제: docker-compose.yaml
version: '3'
services:
web:
image: nginx:latest
ports:
- 80:80
depends_on:
- api
api:
image: java:latest
ports:
- 8080:8080
environment:
- MYSQL_HOST=mysql
mysql:
image: mysql:latest
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=password
3. Docker Compose 명령어
| 명령어 | 설명 |
|---|
docker-compose up -d | 백그라운드 실행 |
docker-compose down | 컨테이너 및 네트워크 삭제 |
docker-compose logs | 로그 출력 |
docker-compose exec | 실행 중인 컨테이너 명령 실행 |
docker-compose run | 일회성 컨테이너 실행 |
4. 모니터링과 로깅
1. docker stats
docker stats
2. htop 도구 설치 및 실행
docker exec -ti test-tools /bin/bash
apt update && apt install htop -y
htop
3. 디스크 확인
docker exec -ti test-tools /bin/bash
df -h
du -sh
5. 컨테이너 로깅
1. 로그 확인
docker logs [컨테이너명]
docker logs -f --tail 10 [컨테이너명]
2. 로그 파일 경로 확인
docker inspect [컨테이너명] --format "{{.LogPath}}"
3. 로그 로테이션 예제
docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=5 \
--name nginxtest \
nginx:latest
4. docker-compose 로 설정
services:
app:
logging:
driver: 'json-file'
options:
max-size: '10m'
max-file: '10'
도커 도커....