ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Github Action] GCS(Google Cloud Storage)에 코드 배포하기
    저장소/git 2022. 2. 1. 21:31

    GCS는 AWS의 S3와 동일한 개념으로 보면 됩니다. 여기서는 github action을 사용하여 특정 브랜치에 코드가 푸시됐을 때, GCS에 자동으로 배포하는 프로세스를 설명합니다.

    배포를 위해선 gcloud / gutil CLI를 사용해야 합니다. github action에서는 우리가 직접 설치할 필요 없이 마켓 플레이스에 있는 버전을 사용하면 됩니다.

    Set up gcloud Cloud SDK environment - GitHub Marketplace

    현재 bqgutil 에서는 워크로드 아이덴티티 제휴를 사용하지 못하고 기존 방식인 json key file을 매핑해야 합니다.

    GitHub - google-github-actions/auth: GitHub Action for authenticating to Google Cloud with GitHub Actions OIDC tokens and Workload Identity Federation.

    gutil CLI에서 rsync 라는 명령어을 사용해 변경된 파일을 github → gcs로 옮길 수 있습니다.

    gutil rsync

    rsync는 두 버킷 또는 디렉토리의 내용을 싱크하는 명령어입니다.

    gsutil rsync [OPTION]... src_url dst_url

    자세하게 누락되거나 변경된 데이터를 복사하고 추가/삭제된 파일이나 객체를 목적지인 GCS에 그대로 반영하여 출발지인 github과 동일하게 만들 수 있습니다. src_url에는 디렉토리, 버킷 또는 버킷 하위 디렉토리를 지정해야 합니다.

    workflow yml

    name: git to gcs
    
    on:
      push:
        branches:
        - main
    
    jobs:
      deploy:
        runs-on: ubuntu-latest
    
        steps:
        - name: Checkout
          uses: actions/checkout@v2
          with:
            ref: main
    
        - name: Setup gcloud
          uses: google-github-actions/setup-gcloud@v0
          with:
            service_account_key: ${{ secrets.GCS_SERVICE_ACCOUNT_KEY }}
            project_id: ${{ secrets.GCS_PROJECT_ID }}
            export_default_credentials: true
    
        - name: Deploy
          run: |-
            gsutil -m rsync -x "GCS에싱크하지 않을 목록" -R /home/runner/work/{repository이름}/{repository이름} gs://{GCS_BUCKET_경로}

    -m 옵션은 옮겨야 하는 파일이 많을 때 병렬로 수행하여 속도를 올리는 옵션입니다.

    -x 옵션은 제외할 파일이나 폴더를 명시하여 gcs에 반영을 하지 않을 수 있습니다. 문법은 파이썬 정규표현식 문법으로 https://docs.python.org/3/howto/regex.html 에서 확인할 수 있습니다.

    -R 이나 -r 옵션은 디렉터리, 버킷 및 하위 디렉터리도 동기화 되도록 처리하는 옵션입니다. 만약 해당 옵션을 사용하지 않으면 소스 URL과 도착 URL의 최상위 디렉토리만 싱크하고 하위 디렉토리는 건너뜁니다.

    위 방식은 vm에 main 브랜치를 체크아웃한 다음, 해당 폴더 경로를 그대로 gcs에 옮기는 방식입니다. 변경된 파일 또는 폴더만 변경하는 방식이 아니여서 repository의 사이즈가 크다면 오래걸릴 수도 있습니다.

    댓글