코딩성장스토리

CI/CD(Github action) 본문

기타

CI/CD(Github action)

까르르꿍꿍 2023. 3. 27. 19:30

CI/CD에 대해 공부를 진행하면서 배웠던 거에 적어 보려한다.

 

 

CI/CD의 개념

CI란? 

-"CI"는 개발자를 위한 자동화 프로세스인 지속적인 통합(Continuous Integration)을 의미합니다. 지속적인 통합이 제대로 구현되면 애플리케이션 코드의 새로운 변경 사항이 정기적으로 빌드 및 테스트를 거쳐 공유 리포지토리에 병합

CD란?

-"CD"는 지속적인 서비스 제공(Continuous Delivery) 및/또는 지속적인 배포(Continuous Deployment)를 의미하며 이 두 용어는 상호 교환하여 사용됩니다. 두 가지 의미 모두 파이프라인의 추가 단계에 대한 자동화


CI/CD를 지원해주는 툴은 여러개가 있다.(github action, jenkins 등등...)

여기서 나는 가장 익숙하게 접할 수 있는 Github action 을 다루어 보려고 한다.

Github action을 사용하면 빌드,테스트를 진행시켜줄 runner가 필요하다. 

간단히 생각하면 빌드,테스트 진행이 필요한 서버이다.

(runner는 github 레포지토리에 지정한 행동이 생기면 자동으로 진행이 된다.)

그리고 runner에는 두가지 방식이 있다.

 

1. GitHub-hosted runners:(Github 에서 제공해줌 )

  • 자동으로 업데이트되느 운영체제 및 사전 설치된 패키지들과 도구들 및 self-hosted runner 애플리케이션을 사용할 수 있다.
  • 관리와 유지보수를 GitHub에서 한다.
  • 모든 job 실행에 깨끗한 인스턴스를 제공한다.
  • GitHub plan안에서 무료 시간을 사용할 수 있다.(무료 시간을 초과하면 분당 요금이 적용된다,public repository는 무료)

2. Self-hosted runners: (우리가 사용하는 서버에 runner을 설치하고 실행가능)

  • 러너의 자동 업데이트를 비활성화할 수 있지만 self-hosted runner 애플리케이션에 대한 자동 업데이트만 수신한다.
  • 사전 결제된 클라우드 서비스나 로컬 머신을 사용할 수 있다.
  • 하드웨어나 운영체제, 소프트웨어, 보안 요구사항에 맞게 커스터마이징할수 있다.
  • 모든 job 실행에 깨끗한 인스턴스가 필요하지 않는다.
  • GitHub Actions를 무료로 사용할 수 있으나, runner 머신에 대해 유지보수 비용을 부담해야 한다.

 

위 사진이 self-hosted와 hosted의 차이이다.

 


여기서 내가 궁금 했던 점이 있다.

 

self-hosted runner에서 빌드,배포를 할 경우 배포할 서버에서 파일이 갱신되므로 배포까지 바로바로 진행이 된다.

하지만 Github-hosted인 경우는 빌드,배포가 Github runner 서버에서 진행이 될뿐 내가 배포되길 원하는 서버에 배포를 하려면 어떻게 해야하는가이다.

 

사실 여기에는 여러가지 방법이 있다. 

1. dockerhub에 이미지 파일을 만든후 Rsycn 툴을 이용해 원격에 있는 서버(내가 배포할 서버) 에 파일을 옮기고 ssh 접근으로 명령어 실행

2. aws codeDeploy + S3로 배포 후 ssh 접근으로 명령어 실행

등등 이 있다.

(Rsync(Remoe Sync)는 원격에 있는 파일과 디렉토리를 복사하고 동기화 하기 위해서 사용하는 툴이며 동시에 네트워크 프로토콜이다) 안써도 배포가능

 

나는 1번방식을 접해 보았다.

Rsync는 처음 보는 용어이고 이걸 어떻게 사용하는지 어렵다. 

그래서 Gitbub marketPlace에 사용하기 쉽게 만들어진 코드들이 많다  

예를들어

https://github.com/easingthemes/ssh-deploy

 

GitHub - easingthemes/ssh-deploy: GitHub Action for deploying code via rsync over ssh. (with NodeJS)

GitHub Action for deploying code via rsync over ssh. (with NodeJS) - GitHub - easingthemes/ssh-deploy: GitHub Action for deploying code via rsync over ssh. (with NodeJS)

github.com

이런 방식이 있다.

이해하기 쉽게 코드를 보자  (github marketplace에서 지원된 코드를 많이 사용한 코드) -사용법만 알면 상당히 편리하다

name: deploy

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v3
      - uses: gradle/wrapper-validation-action@v1
      - uses: docker/setup-qemu-action@v2
      - uses: docker/setup-buildx-action@v2
      - name: Login to DockerHub                        //도커허브 로그인
        uses: docker/login-action@v2              //github marketplace에서 지원 
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Build and Push a Main Docker Image   //dockerhub에 이미지 올리기
        uses: docker/build-push-action@v3
        with:
          context: .
          platforms: linux/amd64,linux/arm64
          push: true
          tags: myunghyunnero/test:latest
      - name: Deploy Main Docker Compose Production Configuration    //내 서버에 이미지 배포
        uses: easingthemes/ssh-deploy@v2         //github marketplace에서 지원
        env:
          REMOTE_HOST: ${{ secrets.REMOTE_SSH_HOST }}
          REMOTE_PORT: ${{ secrets.REMOTE_SSH_PORT }}
          REMOTE_USER: ${{ secrets.REMOTE_SSH_USERNAME }}
          SSH_PRIVATE_KEY: ${{ secrets.REMOTE_SSH_KEY }}
          SOURCE: .deploy/
          ARGS: -avz --delete
          TARGET: ${{ secrets.REMOTE_TARGET }}   
      - name: Run Main Docker                 //내 서버에서 도커 이미지 실행
        uses: appleboy/ssh-action@master    //github marketplace에서 지원
        env:
          TARGET: ${{ secrets.REMOTE_TARGET }}
        with:
          host: ${{ secrets.REMOTE_SSH_HOST }}
          port: ${{ secrets.REMOTE_SSH_PORT }}
          username: ${{ secrets.REMOTE_SSH_USERNAME }}
          key: ${{ secrets.REMOTE_SSH_KEY }}
          envs: TARGET
          script_stop: true
          script: |
            cd $TARGET
            docker compose -f docker-compose-production.yml pull
            docker compose -f docker-compose-production.yml up -d test
            docker image prune -af