환경 구성 개요
본 문서에서는 Jenkins, Docker 및 Git을 기반으로 간단한 CI/CD 파이프라인을 구성하는 방법을 설명합니다.
| 역할 | 환경 | 기능 |
|---|---|---|
| 개발 환경 | Win10, Docker(Linux) | 코드 작성 및 디버깅 |
| 빌드 서버 | Win10, Docker(Linux), Jenkins | 자동화 빌드 및 배포 |
| 테스트 서버 | Ubuntu, Docker | 스테이징 환경 테스트 |
Jenkins 설치
Jenkins는 운영 체제에 직접 설치하거나 Docker 컨테이너로 실행할 수 있습니다. 본 예제에서는 Windows 호스트 시스템에 직접 설치하는 방식을 사용합니다.
Docker에서의 설치 시도 (권장되지 않음)
docker run -u root -d \
-p 8080:8080 \
-p 50000:50000 \
-v /e/DockerData:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
위 명령어는 Windows에서 Docker 볼륨 마운트를 위해 E 드라이브가 Shared Drive로 설정되어 있어야 합니다.
컨테이너 내부에서 Docker CLI를 사용하기 위해서는 추가적으로 docker-compose 설치가 필요합니다:
# 컨테이너 접속 후
curl -L --fail https://github.com/docker/compose/releases/download/1.23.2/run.sh -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
Jenkins 초기 설정
- 브라우저에서
http://localhost:8080접속 - 초기 관리자 비밀번호 확인 (
/var/jenkins_home/secrets/initialAdminPassword) - "Install suggested plugins" 선택
- 관리자 계정 생성 및 로그인
빌드 작업 생성
새로운 Item 생성
Jenkins 대시보드에서 "New Item"을 클릭하고 Freestyle project로 생성합니다.
소스 코드 관리
Git 저장소 정보 입력 및 인증 정보(Credentials) 설정이 필요합니다.
빌드 트리거 설정
수동 빌드만 수행하므로 별도의 트리거는 설정하지 않습니다.
PowerShell 빌드 스크립트 추가
Windows 환경에서는 PowerShell 스크립트를 사용하는 것이 권장됩니다. 먼저 "PowerShell Plugin"을 설치해야 합니다.
$imageName = 'latest'
$registryUser = 'your_registry_username'
$registryPass = 'your_registry_password'
$registryHost = 'ccr.ccs.tencentyun.com'
$namespace = 'your_namespace'
$projectPath = "D:\Program Files (x86)\Jenkins\workspace\helloworld"
$composeFile = "$projectPath\docker-compose.yml"
Write-Output "------------------------------ 이미지 빌드 중 ------------------------------"
docker-compose -f $composeFile build
Write-Output "------------------------------ 레지스트리 로그인 ------------------------------"
docker login --username=$registryUser --password=$registryPass $registryHost
Write-Output "------------------------------ 이미지 태그 지정 ------------------------------"
docker tag helloworld:$imageName "$registryHost/$namespace/helloworld:$imageName"
docker tag mynginx:$imageName "$registryHost/$namespace/mynginx:$imageName"
Write-Output "------------------------------ 이미지 푸시 중 ------------------------------"
docker push "$registryHost/$namespace/helloworld:$imageName"
docker push "$registryHost/$namespace/mynginx:$imageName"
Write-Output "------------------------------ 불필요 이미지 정리 ------------------------------"
docker rmi $(docker images -f "dangling=true" -q)
원격 서버 배포 설정
"Publish Over SSH" 플러그인을 설치하고 원격 서버 정보를 설정합니다.
- Name: Staging_Server
- Hostname: 원격 서버 IP
- Username: SSH 사용자명
- Passphrase/Private Key: 접근 키 설정
배포용 docker-compose 파일 준비
Git 저장소에 docker-compose.staging.yml 파일을 추가합니다:
version: '3.4'
services:
webapp:
image: ccr.ccs.tencentyun.com/namespace/helloworld:latest
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "81:80"
container_name: netcore_app
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
networks:
- app_network
nginx_proxy:
image: ccr.ccs.tencentyun.com/namespace/mynginx:latest
ports:
- "80:80"
- "801:801"
container_name: nginx_container
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
networks:
- app_network
networks:
app_network:
SSH를 통한 원격 명령 실행
Jenkins 빌드 단계에서 다음 설정을 추가합니다:
- Source files: docker-compose.staging.yml
- Remove prefix: 없음
- Remote directory: /deploy
- Exec command:
#!/bin/bash
REGISTRY_USER='your_username'
REGISTRY_PWD='your_password'
REGISTRY_URL='ccr.ccs.tencentyun.com'
COMPOSE_FILE='/deploy/docker-compose.staging.yml'
echo "------------------------------ 레지스트리 로그인 ------------------------------"
docker login --username=$REGISTRY_USER --password=$REGISTRY_PWD $REGISTRY_URL
echo "------------------------------ 기존 서비스 종료 ------------------------------"
docker-compose -f $COMPOSE_FILE down
echo "------------------------------ 최신 이미지 가져오기 ------------------------------"
docker-compose -f $COMPOSE_FILE pull
echo "------------------------------ 서비스 시작 ------------------------------"
docker-compose -f $COMPOSE_FILE up -d
echo "------------------------------ 잔여 이미지 제거 ------------------------------"
docker rmi $(docker images -f "dangling=true" -q)
빌드 결과 확인
빌드 완료 후 Jenkins 콘솔 출력을 통해 오류 여부를 확인할 수 있습니다.
빌드 서버 이미지 목록
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ccr.ccs.tencentyun.com/namespace/helloworld latest 4024cdbb87dc About an hour ago 265MB
helloworld latest 4024cdbb87dc About an hour ago 265MB
ccr.ccs.tencentyun.com/namespace/mynginx latest daca457eb2a9 7 hours ago 109MB
원격 서버 상태 확인
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ccr.ccs.tencentyun.com/namespace/helloworld latest 4024cdbb87dc About an hour ago 265MB
ccr.ccs.tencentyun.com/namespace/mynginx latest daca457eb2a9 7 hours ago 109MB
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e1dc94a1886b ccr.ccs.tencentyun.com/namespace/mynginx:latest "nginx -g 'daemon of…" 8 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:801->801/tcp nginx_container
3ad3db4fbd94 ccr.ccs.tencentyun.com/namespace/helloworld:latest "dotnet HelloWorld.d…" 8 minutes ago Up 8 minutes 0.0.0.0:81->80/tcp netcore_app
웹 브라우저에서 http://서버IP:801으로 접속하여 서비스 동작을 확인할 수 있습니다.