## 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 네트워크 방화벽 규칙 추가로 해결.