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를 설정할 수 있습니다.
- dev 브랜치에서 2024년 5월 1일에 실행될 경우
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_NAME
과ECR_REPOSITORY_URI
는 이전 단계에서 설정된 환경 변수를 사용합니다.latest
와TAG_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에 의해 이뤄지며, 다음 글에서 제공되는 액션 스크립트를 실행시킵니다.
반응형
'Server > Infra' 카테고리의 다른 글
[Terraform] registry.terraform.io/hashicorp/template 2.2.0 doesn't match any of the checksums previously recorded in the dependency lock file (0) | 2024.08.26 |
---|---|
[Terraform] Incompatible provider version, darwin_arm64 이슈 (0) | 2024.08.26 |
[kube] 쿠버네티스 명령어 (1) | 2023.10.14 |
[kube] 쿠버네티스 클러스터 통신 (0) | 2023.10.12 |
[Kube] GKE (Google Kubernetes) 클러스터 만들기 (0) | 2023.10.12 |