728x90

GITHUB ACTIONS을 통한 ECR 배포 및 EKS를 사용하기 위한 배포 스크립트이며, Github Actions에 대한 소개입니다.
깃헙 액션 레파지토리를 참고하면 좋습니다.

ON & ENV

on:
  push:
    branches: [ "dev" ]
env:
  AWS_REGION: ap-northeast-2
  AWS_ACCESS_KEY_ID: ${{ secrets.PROJECTT_AWS_ACCESS_KEY_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.PROJECTT_AWS_SECRET_ACCESS_KEY }}
  • {{ secrets.something }}의 경우 GitHub Secrets에 등록된 값으로 대체됩니다.
  • branches 배열의 경우 OR 조건으로, 배열 안에 작성된 브랜치 중 하나라도 코드가 푸시되면 실행합니다.
  • dev 브랜치에 코드가 푸시될 때 실행합니다.
    • pull_request, schedule, relase, workflow_dispatch, branches-ignore 등 다양한 이벤트가 있습니다.
on:
  schedule:
    - cron: '0 0 * * *'

on:
  release:
    types: [published]

on:
  push:
    branches-ignore:
      - master

jobs

build

jobs:
  build:
    runs-on: ['self-hosted']
    if: "!contains(github.event.head_commit.message, '[ci skip]' )"
  • runs-on필드는 Github actions 워크 플로우에서 작업이 실행된 환경을 지정.
    • self-hosted는 GitHub Actions Runner에 등록된 태그명으로, 해당 Runner에서 작업을 실행합니다.
    • runs-on 배열은 동시 조건으로, 배열 안에 작성된 태그를 모두 만족하는 Runner에서 작업을 실행합니다.
  • if는 조건문으로, github.event.head_commit.message[ci skip]이 포함되어 있으면 실행하지 않습니다.
    • 해당 메세지도 꼭 [ci skip]이 아닌 임의의 문자열이어도 상관 없습니다.

step

checkout

    steps:
      - uses: actions/checkout@v4
  • actions/checkout@v4는 GitHub Actions에서 제공하는 Action으로, 코드를 체크아웃합니다.
  • checkout은 리포지토리 접근, 서브 모듈 지원, 깊이 제한, 브랜치, 태그, 커밋, 작업 디렉토리, fetch 옵션 등을 지원합니다.

set-envs & run

      - name: set env
        id: set-envs
        env:
          K8S_KUSTOMIZATION_BASE_PATH: "project"
          ARGOCD_URI: "https://argocd.new-project.com/project"
          ECR_REPOSITORY_URI: "123456789.dkr.ecr.ap-northeast-2.amazonaws.com/project"
          # ECR REPO 를 만들고 나서 ECR REPO URI 를 넣어줘야 함 ARN test
          # $GITHUB_REF_NAME : 브랜치 명
          # 확인 중
        run: |
          if [ $GITHUB_REF_NAME = 'main' ]; then 
             PROFILE=prod
          elif [ $GITHUB_REF_NAME = 'dev' ]; then 
             PROFILE=dev
          else
             PROFILE=test
          fi

          TAG_NAME="${PROFILE}-$(date +'%Y%m%dT%H%M%S%Z')"
          ARGOCD_REPOSITORY_URL="${ARGOCD_URI}/project-api-${PROFILE}" 
  • 실행중인 브랜치에 따라 PROFILE을 설정합니다. 빌드된 이미지의 태그와 Argocd 저장소 URL을 설정합니다.
  • TAG NAME 예시
    • dev 브랜치에서 2024년 5월 1일에 실행될 경우 dev-20240501T123456UTC와 같은 태그가 생성됩니다.
    • 위의 특징을 가지고 ECR Lifecycle Policy를 설정할 수 있습니다.

AWS 자격 증명 (AWS GITHUB ACTIONS REPOSITORY)

      - name: Configure AWS credentials for AWS prod
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2
  • AWS Access Key와 Secret Key를 사용하여 AWS 자격 증명을 설정합니다.
    • 상단 env부분에서 Github Secrets에 등록된 값을 대입하는 코드가 존재합니다.
  • 해당 워크플로우를 통해 다음 단계에서 진행되는 AWS 서비스에 안전하게 접근할 수 있습니다.

AWS ECR 로그인

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1
  • Docker 이미지를 ECR에 푸시하기 전 필요한 인증 절차를 수행합니다.
  • 로그인을 성공할 경우 ECR에 접근하여 이미지를 저장하거나 가져올 수 있습니다.
      - name: Set up JDK 21
        uses: actions/setup-java@v3
        with:
          java-version: '21'
          distribution: 'corretto'
          # java aws
  • JDK 21버전을 설정합니다. 지정된 Java 버전을 설치하고 환경을 구성합니다.

Gradle을 사용한 빌드 (GRADLE GITHUB ACTION REPOSITORY)

      - name: Build with Gradle
        uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0
        with:
          arguments: bootJar
  • 해당 단계에서 생성되는 JAR파일은 배포 가능한 애플리케이션이며, 이후 Docker 이미지를 빌드할 때 사용됩니다.
      - name: Build, tag, and push image
        id: ecr
        env:
          ECR_REPOSITORY_URI: ${{ steps.set-envs.outputs.ECR_REPOSITORY_URI }}
          TAG_NAME: ${{ steps.set-envs.outputs.TAG_NAME }}
        run: |
          docker build -t $ECR_REPOSITORY_URI:$TAG_NAME -t $ECR_REPOSITORY_URI:latest .
          docker push $ECR_REPOSITORY_URI:$TAG_NAME
          docker push $ECR_REPOSITORY_URI:latest
  • Docker 명령어를 사용하여 이미지를 빌드하고, 태그를 지정한 다음, ECR 리포지토리로 푸시합니다.
  • 해당 과정에서 사용된 TAG_NAMEECR_REPOSITORY_URI는 이전 단계에서 설정된 환경 변수를 사용합니다.
    • latestTAG_NAME가 태그로로 푸시됩니다.

 

Repository Dispatch (Github Actions Repository)

      - name: Repository Dispatch
        uses: peter-evans/repository-dispatch@main
        with:
          token: ${{ secrets.WORKFLOW_GITHUB_TOKEN }}
          repository: project/eks
          event-type: edit-kustomize
          client-payload: '{"argoCdUrl":"${{ steps.set-envs.outputs.ARGOCD_REPOSITORY_URL }}","dockerImg":"${{ steps.set-envs.outputs.ECR_REPOSITORY_URI }}:${{ steps.set-envs.outputs.TAG_NAME }}","refBranch":"${{ steps.set-envs.outputs.REF_BRANCH }}","tagName":"${{ steps.set-envs.outputs.TAG_NAME }}","targetPath":"project-api"}'
  • 다른 Github 리포지토리에 이벤트를 보내고, 해당 리포지토리에서 추가 워크플로우를 트리고 할 수 있습니다.
  • client-payload는 리포지토리에 전달할 데이터를 JSON 형식으로 지정합니다.
  • project/eks 리포지토리의 워크플로우가 edit-kustomize 이벤트 유형으로 트리거됩니다.
  • 전달된 페이로드에는 Argocd URL, Docker 이미지 정보, 브랜치 이름 등이 포함되어 있어, 이 정보를 바탕으로 특정 작업이 수행됩니다.
  • 위의 이벤트는 repository-dispatch에 의해 이뤄지며, 다음 글에서 제공되는 액션 스크립트를 실행시킵니다.
반응형
코드플리