지난 포스팅에서는 Gitlab CI로 CI/CD 파이프라인을 구축했었다.
https://griotold.tistory.com/47
이번에는 GitHub Actions로 CI/CD 파이프라인을 구축해보자.
1. GitHub Actions란?
GitHub Actions는 소프트웨어 개발 워크플로우를 자동화할 수 있는 강력한 CI/CD 플랫폼이다.
1 - 1. 핵심 구성 요소
1 - 1 - 1. Workflow
- YAML 파일로 정의
- 하나 이상의 Job으로 구성
- 특정 이벤트 발생 시 실행
1 - 1 - 2. Event
- Workflow를 트리거하는 특정 활동
- 예시: push, pull request, issue 생성
1 - 1 - 3. Job
- 독립된 가상 머신이나 컨테이너에서 실행
- 여러 단계(Step)로 구성
- 기본적으로 병렬 실행, 순차 실행도 가능
1 - 1 - 4. Step
- 명령어 실행이나 액션 사용
- 작업 내에서 순차적으로 실행
1 - 1 - 5. Action
- 재사용 가능한 Workflow 구성 요소
- 복잡한 작업을 단순화
- 직접 만들거나 GitHub Marketplace에서 사용 가능
1 - 1 - 6. Runner
- Workflow 작업을 실행하는 서버
- GitHub 제공 또는 자체 호스팅 가능
2. 실습
로컬에서 작업한 Spring Project를 GitHub에 공유하고 GitHub Actions를 이용해 CI/CD 파이프라인을 구축.
3. 깃허브 공유
인텔리제이 IDE 작업한 프로젝트를 project-01 이름으로 SHARE 한다.
4. Actions 탭에서 "ecs" 검색
Configure 를 클릭한다.
클릭하게 되면 project-01 프로젝트에 yml파일을 추가할 수 있게 된다.
5. aws.yml
# This workflow will build and push a new container image to Amazon ECR,
# and then will deploy a new task definition to Amazon ECS, when there is a push to the "main" branch.
#
# To use this workflow, you will need to complete the following set-up steps:
#
# 1. Create an ECR repository to store your images.
# For example: `aws ecr create-repository --repository-name my-ecr-repo --region us-east-2`.
# Replace the value of the `ECR_REPOSITORY` environment variable in the workflow below with your repository's name.
# Replace the value of the `AWS_REGION` environment variable in the workflow below with your repository's region.
#
# 2. Create an ECS task definition, an ECS cluster, and an ECS service.
# For example, follow the Getting Started guide on the ECS console:
# https://us-east-2.console.aws.amazon.com/ecs/home?region=us-east-2#/firstRun
# Replace the value of the `ECS_SERVICE` environment variable in the workflow below with the name you set for the Amazon ECS service.
# Replace the value of the `ECS_CLUSTER` environment variable in the workflow below with the name you set for the cluster.
#
# 3. Store your ECS task definition as a JSON file in your repository.
# The format should follow the output of `aws ecs register-task-definition --generate-cli-skeleton`.
# Replace the value of the `ECS_TASK_DEFINITION` environment variable in the workflow below with the path to the JSON file.
# Replace the value of the `CONTAINER_NAME` environment variable in the workflow below with the name of the container
# in the `containerDefinitions` section of the task definition.
#
# 4. Store an IAM user access key in GitHub Actions secrets named `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`.
# See the documentation for each action used below for the recommended IAM policies for this IAM user,
# and best practices on handling the access key credentials.
name: Deploy to Amazon ECS
on:
push:
branches: [ "main" ]
env:
AWS_REGION: ap-northeast-2 # set this to your preferred AWS region, e.g. us-west-1
ECR_REPOSITORY: group-15720448/project-01 # set this to your Amazon ECR repository name
ECS_SERVICE: project-01-service # set this to your Amazon ECS service name
ECS_CLUSTER: project-cluster # set this to your Amazon ECS cluster name
ECS_TASK_DEFINITION: .github/workflows/project-01-task-revision1.json # set this to the path to your Amazon ECS task definition
# file, e.g. .aws/task-definition.json
CONTAINER_NAME: project-01-container # set this to the name of the container in the
# containerDefinitions section of your task definition
permissions:
contents: read
jobs:
build:
name: Build Jar
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew clean build
- name: Upload Build Artifacts
uses: actions/upload-artifact@v3
with:
name: build-libs
path: build/libs/*.jar
deploy:
name: Deploy
runs-on: ubuntu-latest
needs: build
environment: production
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download Build Artifacts
uses: actions/download-artifact@v3
with:
name: build-libs
path: build/libs
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
run: |
# Build a docker container and
# push it to ECR so that it can
# be deployed to ECS.
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
- name: Fill in the new image ID in the Amazon ECS task definition
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: ${{ env.ECS_TASK_DEFINITION }}
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ steps.build-image.outputs.image }}
- name: Deploy Amazon ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: ${{ steps.task-def.outputs.task-definition }}
service: ${{ env.ECS_SERVICE }}
cluster: ${{ env.ECS_CLUSTER }}
wait-for-service-stability: true
on.push.branches: [ "main" ]
main 브랜치에 push 하게 되면 CI/CD가 동작한다는 이벤트를 설정한 것이다.
env 항목
env 항목만 프로젝트에 맞게 수정하면 된다.
그리고, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 를 settings 에서 추가해야 한다.
env:
AWS_REGION: ap-northeast-2 # set this to your preferred AWS region, e.g. us-west-1
ECR_REPOSITORY: group-15720448/project-01 # set this to your Amazon ECR repository name
ECS_SERVICE: project-01-service # set this to your Amazon ECS service name
ECS_CLUSTER: project-cluster # set this to your Amazon ECS cluster name
ECS_TASK_DEFINITION: .github/workflows/project-01-task-revision1.json # set this to the path to your Amazon ECS task definition
# file, e.g. .aws/task-definition.json
CONTAINER_NAME: project-01-container # set this to the name of the container in the
# containerDefinitions section of your task definition
전부 AWS에서 확인할 수 있는 내용들이다.
깃랩과 다른점은 Task Definition 의 json 파일이 있어야 한다는 점이다.
6. revision1.json
AWS ECS에서 Task를 보면 JSON 탭을 확인할수 있다.
JSON 다운로드 하거나, 클립보드 복사하여 프로젝트에 추가해야 한다.
깃허브 웹사이트에서 codespaces 를 통해 vscode를 웹 버전으로 사용할 수 있고, 간편하게 파일을 추가할 수 있다.
7. 엑세스 키 등록
settings -> Actions -> New repository secret 버튼
클릭해서 AWS IAM user를 생성한 후에 다운받았던 csv 파일의 내용을 기입한다.
8. Actions 탭에서 CI/CD 파이프라인 태우기
두 workflow 가 실패한 것을 확인할 수 있다.
일단 Build Jar는 성공한 것으로 보이고, Deploy가 문제로 보여진다.
각 항목의 상세보기를 클릭하면, 정확한 문제 원인을 알 수 있다.
Deploy가 문제가 되었던 것이고, AWS credentials가 없다는 내용이다.
순서상으로 , 액세스 키를 넣기 전에 aws.yml 파일과 revision1.json 파일을 넣었기 때문에 발생한 문제다.
액세스 키를 등록했으니 다시 돌리면 문제없이 동작할 것이다.
8 - 1. Re-run Jobs
Re-run Jobs 버튼을 클릭해서 다시 돌려보자.
GitHub Actions CI/CD 성공!
'인프라 > CI, CD' 카테고리의 다른 글
GitHub Actions로 CI/CD 파이프라인 구축하고 cloudtype에 배포하기 (0) | 2024.12.11 |
---|---|
GitHub Actions로 구현하는 자동화된 테스트 기반 CI 파이프라인 (0) | 2024.12.10 |
2024 12 6 TIL - AWS ECS, ECR, Gitlab CI로 CI/CD 파이프라인 구축하기 (1) | 2024.12.06 |
2024 12 5 TIL - CI/CD (1) | 2024.12.05 |