도입배경
서버를 배포하기 위해서는 배포 서버에 접속하여 터미널에서 직접 빌드 및 배포까지 수행해야한다
- 도입 전 고민
기존에 사용했었던 젠킨스와 깃허브 액션을 고민했었다
젠킨스를 사용하면 CICD를 금방 구축할 수 있었으나, 인프라가 바뀔때마다 UI에서 직접 설정을 해줘야하는 불편함이 존재해서 꺼려졌었다
- 깃허브 액션으로 선택한 이유
yml 파일만 작성해놓으면 인프라를 옮겨도 추가적인 작업없이 동일한 CICD를 실행할 수 있기 때문
목표
- 서버 별로 단독 실행, 단독 컨테이너, 도커 컴포즈 3가지 모드로 유연하게 배포를 할 수 있어야 한다
- 나중에 배포 서버를 옮겨도 추가적인 작업을 최소화 할 수 있어야 한다
세팅 방법
- .github/workflows/github_action.yml 작성
CICD가 배포 서버에 의존성을 갖지 않도록 github hosted 방식으로 결정.
SSH를 통해 배포 서버에서 빌드와 배포까지 수행한다.
템플릿을 통해 SSH를 실행하려고 했으나, 혹시 모를 보안 때문에 커멘드를 통해 SSH를 실행했다
작업하면서 알게된 것인데 지속적으로 사용해야하는 변수가 있으면
하나의 job 안에서 수행해야한다는 것이다
깃허브 액션은 job 하나 당 하나의 서버를 사용하기 때문에 서로 데이터가 공유되지 않는다
steps:
- uses: actions/checkout@v4
- name: install ssh keys
run: |
install -m 600 -D /dev/null ~/.ssh/id_rsa
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
ssh-keyscan -t rsa -H ${{ secrets.SSH_HOST }} > ~/.ssh/known_hosts
- if: contains(fromJSON('["STAND-ALONE", "SINGLE-CONTAINER"]'), github.event.inputs.deploy_mode)
name: run single mode
run: |
ssh -o ServerAliveInterval=3600 -vT ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} \
"cd ${{ secrets.WORK_DIR_DL }} && \
git pull && \
bash run.sh ${{ github.event.inputs.deploy_mode }}"
- 레포지터리에 secret key 등록
노출돼서는 안되는 정보들을 레포지터리에 시크릿키로 등록하면 깃허브 액션에서 직접 사용할 수 있다
SSH_HOST에는 배포 서버의 주소를 문자로 적어넣었다
과정
- 헤맸던점
SSH 비밀키와 공개키를 헷갈려서 3시간 가량을 낭비했었다
- 마주친 오류
`client_loop: send disconnect: Broken pipe`
SSH 통신 간 일정 시간동안 패킷이 교환되지 않으면 서버나 클라이언트에서 연결을 끊는 현상
본 작업에서는 CICD의 실행 시간이 5분이 지나면 오류로 처리됐었다
sudo vim /etc/ssh/sshd_config
```
ClientAliveInterval 7200
ClientAliveCountMax 20
TCPKeepAlive no
```
sudo systemctl restart sshd
sudo vim ~/.ssh/config
```
Host *
ServerAliveInterval 7200
ServerAliveCountMax 20
IPQoS=0x00
```
sudo chmod 600 ~/.ssh/config
git config http.postBuffer 52428800
위와 같은 방법들을 수행했었으나, 효과를 보지 못했었다
이 문제는 앞으로 해결해야할 숙제이다
한계
`client_loop: send disconnect: Broken pipe` 오류를 해결하지 못했다
우연히 40분이 넘게 진행된적이 있었는데, 빌드와 배포가 이렇게 오래걸려서는 안된다...
다음에는 이 오류의 제한 시간인 5분 이내로 3가지 모듈의 빌드 및 배포를 완수하도록 개선해야겠다
총평
지금까지 젠킨스만 써보다가 깃허브 액션을 처음 써봤는데 생각보다 편리하고, 장점이 많았다
일단 공개 레포지터리면 github hosted 방식으로 깃허브 액션을 편리하게 사용할 수 있다는 것이 정말 좋았고
시크릿 키 관리도 레포지터리에만 등록해놓으면 편리하게 사용할 수 있다는 점이 흥미로웠다
아직은 능숙하게 다루지는 못하지만 점차 발전시켜나가면서 효율적인 배포 로직을 구축해보겠다
참고자료
'CICD > Github action' 카테고리의 다른 글
github action CICD 브랜치에서 테스트 하는 방법 (1) | 2024.07.24 |
---|---|
Github Actions self-hosted Runner 등록 (0) | 2023.08.12 |
깃허브 액션 간단하게 알아보기 (0) | 2022.12.12 |