Astro Hub

DevOps / 11.CI_GithubActions

프로젝트: astro-test1

원본 경로: operateguide/DevOps/11.CI_GithubActions.md


[CI] Github Actions

1. 개요

Github Actions 를 수행하기 위한 Workflow 및 라이브러리 설정 방법에 대한 가이드

2. GitHub Enterprise 구성

1) ORG Secrets and Variables

계정 및 민감정보를 script에서 직접 선언해서 사용할 수 있지만, ORG Settings 의 "Actions secrets and variables" 메뉴에서 별도 선언후 사용한다.

(1) 메뉴 : ORG Settings > Security > Secrets and variables > Actions

  • alt text

(2) Secrets

* ARTIFACT_PASSWORD
  * msp_admin@ktds.co.kr 계정의 PAT (민감정보 excel 참고)
* BASE_DOCKER_PASSWORD
  * Base ACR Password
* DOCKER_PASSWORD
  * Workload ACR Password

(3) Variables

* ACR_NAME
  * [Worklaod_ACR].azurecr.io
* DOCKER_USERNAME
  * [Workload_ACR]
* BASE_ACR_NAME
  * acraz01comm.azurecr.io
* BASE_DOCKER_USERNAME
  * acraz01comm
* USERID
  * 단위서비스 약어
    * ex) atportal, bizforce, ...

2) Actions

Github ORG 내 Repository 마다 생성되며, 하나의 Repository 내 Action 에, 여러 Workflow를 생성할 수 있다.

  • 생성 방법
    • Repository > "Actions" 탭 > Sample Workflow 아무거나 선택 (가이드 내 워크플로우 샘플로 대체 필요) alt text

생성 완료 후, .github/workflows 경로에 Workflow 파일이 생성된다.

3) Workflow

Workflow 는 CI (Image Build) 를 수행하기 위한 프로세스를 정의하는 yaml 파일

  • Workflow.yaml 표준 Sample
name: [Repo]-CI

## Workflow 실행 시 prd / dev 를 지정하며, env에 따라 이미지의 태그가 다르게 생성된다.
on: 
  workflow_dispatch:
    inputs:
      env: 
        description: 'Select a env'
        required: true
        type: choice
        options:
          - DEV
          - PRD

