GitHub Actions로 CI/CD 구축하기

Lucas.Choi·2024년 10월 12일

웹 호스팅

목록 보기
3/5

GitHub Actions는 GitHub가 제공하는 CI/CD 도구로 소프트웨어 개발 워크플로우를 자동화할 수 있도록 도와준다.

주요 개념

1. 워크플로우(Workflow)

  • Workflow는 자동화하고자 하는 일련의 작업을 정의하는 것으로, 코드가 어떤 branch에 작업이 일어날 때, 빌드, 테스트, 배포 등의 작업이 자동으로 수행될 수 있도록 설정할 수 있다.
  • 주로 github repository 내에서 설정파일(.yml)을 작성해서 사용한다.

2. 이벤트(Event)

  • 이벤트는 워크플로우가 실행되는 조건이다. 예를 들어, 코드 push, pull request, schedule, repo 생성 등이 이벤트가 될 수 있다. 이런 이벤트가 발생하면 GitHub Actions가 자동으로 설정된 워크플로우를 실행하게 된다.

3. 잡(Job)

  • 잡은 워크플로우 내에서 개별적으로 실행되는 작업의 단위이다. 각 잡은 독립된 가상 환경에서 실행된다. 여러 잡을 동시에 수행하거나, 여러 잡들을 순차적으로 수행되도록 할 수 있다.

4. 스텝(Step)

  • 스텝은 잡 안에서 실행되는 개별 작업이다. 각 스텝은 명령어를 실행하도록 하거나, github에서 제공하는 액션을 호출할 수 있다.

5. 액션(Action)

  • 액션은 스텝에서 사용할 수 있는 재사용 가능한 명령어 모음으로 github에서 기본적으로 제공하는 액션이나, 다른 사람이 만들어 놓은 액션을 가져다 사용할 수 있다.

workflow.yml로 프로젝트를 개인 서버에 배포하기

name: Docker Image CI		# workflow 이름을 지어준다.

on:
  push:
    branches:
      - "main"				# main 브랜치에 push 될 때 해당 workflow를 실행한다.
jobs:	# job을 수행한다.
  build:	# 프로젝트를 빌드(CI)
    runs-on: ubuntu-latest	# build 할 가상환경을 지정해 준다. 이후의 작업은 이때 설정한 가상환경에서 수행된다.
    
    steps:
      - name: Checkout		# checkout 액션을 통해 가상환경에서 레포지토리를 다운받은 폴더로 이동
        uses: actions/checkout@v4.2.1
        with:
          ref: ${{ github.ref }}
          
      - name: Set up JDK 17	# java 17 버전을 설치한다.
        uses: actions/setup-java@v4.4.0
        with:
          java-version: '17'
          distribution: 'temurin'
          
      - name: Grant permission for gradlew	# gradlew 파일에 실행 권한을 부여하여 다음 단계에서 gradlew가 빌드 명령을 수행할 수 있도록 한다.
        run: chmod +x ./gradlew
        
      - name: Build with Gradle	# 프로젝트를 clean 상태로 정리한 후, test를 생략하고 빌드를 수행.
        run: ./gradlew clean build -x test
        
      - name: Docker build and publish	# docker 이미지를 생성하고 docker hub에 이미지를 업로드한다.
        run: |
          echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
          docker build -t ${{ secrets.DOCKER_USERNAME }}/${{ vars.APP_NAME }}:${{ github.ref_name }} .
          docker push ${{ secrets.DOCKER_USERNAME }}/${{ vars.APP_NAME }}:${{ github.ref_name }}

위 작업이 수행되면 docker hub에 내가 빌드한 프로젝트의 docker image가 올라간 것을 확인할 수 있다.

  deploy:	# build 된 docker 이미지를 서버에서 배포(CD)
    needs: build	# build가 정상적으로 수행된 경우에만 배포가 되도록 한다.
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - name: My Server Login and Docker Image pull and run	# 내 서버에 접속해서 docker 이미지를 pull 하고 이를 run 하여 프로젝트 container를 생성/실행한다.
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USERNAME }}
          password: ${{ secrets.SERVER_PASSWORD }}
          port: ${{ secrets.SERVER_PORT }}
          script: |
            echo ${{ secrets.SERVER_PASSWORD }} | sudo -S docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
            echo ${{ secrets.SERVER_PASSWORD }} | sudo -S docker stop ${{ vars.APP_NAME }}
            echo ${{ secrets.SERVER_PASSWORD }} | sudo -S docker rm -f ${{ vars.APP_NAME }}
            echo ${{ secrets.SERVER_PASSWORD }} | sudo -S docker network create ${{ vars.APP_NAME }}_net || true  # 네트워크 생성
            echo ${{ secrets.SERVER_PASSWORD }} | sudo -S docker pull ${{ secrets.DOCKER_USERNAME }}/${{ vars.APP_NAME }}:main
            echo ${{ secrets.SERVER_PASSWORD }} | sudo -S docker run -d --name ${{ vars.APP_NAME }} --network ${{ vars.APP_NAME }}_net -p ${{ secrets.SERVER_PORT }}:8080 ${{ secrets.DOCKER_USERNAME }}/${{ vars.APP_NAME }}:main  # 네트워크 설정
            echo ${{ secrets.SERVER_PASSWORD }} | sudo -S docker image prune -f

내 서버에서 docker ps 명령어로 작업 중인 프로세스를 확인하면 내 프로젝트 docker container가 생성/실행되는 것을 확인할 수 있다.

이 과정에서 서버 정보와 같이 민감한 정보들은 github repository > settings > Secrets and variables > actions에서 저장할 수 있다.

0개의 댓글