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
(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 아무거나 선택 (가이드 내 워크플로우 샘플로 대체 필요)

- Repository > "Actions" 탭 > Sample Workflow 아무거나 선택 (가이드 내 워크플로우 샘플로 대체 필요)
생성 완료 후, .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

2) Run Workflow 실행

- Branch 선택 : main(prd) / dev
- Select a env : PRD / DEV
- DEV 예시
- Branch : dev
- env : dev
- PRD 예시
- Branch : main
- env : PRD
- DEV 예시
3) 확인
(1) CI 성공 / 실패 여부 확인
Workflow 실행 후 아래와 같이 성공 / 실패 여부를 확인할 수 있다.

(2) 로그 확인
실패한 Workflow 클릭

build 클릭

workflow Step 별 로그 확인