jobs:
  build:
    runs-on: [RunnerScaleSet] # 예시 : arc-rs-atportal
    environment: [Workload]-env 

    env: # 이미지 생성을 위한 ACR 레포지토리 경로
      IMAGE_NAME: ${{ vars.ACR_NAME }}/${{ vars.USERID }}/[auth / front / batch / ...]

    permissions:
      contents: write

    steps: 
        # env에 따른 이미지 태그 생성
      - name: Set IMAGE_NAME based on environment
        id: set_image_name
        run: |
          if [[ "${{ github.event.inputs.env }}" == "DEV" ]]; then
            TIMESTAMP=$(date -u +"%Y%m%d%H%M%S" --date="9 hours")
            # TIMESTAMP=$(TZ="Asia/Seoul" date +"%Y%m%d%H%M%S")
            echo "IMAGE_TAG=v$TIMESTAMP" >> $GITHUB_ENV
            echo "KUSTOMIZATION_FILE=manifests/overlays/dev/kustomization.yaml" >> $GITHUB_ENV
          else
            echo "IMAGE_TAG=v2.${{ github.run_number }}" >> $GITHUB_ENV
            echo "KUSTOMIZATION_FILE=manifests/overlays/prd/kustomization.yaml" >> $GITHUB_ENV
          fi

        # repository 소스 clone          
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0 

        # env에 따른 branch 이동 및 pull 수행
      - name: Pull the latest changes
        run: |
          if [[ "${{ github.event.inputs.env }}" == "DEV" ]]; then
            git switch dev
            git pull origin dev
          else 
            git switch main
            git pull origin main
          fi

        # env에 따른 application.properties Copy
      - name : Copy environment properties
        run : |
          if [[ "${{ github.event.inputs.env }}" == "DEV" ]]; then
            cp src/main/resources/application-dev.properties src/main/resources/applcation.properties
          else
            cp src/main/resources/application-prd.properties src/main/resources/applcation.properties
          fi

        # Workload ACR Login
      - name: Log into registry Workload-ACR
        uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0
        with:
          registry: ${{ vars.ACR_NAME }}
          username: ${{ vars.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

        # Base ACR Login
      - name: Log into registry Base-ACR
        uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0
        with:
          registry: ${{ vars.BASE_ACR_NAME }}
          username: ${{ vars.BASE_DOCKER_USERNAME }}
          password: ${{ secrets.BASE_DOCKER_PASSWORD }}

        # Docker Buildx 설치
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0

        # Docker Image에 사용할 metadata 추출
      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0
        with:
          images: ${{ vars.ACR_NAME }}.azurecr.io/${{ vars.USERID }}/samplejava

        # Docker Image Build 및 ACR Push
      - name: Build and push Docker image
        id: build-and-push
        uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0
        with:
          context: .
          file: ./manifests/Dockerfile # Dockerfile 경로 지정
          push: true
          tags: |
            ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
            ${{ env.IMAGE_NAME }}:latest
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=registry,ref=${{ env.IMAGE_NAME }}:cache # Image Build Cache 사용
          cache-to:   type=registry,ref=${{ env.IMAGE_NAME }}:cache,mode=max # 레지스트리에 Cache 저장
          build-args: |
            ARTIFACT_PASSWORD=${{ secrets.ARTIFACT_PASSWORD }}
          # Dockerfile에 Artifact Password 변수 저장

      - name: Update kustomization.yaml with newTag
        run: |
          sed -i "s/newTag: .*/newTag: ${{ env.IMAGE_TAG }}/" $KUSTOMIZATION_FILE

          # kustomization.yaml 의 Image Tag를 New Tag로 치환
      - name: Commit and push updated kustomization.yaml
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          git config --local user.email "github-actions[bot]@users.noreply.github.com"
          git config --local user.name "github-actions[bot]"
          git add $KUSTOMIZATION_FILE
          git commit -m "Update image tag to ${{ env.IMAGE_TAG }} in kustomization.yaml"
          if [[ "${{ github.event.inputs.env }}" == "PRD" ]]; then
            TAG=v2.${{ github.run_number }}
            git tag $TAG -m "Release version $TAG"
          else
            :
          fi
          git push https://x-access-token:${GITHUB_TOKEN}@ktds.ghe.com/${{ github.repository }}.git HEAD:${{ github.ref_name }}

2) 주요 항목 설명

  • Dockerizing
    • Mulit Staging Build
    • Dockerizing 에서 Maven Build 및 Image Build까지 수행되는 구조이다.
    • Buildx 이용
    • Buildx 를 통해서 caches 를 이용하므로 빠르게 빌드 할수 있다.
  • Update kustomization
    • Image Build 및 Push 완료 후 해당 tag 값을 Repository의 kustomization.yaml 에 업데이트 한다.
    • 이후 ArgoCD 에서 Sync 작업을 수행함으로 Deploy가 가능하도록 한다.

3. GitHub Actions 수행 (CI)

1) Github Repository 접속 > 상단 Actions 탭 선택 > Workflow 선택 > Run Workflow

alt text

2) Run Workflow 실행

alt text

  • Branch 선택 : main(prd) / dev
  • Select a env : PRD / DEV
    • DEV 예시
      • Branch : dev
      • env : dev
    • PRD 예시
      • Branch : main
      • env : PRD

3) 확인

(1) CI 성공 / 실패 여부 확인

Workflow 실행 후 아래와 같이 성공 / 실패 여부를 확인할 수 있다. alt text

(2) 로그 확인

  1. 실패한 Workflow 클릭 alt text

  2. build 클릭 alt text

  3. workflow Step 별 로그 확인 alt text

프로젝트 홈으로 돌아가기