GitHub action 이용하여 자동 배포 하기 (CI, CD)

2023. 8. 14. 00:00DevOps/Git & GitHub

반응형

git 을 기본적으로 사용할 줄 안다고 가정 하고 하겠다. 

window 상에서 git 을 사용하고 싶다면 아래 link 에서 download 받아 설치하자

https://git-scm.com/download/win

 

Git - Downloading Package

Download for Windows Click here to download the latest (2.41.0) 32-bit version of Git for Windows. This is the most recent maintained build. It was released 26 days ago, on 2023-07-13. Other Git for Windows downloads Standalone Installer 32-bit Git for Win

git-scm.com

Docker 관련은 아래를 참조하자

https://yogingang.tistory.com/444

 

WSL 을 이용하여 Ubuntu 에 Docker 를 이용하여 배포 - 01

윈도우스에서 docker desktop 없이 docker 를 사용하고 싶을 수 있다. wsl 설치 부터 docker 설치 까지 과정을 확인하려면 아래를 참고하자 https://yogingang.tistory.com/426 솔루션 파일이 있는 폴더에 Dockerfile을

yogingang.tistory.com

 

요즘은 개발자에게 개발만 요구 하지 않는다. 

devops (그런건 없다...)라는 말을 별로 좋아 하지 않지만  실제 개발자가 개발만 할 수는 없다.

회사에 deploy 관련된 infra 를 따로 관리해주는 팀이 없다면 개발자가 해야한다.

 

개발자가 가장 단순하게 CI , CD 를 구현 하는 방법은 azure, aws, google cloud 를 제외하고는

gitlab 과 github 에서 지원하는 agent 또는 action 을 이용하는 수 밖에 없다.

 

이번 강좌에서는 그 중에서 Github Action 을 이용한 배포에 대해서 알아보자.

 

자신의 Github 에서 Action 을 적용할 Repository 로 이동한다. 

상단에 Settings--> 왼쪽 Actions/Runners 선택 --> 오른쪽 상단 New self-hosted runner

WSL 에 설치해서 처리 할테니 Linux 를 선택하자

그럼 아래쪽에  Download 부터 Configure 그리고 self-hosted runner 를 고르는게 나온다. 

우리는 wsl 에 runner 를 설치해서 사용할 테니 self-hosted runner 를 사용하자

 

이제 wsl 을 통해 ubuntu 에 접속하자 (자신이 wsl 에 설치한 linux system 에 접속하자)

그리고 다음을 실행 하자

mkdir actions-runner && cd actions-runner

최신 runner 도 다운로드 받자

curl -o actions-runner-linux-x64-2.307.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.307.1/actions-runner-linux-x64-2.307.1.tar.gz

압축도 해제해주고

tar xzf ./actions-runner-linux-x64-2.307.1.tar.gz

저장소 연결

./config.sh --url [저장소 주소] --token [토큰 값]

이제 github  에서 확인해보자 runners 에 있다. 

이제 쉘 에서 다음을 실행 하자

./run.sh

이제 workflows 디렉토리 안에 actions 사용시 금방 생성한 self-hosted runner 를 이용해 build 되도록 yaml 파일을 만들어주자

set up  a workflow yourself 를 실행하자

