GoCD Pipeline 구축

허형준·2023년 7월 13일
2

기술

목록 보기
6/9
post-thumbnail

GoCD는 이름에서 알 수 있듯이 CD, 지속적인 배포를 관리하는 소프트웨어다. 오픈소스이며 여러 서버를 지원한다. 필자는 맥 미니를 홈서버로 운용중인데, 맥 ARM 환경에서도 동작한다.

서비스가 많아짐에 따라 별도의 Github Action으로는 CD를 지원할 수 없었다. 매번 Action 서버를 own server에서 돌려주어야 하고 이는 불필요한 반복작업이다. 서비스 배포 과정을 자동화하기 위해 알아보던중 Toss의 발표 내용을 듣게 되었고 GoCD를 적용해보려 한다. 물론 Toss의 내용을 모두 담기엔 오버 엔지니어링에 해당하기에 지금 필요한 부분만 발췌해서 부분적으로 적용해보기로 했다. 우선 CI/CD에 대해 알아보자.

1. 개념 정리

1-1. CI(Continuous Integration)

CI, 지속적인 통합이다. CI는 코드 변경 사항, 예를들어 풀 리퀘스트나 이슈, push 등 변경사항이 생길 경우 빌드와 테스트를 자동으로 수행해준다. 코드가 변경되었을때 기존 코드와 충돌이 발생하지는 않는지 테스트하여 코드 퀄리티가 유지되도록 한다.

1-2. CD(Continuous Deployment)

CD, 지속적인 배포라는 뜻을 가지고 있다. 프로젝트를 배포를 자동화하고 프로젝트의 레포지토리에서 사용자에게 전달하는 배포 과정까지를 담당한다. 제공하는 서비스가 많아질 수록 배포 과정은 복잡해지게 되고 이 과정에서 배포를 자동화, 템플릿화 하고자 CD가 쓰인다.

CD를 제공하는 소프트웨어는 다음과 같다.

  • GitHub Actions
  • Jenkins
  • CircleCI
  • GitLab

등 대부분의 CD기능을 제공하는 소프트웨어가 CI 기능 또한 제공하고 있다. 이는 CD와 CI가 함께 있으면 시너지를 내는 기능이라 그렇다. 코드를 업데이트 하기만 해도 한 플랫폼에서 빌드, 테스트, 배포까지 자동화할 수 있으니 말이다. 반면 오늘 소개할 GoCD는 이름에서부터 CD를 강조한다. 처음 설계될 당시부터 CD에 집중하겠다는 목표를 가지고 시작한 소프트웨어인 만큼 상대적으로 CI 기능은 부족할 수 있다. 그렇지만, 우리에겐 강력한 CI 도구인 GitHub Action가 있으니 CI는 깃허브에서 실행하고 GoCD로 배포하면 된다.

1-3. 그래서 GoCD가 필요한가?

GoCD는 소규모 스타트업, 몇 개의 서비스만을 운용하는 분들에게는 적합하지 않다. 대규모의 배포를 안정적으로 지원하기 위해 만들어졌고 파이프라인을 한 곳에서 관리하고 확인할 수 있도록 구성되었다. GoCD의 강점은 Web UI가 깔끔해서 보기 좋게 정리할 수 있다는 점이다. 또한 복잡한 워크플로우를 구성하기에 알맞은 구조를 채택하고 있고 따라서 워크플로의 변동이 많은 대규모 기업에 적합하다.

특히 self-hosted로 제공되기 때문에 상시 가동되는 안정적인 서버가 필요하다. 대부분 AWS를 사용하겠지만 굳이 배포 프로그램 하나 사용하자고 이런 낭비를 할 필요는 없지 않을까.

반대로 self-hosted의 장점은 일단 무료라는 점이고 별다른 제약이 없다는데에 있다. 필자처럼 개인이 홈서버를 운용해 이런 플랫폼에 관심이 있거나, 배포되는 서비스가 많은 기업이라면 고려해볼만 하다. 제공 환경도 Windows, Linux(RPM, Devian, Docker Containers), macOS등 굉장히 다양한 환경을 지원하기 때문에 설치에 별다른 제약은 없다.

