320x100
320x100

도입배경

서버를 배포하기 위해서는 배포 서버에 접속하여 터미널에서 직접 빌드 및 배포까지 수행해야한다

 

- 도입 전 고민

기존에 사용했었던 젠킨스와 깃허브 액션을 고민했었다

젠킨스를 사용하면 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 }}"

https://github.com/KNUT-Capstone-Design-team-1/wip-deep-learning-server-v2/blob/main/.github/workflows/github_action.yml

 

- 레포지터리에 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 방식으로 깃허브 액션을 편리하게 사용할 수 있다는 것이 정말 좋았고

시크릿 키 관리도 레포지터리에만 등록해놓으면 편리하게 사용할 수 있다는 점이 흥미로웠다

아직은 능숙하게 다루지는 못하지만 점차 발전시켜나가면서 효율적인 배포 로직을 구축해보겠다

 

 

 

참고자료

 

GitHub Actions의 유용한 작업(job) 설정

Engineering Blog by Dale Seo

www.daleseo.com

 

Github action 환경변수 설정

인텔리제이를 이용하여 환경변수를 설정할때는 보통 application.yml 이나 application.properies 에 선언하고 이용하게되는데환경변수에는 rds에 대한 암호도 들어가있기때문에 github같이 공용 repository에

velog.io

 

How To Deploy A Git Repository To A Server Using GitHub Actions

Learn how to deploy changes of a git repository to your own / a server using GitHub Actions when you push them.

www.programonaut.com

 

Github Actions를 이용해 CI/CD를 구축해보자(ssh 연결)

배포 자동화를 해놓지 않았을 때 인스턴스 접속 git pull 백엔드 폴더에서 yarn install -> 배포 프론트 폴더에서 yarn install -> yarn build -> 배포 배포 자동화를 해놓지 않았을 때는 위 과정의 반복이었다.

doooodle932.tistory.com

 

300x250
728x90