117 lines
3.5 KiB
Markdown
117 lines
3.5 KiB
Markdown
## 1. 개요
|
|
|
|
기존 젠킨스(Jenkins)는 자바 기반으로 메모리 점유율이 높아 저사양 서버에서 구동이 힘들었음. 이를 해결하기 위해 Go 언어 기반의 초경량 CI 도구인 **Woodpecker**를 도입하고, 도커(Docker) 기반으로 환경을 재구축함.
|
|
|
|
---
|
|
|
|
## 2. 환경 정화 및 도커 설치
|
|
|
|
무거운 자바를 삭제하고 현대적인 컨테이너 환경을 준비함.
|
|
|
|
```bash
|
|
# OpenJDK 삭제 및 정리
|
|
sudo apt purge -y openjdk-17-jre openjdk-17-jre-headless
|
|
sudo apt autoremove -y
|
|
|
|
# 도커(Docker) 설치
|
|
curl -fsSL https://get.docker.com -o get-docker.sh
|
|
sudo sh get-docker.sh
|
|
|
|
# 현재 사용자에게 도커 권한 부여
|
|
sudo usermod -aG docker $USER
|
|
newgrp docker # 로그아웃 없이 권한 즉시 적용
|
|
```
|
|
|
|
## 3. GitHub OAuth 앱 등록
|
|
|
|
우드패커가 GitHub 저장소에 접근할 수 있도록 통행증을 발급함.
|
|
|
|
1. **GitHub Settings > Developer settings > OAuth Apps** 이동
|
|
|
|
2. **New OAuth App** 생성
|
|
|
|
- Homepage URL: `http://34.19.79.94:8000`
|
|
|
|
- Authorization callback URL: `http://34.19.79.94:8000/authorize`
|
|
|
|
3. **Client ID**와 **Client Secret** 발급 및 보관
|
|
|
|
|
|
---
|
|
|
|
## 4. 우드패커 서버 및 에이전트 배포
|
|
|
|
`docker-compose`를 사용하여 서버(두뇌)와 에이전트(일꾼)를 동시에 띄움.
|
|
|
|
**파일 위치:** `~/woodpecker/docker-compose.yaml`
|
|
|
|
```bash
|
|
services:
|
|
woodpecker-server:
|
|
image: woodpeckerci/woodpecker-server:latest
|
|
ports:
|
|
- 8000:8000
|
|
volumes:
|
|
- ./woodpecker-server:/var/lib/woodpecker
|
|
environment:
|
|
- WOODPECKER_OPEN=true
|
|
- WOODPECKER_HOST=http://34.19.79.94:8000
|
|
- WOODPECKER_AGENT_SECRET=wp_secure_9827_vpx_qr # 보안을 위해 이니셜 제외
|
|
- WOODPECKER_GITHUB=true
|
|
- WOODPECKER_GITHUB_CLIENT=발급받은_ID
|
|
- WOODPECKER_GITHUB_SECRET=발급받은_Secret
|
|
|
|
woodpecker-agent:
|
|
image: woodpeckerci/woodpecker-agent:latest
|
|
command: agent
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock
|
|
environment:
|
|
- WOODPECKER_SERVER=woodpecker-server:9000
|
|
- WOODPECKER_AGENT_SECRET=wp_secure_9827_vpx_qr
|
|
```
|
|
|
|
```bash
|
|
# 실행 및 상태 확인
|
|
docker compose up -d
|
|
docker ps
|
|
```
|
|
|
|
## 5. 파이프라인 설정 (`.woodpecker.yml`)
|
|
|
|
저장소 최상단에 작업 지시서를 작성하여 자동화를 테스트함.
|
|
|
|
**주요 해결 과제:**
|
|
|
|
- **Git 명령 인식:** 기본 `alpine` 이미지에는 git이 없으므로 `alpine/git` 이미지를 사용하여 해결.
|
|
|
|
- **이력 확인(HEAD^):** 기본 clone은 depth가 1이라 이전 이력이 없음. `depth: 2` 설정을 통해 최적화된 상태로 이전 커밋과 비교 가능하게 함.
|
|
|
|
```bash
|
|
kind: pipeline
|
|
name: check-updates
|
|
|
|
clone:
|
|
setup:
|
|
image: woodpeckerci/plugin-git
|
|
settings:
|
|
depth: 2
|
|
|
|
steps:
|
|
- name: show-changes
|
|
image: alpine/git
|
|
commands:
|
|
- echo "새로운 업데이트가 감지되었습니다!"
|
|
- echo "수정된 파일 목록:"
|
|
- git diff --name-only HEAD^ HEAD
|
|
- echo "최근 커밋 메시지:"
|
|
- git log -1 --pretty=%B
|
|
```
|
|
|
|
## 6. 트러블슈팅 기록
|
|
|
|
- **Forge Not Configured:** GitHub OAuth 설정이 누락되어 서버가 실행 직후 종료됨 -> 환경 변수 추가로 해결.
|
|
|
|
- **Agent Auth Error:** 서버 데이터베이스와 에이전트의 Secret Key가 꼬임 -> 서버 볼륨 삭제 후 재시작으로 초기화 성공.
|
|
|
|
- **GCP 방화벽:** 8000번 포트가 막혀 접속 불가 -> VPC 네트워크 방화벽 규칙 추가로 해결. |