2. GoCD 설치

GoCD 설치는 Windows, macOS, Debian 등의 플랫폼에서 설치할 수 있고 Docker와 k8s까지 지원한다. 참고로 서버와 에이전트(코드 배포 서버)가 나뉘어 있기 때문에 둘 다 설치해야 한다.

2-1. Server 설치

macOS의 경우 x64와 ARM 아키텍처 모두를 지원하니 필자처럼 Mac M1 서버로 돌리는 분들도 걱정할 필요 없다.

zip파일 압축을 해제하고 다음 명령어를 입력해 폴더에 접근한다.

cd go-server-20.5.0

다음 명령으로 서버를 실행할 수 있다.

background 모드:

./bin/go-server start	

서버 종료는 다음 명령을 실행하면 된다.

./bin/go-server stop	# 서버 종료
./bin/go-server restart  # 서버 재시작
./bin/go-server console	  # foreground 모드

다른 환경에서 설치하려면 다음 문서를 참고하면 된다. 공식문서가 깔끔하게 적혀있어 설치나 트러블슈팅하는데엔 문제가 없을 정도다.

https://docs.gocd.org/current/installation/installing_go_server.html

2-2. Agent 설치

서버 설치 방식과 동일하다. https://docs.gocd.org/current/installation/installing_go_agent.html 에서 환경을 선택해준 뒤 압축을 풀고 실행해주면 된다.

역시나 서버와 마찬가지로 압축을 푼 폴더로 이동해준 후 아래 명령어를 통해 실행할 수 있다.

background 모드:

./bin/go-agent start	
./bin/go-agent stop	# 서버 종료
./bin/go-agent restart # 서버 재시작
./bin/go-agent console # foreground 모드

2-3. 버그..?

혹시나 macOS에서 이런 메시지가 뜬다면 아래 명령어를 입력하시면 된다.

xattr -d -r com.apple.quarantine .

3. GoCD 구축

http://localhost:8153 으로 접속하면 다음과 같은 화면이 뜬다.

파이프라인 레포지토리를 지정하고 job과 task등을 지정할 수 있다. 초보자도 쉽게 세팅할 수 있도록 깔끔한 web ui를 제공하고 배포 단계를 확인하는데 어려움이 없게 잘 설명해놓았다.

GitHub와 연동할때 아래 Advanced Settings을 열고 Repository Branch를 main으로 지정해야 한다. 아마 master가 기본으로 지정되어 있을 텐데, GitHub 정책이 바뀌어서 main으로 지정해야 연결 에러가 안뜬다. (바뀐지가 언젠데..)

정상적으로 연결되면 Connection OK가 뜬다.

이제 파이프라인 이름과 스테이지 이름을 지정하면 된다. GoCD에서 파이프라인은 각각의 스테이지를 포함하는 워크플로우의 개념이다. 아마 프로젝트 이름이라고 하면 이해하기 쉬울 듯 하다. 스테이지 이름은 하위 job을 포함하는 단위이다.

빌드, 테스트, 배포를 실행하기 위한 작업을 실행한다. 여기서는 docker compose로 배포할 예정이기 때문에 docker compose up -d 명령이 tasks로 들어가면 된다.

아래 Save + Run this pipeline 버튼으로 바로 실행해볼 수 있다.

3-1. GoCD password 지정

GoCD를 처음 세팅하면 누구나 접근할 수 있다. 따라서 비밀번호를 지정해주어야 하는데 우선 다음 명령을 통해 비밀번호 파일을 생성해야 한다.

htpasswd -c -s password user

이후 Authorization Configurations페이지로 이동해 Add버튼을 클릭해준다.

그럼 아래 사진처럼 Plugin을 Password file로 지정해주고 htpasswd를 통해 생성한 파일 경로를 아래 Password file path: 에 기입해준다. 이후 check connection 버튼을 클릭해 적용 여부를 확인한다.

Save 버튼 클릭 후 login페이지로 이동해 유저 이름과 패스워드를 입력한다.

