ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CI/CD] GithubAction에서 Docker 이미지 빌드
    Software engineer/Infra 2023. 6. 7. 14:54

    GithubAction이란?

    GitHub의 내장 CI/CD(Continuous Integration/Continuous Deployment) 서비스입니다. 소스 코드를 자동으로 빌드, 테스트 및 배포하는 데 사용됩니다. GitHub 리포지토리에서 이벤트에 따라 작업(Actions)을 실행하고 구성할 수 있습니다.

    GitHub Actions의 주요 특징과 사용 방법은 다음과 같습니다:

    1. 이벤트 기반 실행: 특정 이벤트(예: push, pull request, issue 등)가 발생할 때 작업을 자동으로 실행할 수 있습니다. 예를 들어, 코드 푸시 이벤트가 발생하면 빌드 및 테스트 작업을 실행할 수 있습니다.

    2. 작업 흐름(Workflows): 작업 흐름은 하나 이상의 작업으로 구성되는 일련의 단계입니다. 작업 흐름은 `. github/workflows` 디렉토리에 YAML 파일로 정의됩니다. 각 작업은 특정 작업 환경에서 실행되며, 사용자 정의 또는 미리 정의된 작업을 포함할 수 있습니다.

    3. 작업(Action): 작업은 코드 단위로 정의되며, 소프트웨어 빌드, 테스트, 배포 등 다양한 작업을 수행할 수 있습니다. GitHub Marketplace에서 작업을 공유하고 재사용할 수 있습니다.

    4. 작업 환경: 작업은 특정 환경(예: Ubuntu, macOS, Windows)에서 실행됩니다. 작업 환경은 필요한 소프트웨어, 도구, 라이브러리를 포함하며, 커스터마이징 할 수도 있습니다.

    5. 시크릿(Secrets): GitHub Actions은 암호나 인증 토큰과 같은 비밀 정보를 안전하게 관리할 수 있는 시크릿을 제공합니다. 작업에서 시크릿을 사용하여 보안에 민감한 데이터를 안전하게 전달할 수 있습니다.

    GitHub Actions를 사용하여 Django 애플리케이션의 CI/CD 작업을 구성할 수 있습니다. 예를 들어, 코드 푸시 이벤트가 발생하면 작업 흐름을 실행하여 소스 코드를 빌드하고 테스트한 후, 성공한 경우 EC2 인스턴스에 자동으로 배포할 수 있습니다.

     
     

    Docker 이미지 빌드

    .github/workflow/django.yml 

    name: Docker Image CI/CD
    
    on:
      push:
        branches: [ "main" ]
    
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
    
        # get commit hash id
        - id: commit
          uses: pr-mpt/actions-commit-hash@v2
          with:
            prefix: "commit-"
    
        - name: Build the Docker image
          run: docker build -t ${{ secrets.DOCKERHUB_ID }}/py-study-instagram:${{ steps.commit.outputs.short }} .
    
        - name: Docker image latest tagging
          run: docker tag ${{ secrets.DOCKERHUB_ID }}/py-study-instagram:${{ steps.commit.outputs.short }} ${{ secrets.DOCKERHUB_ID }}/py-study-instagram:latest
          
        - name: Docker-hub login 
          uses: docker/login-action@v2
          with: 
            username: ${{ secrets.DOCKERHUB_USERNAME }}
            password: ${{ secrets.DOCKERHUB_TOKEN }}
            
        - name: Docker-hub push w/ commit tag
          run: docker push ${{ secrets.DOCKERHUB_ID }}/py-study-instagram:${{ steps.commit.outputs.short }}
    
        - name: Docker-hub push w/ latest tag
          run: docker push ${{ secrets.DOCKERHUB_ID }}/py-study-instagram:latest
          
        - name: SSH remote command
          uses: appleboy/ssh-action@v0.1.10
          with:
            host: ${{ secrets.EC2_HOST }}
            username: ${{ secrets.EC2_USERNAME }}
            password: ${{ secrets.EC2_PASSWORD }}
            port: ${{ secrets.EC2_PORT }}
            script: |
              sudo docker stop py-study-instagram
              sudo docker rm py-study-instagram
              sudo docker pull ${{ secrets.DOCKERHUB_ID }}/py-study-instagram:${{ steps.commit.outputs.short }}
              sudo docker run --name py-study-instagram -p 8000:8000 -d ${{ secrets.DOCKERHUB_ID }}/py-study-instagram:latest

    1. - id: commit
    git commit에 경우 hash 코드를 해당 commit의 고유 id값으로 사용합니다. 해당 hash 코드를 사용하기 위해 추가한 action입니다.
    (참고: https://github.com/marketplace/actions/commit-hash)
     
    2. - name: Build the Docker image
    Docker 이미지를 빌드하는 action입니다. 1번에서 추출한 hash코드를 short 형태로 사용하기 위한 표현식입니다.
    ${{ steps.commit.outputs.short }} 
     
    3. - name: Docker image latest tagging
    빌드한 이미지에 latest 태그를 만드는 action입니다.
     
    4. - name: Docker-hub login
    빌드된 이미지를 Docker-hub에 올리기 위해 login 하는 action입니다.
     
    5. - name: Docker-hub push w/ commit tag, - name: Docker-hub push w/ latest tag
    각각 commit hash 코드 태그와 latest 태그 이미지를 Docker-hub에 push 하는 action입니다.
     
    6. - name: SSH remote command
    배포할 EC2에 접속해서 Docker-hub에 있는 이미지를 다운로드하고 실행하는 action입니다.
     

Designed by Tistory.