Git-Actions를 통해 CI/CD 파이프라인 만들기

강지원·2024년 1월 3일

1. GHCR 토큰 생성

우선 Git-Actions를 사용하기 위해선 내 깃에 접근하기 위한 토큰이 필요합니다.
토큰을 생성하기 위해 위 사진의 빨간색 박스의 Developer settings를 클릭합니다.

그 다음 Generate new token 버튼을 눌러 git에 접근하기위한 토큰을 생성해주어야합니다.

위 처럼 토큰 생성 페이지가 나오게되는데 여기서 Note에 Token 이름을 설정해주면되고,
Expriation은 원하는대로 설정하시면 됩니다.
마지막으로 select scopes에서 Token에 대한 권한을 설정해주어야하는데 저는 모두 체크해주었습니다.

설정을 마친 뒤 토큰을 생성하면 나오는 token의 key를 잘 복사해둡니다!!!

2. Actinos Secrets 설정

다음은 위의 토큰을 secret으로 등록해야합니다.
Git-Actions를 통해 CI/CD 파이프라인을 만들 레포지토리의 Settings으로 들어간 뒤에

위의 빨간색 버튼을 눌러 들어가줍니다.
여기서 ations에서 사용할 secret들을 등록 할 수 있습니다.

위 사진 처럼 Secret들을 등록하면 되는데 이번에 만들 파이프라인에서 필수적으로 들어가야하는 Secret들은

  • GHCR_TOKEN : 위에서 만든 TOKEN KEY
  • REMOTE_IP : 배포한 서버의 IP
  • REMOTE_SSH_ID : 배포한 서버의 username
    (ex. example123@123.213.123.01 에서 example123)
  • REMOTE_SSH_KEY : SSH로 접속하기위한 Private key
  • REMOTE_SSH_PORT : 22(ssh포트는 22)

입니다.

이렇게 secrets 설정을 완료했다면 이제 work flow 설정파일만 짜주면 됩니다.

work-flow 만들기

레포지터리에서 위의 사진의 경로로 build-deploy.yml 을 만들어 줍니다.

name: Deploy with Docker
# 본인이 만드는 pipeline의 이름입니다.

on:
  push:
    branches: [ main ]
    # 무슨 브랜치가 업데이트 될 때 Actions 를 작동시킬지 적습니다.
    # 본 실습에서는 main에 push(merge)가 될 때 작동합니다.
    # 리스트 형태이기 때문에 여러개를 적어도 됩니다.

env:
  DOCKER_IMAGE: ghcr.io/jiwonkkang/camong
  VERSION: ${{ github.sha }}
  CONTAINER_NAME: camong
  # Docker image 를 ghcr.io 에 올릴 때 우리의 github이름/이미지이름 으로 저장합니다. 이미지이름을 정해주면 된다.
  # Docker 컨테이너 의 이름을 camong 이라고 해놓은 것. 이름은 본인 임의로 정하면 됩니다.
jobs:
  build:
    name: Build
    runs-on: ubuntu-latest 
    steps:
      - name: Checkout
        uses: actions/checkout@v2 # git 레파지토리를 클론하는것과 같음
  
      - name: Setup docker buildx
        id: buildx
        uses: docker/setup-buildx-action@v1

      - name: Cache docker layers
        uses: actions/cache@v2
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ env.VERSION }}
          restore-keys: |
            ${{ runner.os }}-buildx-

      - name: Login to ghcr
        uses: docker/login-action@v1
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GHCR_TOKEN }}
          # 우리가 방금 복사해서 setting secrets 에 붙여줬던 token 이다. 이름을 기억해 넣어주자.
          # 우리의 ghcr.io 에 접근하기 위함이다.

      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          builder: ${{ steps.buildx.outputs.name }}
          push: true
          tags: ${{ env.DOCKER_IMAGE }}:latest

  deploy:
    needs: build
    name: Deploy
    runs-on: ubuntu-latest
    steps:
      - name: Docker login
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.REMOTE_IP }}
          username: ${{ secrets.REMOTE_SSH_ID }}
          key: ${{ secrets.REMOTE_SSH_KEY }}
          port: ${{ secrets.REMOTE_SSH_PORT }}
          script: |
            sudo chmod 666 /var/run/docker.sock
            echo ${{ secrets.GHCR_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin


      - name: Deploy
        uses: appleboy/ssh-action@master # 추적을 위해 스텝을 나누어놨지만 한스크립트에서 전부 돌려도댐.
        with:
          host: ${{ secrets.REMOTE_IP }}
          username: ${{ secrets.REMOTE_SSH_ID }}
          key: ${{ secrets.REMOTE_SSH_KEY }}
          port: ${{ secrets.REMOTE_SSH_PORT }}
          script: |
            docker pull ${{ env.DOCKER_IMAGE }}:latest

      - name: Run
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.REMOTE_IP }}
          username: ${{ secrets.REMOTE_SSH_ID }}
          key: ${{ secrets.REMOTE_SSH_KEY }}
          port: ${{ secrets.REMOTE_SSH_PORT }}
          script: |
            docker compose stop ${{ env.CONTAINER_NAME }} && docker rm ${{ env.CONTAINER_NAME }} && docker rmi ${{ env.DOCKER_IMAGE }}:latest
            docker compose up -d

위와 같이 work-flow를 작성합니다. 환경변수는 원하는대로 변경하면 됩니다.

이렇게하면 Github에 변경사항을 푸쉬했을때 work-flow가 작동하여 배포한 서버에 변경사항을 자동으로 적용할 수 있습니다.

참고) docker-compose.yml

version: "3.8"
networks:
  app-tier:
    driver: bridge
services:
  camong:
    container_name: camong
    networks:
      - app-tier
    image: ghcr.io/jiwonkkang/camong:latest
    environment:
      - ADMIN_PASSWORD=${ADMIN_PASSWORD}
      - BUCKET_NAME=${BUCKET_NAME}
      - CLIENT_SECRET=${CLIENT_SECRET}
      - GCP_KEY_PATH=${GCP_KEY_PATH}
      - GCP_PROJECT_ID=${GCP_PROJECT_ID}
      - DATABASE_URL=${DATABASE_URL}
      - DATABASE_USERNAME=${DATABASE_USERNAME}
      - DATABASE_PASSWORD=${DATABASE_PASSWORD}
      - GCS_KEY=${GCS_KEY}
    ports:
      - "8080:8080"
    restart: always
profile
디버깅중...

0개의 댓글