시냅스

Jekins 대신 Github Actions 를 쓰게 된 이유 본문

개소리

Jekins 대신 Github Actions 를 쓰게 된 이유

ted k 2023. 6. 4. 18:14

Jenkins

새로운 프로젝트를 진행하며 CI/CD 의 구성을 꽤 우선순위로 잡았다.

워커 인스턴스에서는 Docker로 감싼 NGINX + WAS 여러대를 생각하고 있어

프로젝트 규모가 크지 않지만 여러가지 확장성과 가시성을 고려할 때 Jenkins 를 고려하였다.

 

배포 시간이 긴 것은 크게 문제가 되지 않을 것 같아, 젠킨스를 프리티어 인스턴스에서 전담하게 하였다.

그리고 무수한 page fault 의 악수 요청이 들어왔다...

 

 

1.4 초 라고 써있었지만, 1.4초 뒤에 인스턴스가 먹통이 돼서 움직이지 않았다…

(약 1시간 이상 기다렸다…)

CPU Usage 가 100% 로 치솟고 메모리가 80% 이상이 되는 기현상을 발견했다.

demand paging을 위한 메모리 과할당 상황이 발생한 것으로 판단했다.

책에서나 보던 것을 실제로 발견하니 신기하고도 흥미로웠다.

 

직접 OS 를 깔았더라면 설치하면서 swap space 를 설정했겠지만

내가 잘 모르는지, 설정이 없는 것인지 어쨌든 문제 상황 후에 swap space 를 설정해주었다.

 

 

 

대체로 머신의 메모리 용량의 2배를 swap space 로 권고하고 있다.

  • 물리 메모리보다 더 할당된 경우 swap space 에 in-out 하며 메모리를 할당함
  • swap space 는 Disk 에 할당되므로 Disk I/O 가 발생하는데, 당연히 cost 가 높음
  • 따라서 실제 프로그램의 실행보다 in-out 하는 데 들어가는 cost 가 더 높을 수 있음
  • 이를 Thrashing 이라고 함

따라서 1GB 의 2배인 2GB 를 추가로 할당해주고 실행해보았다!

 

 

 

꽤 긴 시간이었지만 문제없이 실행되었다.

다만 10분이 걸렸는데 이는 정말 아무것도 없는 프로젝트를 빌드하고 Docker Hub 에 올리기까지의 시간이었다.

물론, 프로젝트가 크진 않지만 그래도 꽤 코드들을 작성할거고, Test 도 할텐데… 이러면 문제가 될 것 같았다.

따라서 Github Actions 를 도입하기로 하였다.

 

 

 

Github Actions

github actions 는 github 에서 제공하는 간편한 툴이다.

yaml 파일을 사용하기 때문에 접근성이 높고 무료로 사용할 수 있어

우리가 하는 프로젝트처럼 가벼운 프로젝트에 적용하기 적합하다.

 

job 과 step 이라는 단계를 따라 각각의 action 들을 정의할 수 있다.

필요에 따라서는 cron 으로 스케줄링을 할 수 있게 제공한다.

또한 환경변수도 github 에서 repository 기준으로 설정할 수 있게 하니 아주 좋다!

아래는 우리가 설정한 CI/CD 를 위한 github actions 파일이다.

(같이 프로젝트를 하시는 분이 전담해서 해주셨다. ㅋㅋ)

 

name: dev-deploy

on:
  workflow_dispatch:
  push:
    branches: [ "develop" ]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Set up JDK 11
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'temurin'

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      - name: Build with Gradle
        run: ./gradlew clean build

      # 도커허브 로그인
      - name: Login to DockerHub
        uses: docker/login-action@v2
        with:
          username: ${{secrets.DOCKER_HUB_USERNAME}}
          password: ${{secrets.DOCKER_HUB_TOKEN}}

      # 도커 이미지 생성 및 도커허브 업로드
      - name: Create docker image and Upload to DockerHub
        env:
          NAME: imhero
          REPO: imhero
          IMAGE: imhero
        run: |
          docker build -f ./dockerfile -t $IMAGE .
          docker tag $IMAGE:latest $NAME/$REPO:latest
          docker push $NAME/$REPO:latest

      # ssh 접속 및 shell 실행
      - name: executing remote ssh commands using password
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.NCP_DEV_HOST }}
          username: ${{ secrets.NCP_DEV_USERNAME }}
          password: ${{ secrets.NCP_DEV_PASSWORD }}
          script: |
            ./imhero.sh

 

 

파일 내에 정의해둔 step 들을 따라가고, 마지막에는 ssh 로 접근하여 shell file 을 실행하게 된다.

shell file 내에는 deploy 를 위한 여러 설정들이 존재한다.

(기존의 image 를 지운다던가... volume 을 셋팅한다던가... 환경변수를 넘겨준다던가...)

jenkins 로 했다면 pipeline 으로 설정했겠지만 shell file 이 하나 더 있는 게 큰 흠이 되지는 않을 것 같다.

 

빌드 결과는 repository 의 actions 탭에서 확인할 수 있다.

 

 

 

젠킨스의 빌드타임이 10분이었던 것에 반해 github actions 는 1분 30초로 대폭 줄었다.

아직은 복잡한 설정을 필요로 하지 않는 상황이니 당분간은 github actions를 사용할 것 같다!

 

끝!

 

 

 

Comments