정상적으로 유저가 추가되면 아래 화면을 볼 수 있다.

4. Docker Compose 설정

GoCD의 배포를 원할하게 하기 위한 Docker Compose 설정을 소개한다. 사실 대부분의 서비스 배포 과정에서 컨테이너 배포는 기본이다. 그중에서 Docker Compose를 통한 배포는 가장 널리 쓰이는 방식이다. 사실 오늘 포스트에서 핵심은 아니기 때문에 간단히 소개만 하고 빠르게 지나가겠다.

4-1. Dockerfile 설정

FROM node:18
WORKDIR /app 
COPY package*.json /app 
RUN npm install 
RUN npm install pm2 -g
COPY . /app 
RUN npm run bundle:prod
CMD [ "pm2-runtime", "start", "npm", "--", "start" ] 
EXPOSE 9018

4-2. Docker Compose 설정

필자의 경우 ngnix reverse proxy로 대부분의 서비스를 운용하기 때문에 VIRTUAL_HOST를 지정해 구성했다.

version: '3.1'

services:
  main:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - 9018:9018
    environment:
      VIRTUAL_HOST: facemesh.devent.kr
      LETSENCRYPT_HOST: facemesh.devent.kr
      LETSENCRYPT_EMAIL: hhj@devent.kr
    network_mode: "bridge"

5. 파이프라인 배포

아래 사진처럼 현재 진행중인 배포 파이프라인을 한 페이지에서 볼 수 있다.

파이프라인에서 history를 클릭하고 노란색 deploy바를 클릭하게 되면 아래와 같이 화면이 나온다. 아래는 에이전트를 이 서버에 설치하지 않았기 때문에 에이전트를 기다린다는 상태가 뜬다.

위 화면에서 콘솔 모양 버튼을 클릭하면 아래와 같이 배포되는 과정을 출력할 수 있다. 각각의 Tasks가 진행되는 콘솔을 출력하는 것으로 현재 배포 상황을 자세히 알아볼 수 있다.

배포가 완료되면 초록색 확인 마크와 함께 정상적으로 배포되었음을 알 수 있다.

배포를 위해서는 메인 페이지에서 파이프라인을 찾고 실행 버튼을 클릭해주면 된다.

그럼 아래 사진과 같이 새로운 인스턴스 번호가 생기며 배포가 진행되게 된다.

6. 후기

일단 깃허브와의 연동성이 좋다. git 레포가 변경됨에 따라 자동으로 추적하여 배포를 진행하고 yaml파일 또는 web wizard UI를 통해 전문가와 초보자 모두 편하게 사용할 수 있도록 구성되어 있다. 기타 다른 CI/CD 툴 (jenkins)와 비교했을때 비교적 학습 곡선이 낮고 직관적으로 사용한다는 점이 돋보였다.

특히 인프라 분야는 배포 실수가 많고 환경설정과 더불어 신경써야할 요소가 많은 만큼, GoCD는 이러한 부분에서 휴먼에러를 줄이려는 노력이 보인다.

동시에 많은 환경에서 안정적인 설치 및 운영이 가능하다는 점도 장점이었다. 필자의 경우 macOS ARM 환경을 사용하고 있는데, 이런 마이너한 환경도 지원하는 세심함은 정말 좋았다. (GitLab server는 지원 안하던데..)

다만 GoCD 자체적으로 cloud 환경을 제공하지는 않는다. 엔터프라이즈 용의 self-hosted 만을 지원하기 때문에 그렇다. 그래서인지 문서가 깔끔히 정리되어 있고 보기에 별다른 문제는 없었다.

이 포스트에서는 GoCD의 설정과 설치를 알아보았다. 워낙 잘 알려지지 않은 CD 툴이기도 하고 한국에서는 관련 포스트를 찾아보기 힘들기 때문에 이렇게 소개해봤다. Toss 팀에서 사용하고 있다길래 국내에도 관련 사용자가 많아지길 바라며 (홈서버 덕후라면 강추다) 글을 마친다.

profile
소프트웨어 개발자. 맹목적인 기술 의존을 경계합니다.

0개의 댓글