아래를 입력하자 (self hosted runner 를 썼을 때는 run-on 을 아래와 같이 구성해야 한다. 만약 label 까지 했다면

[self-hosted, linux, x64,label명]  까지 해야 한다.

name: checkout-build-run-docker
on: 
  workflow_dispatch:
jobs:
  echo:
    runs-on:  [self-hosted, linux, x64]
    steps:
      - run: ls -al
      - uses: actions/checkout@v3

위와 같이 하면 checkout 이라는 github 에서 미리 정의된 action에 의해 최신 source 파일이 CI ( 우리는 wsl ubuntu) 에 download 된다.

 

이제 Dockerfile 을 실행 하도록 해서 image 를 build 하자

name: checkout-build-run-docker
on: 
  workflow_dispatch:
jobs:
  echo:
    runs-on:  [self-hosted, linux, x64]
    steps:
      - name: Check out code
        uses: actions/checkout@v3
      - name: Build docker images
        run: docker build -t signalr-template -f Dockerfile .

다 실행되었다면 docker run 을 통해 docker 를 실행하자

name: checkout-build-run-docker
on: 
  workflow_dispatch:
jobs:
  echo:
    runs-on:  [self-hosted, linux, x64]
    steps:
      - name: Check out code
        uses: actions/checkout@v3
      - name: Build docker images
        run: docker build -t signalr-template -f Dockerfile .
      - name: Run docker
        run: docker run -it -p 5004:5004 --rm signalr-template

이제 Github action 에서 workflow 를 직접 실행 시켜보자

Run workflow 를 click 하면 실행한다.

그러면 실행하다가 docker run 에서  "Device is not a TTY error" 에러가 날 것이다. 

이부분 부터 해결해보자

name: checkout-build-run-docker
on: 
  workflow_dispatch:
jobs:
  echo:
    runs-on:  [self-hosted, linux, x64]
    steps:
      - name: Check out code
        uses: actions/checkout@v3
      - name: Build docker images
        run: docker build -t signalr-template -f Dockerfile .
      - name: Run docker
        shell: 'script -q -e -c "bash {0}"'
        run: |
          docker run -it -p 5004:5004 --rm signalr-template

자 이렇게 실행하면 실행은 되는데 아래와 같이 Run docker 부분에서 영원히 돌고 있을 것이다.

어쩔수 없다. 우리가 demon 에서 실행 한 것이 아니기 때문이다. 

workflow 를 cancel 하자. 아래와 같이 log 를 console 보여주는 대화형으로 docker 를 실행해서 그렇다.

이제 이부분을 demon 형태로 실행되도록 수정해서 문제를 해결해 보자

일단 현재 self hosted runner 에서 실행중이니 runner 를 설치한 server 로 이동하자

그리고 이 server 에서  실행되고 있는 docker container 를 stop 하고 image 를 삭제하자

docker stop [container-id]
docker rmi [image-name]

자 그런데 demon 으로 만들기 전에 생각할 것이 하나 있다. 

자동으로 배포 하려는 건데 새로 배포할때 마다 docker stop 과 docker rmi 를 계속 해줄수는 없다.

workflow 에 추가해서 자동으로 처리되도록 하자

몇몇 코드를 수정해야 한다. 

name: checkout-build-run-docker demon
on: 
  workflow_dispatch:
jobs:
  echo:
    runs-on:  [self-hosted, linux, x64]
    steps:
      - name: Check out code
        uses: actions/checkout@v3
      - name: Stop and remove existing container
        run: |
             CONTAINER_NAME=signalr-template-container
             RUNNING_CONTAINER_ID=$(docker ps -aq -f "name=$CONTAINER_NAME")
             if [ ! -z "$RUNNING_CONTAINER_ID" ]; then
              echo "Stopping and removing container: $RUNNING_CONTAINER_ID"
              docker stop "$RUNNING_CONTAINER_ID"
              docker rmi signalr-template
             else
              echo "No running container with name $CONTAINER_NAME found."
             fi
      - name: Build docker images
        run: | 
             docker build -t signalr-template -f Dockerfile .
             
      - name: Run docker
        shell: 'script -q -e -c "bash {0}"'
        run: |
          docker run --name signalr-template-container -d -p 5004:5004 --rm signalr-template

위 workflow 를 확인하면 

"name: Stop and remove existing container" 

추가 되었다. 이 부분이 docker 를 stop 하고 image 를 삭제하는 부분이다. 

if 문은 container 와 image 가 없을 경우 error 가 생겨 더이상 workflow 진행이 되지 않는 것을 방지 하는 것이다. 

이렇게 하고 실행하면 정상적으로 실행이 되고

내 runner 가 존재하는 곳에  자동으로 배포가 된다. 

세상 참 좋아졌다.!!! 하!..

 

 

관련영상

https://youtu.be/AWqyot7Cojs

 

반응형

'DevOps > Git & GitHub' 카테고리의 다른 글

GitLab CI , CD  (0) 2023.08.28