일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- java socket
- 자바 입출력 스트림
- 멀티 쓰레드
- 쿠버네티스
- 동시성
- 쓰레드
- 인프런
- Java IO
- java network
- 자료구조
- 알고리즘
- 컨테이너
- 도커 엔진
- LIST
- Kubernetes
- 실전 자바 고급 1편
- filewriter filereader
- 스레드 제어와 생명 주기
- 자바
- 도커
- 리스트
- 시작하세요 도커 & 쿠버네티스
- Collection
- 김영한
- 스레드
- Docker
- container
- Thread
- java
- 자바 io 보조스트림
- Today
- Total
쌩로그
GitHub Actions 본문
목차
- 포스팅 개요
- 본론
2-1. GitHub Actions란?
2-2. GitHub Actions 구축
2-2-1. 사전 준비 - 요약
1. 포스팅 개요
GitHub Actions가 무엇인지 간략히 알아보고 구축 과정을 살펴보고자 포스팅을 하게 되었다.
2. 본론
2-1. GitHub Actions란?
GitHub Actions는 GitHub가 공식적으로 제공하는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 CI/CD 플랫폼이다.
CI/CD에 간략히 정리한 글이 있다.
이제 GitHub Actions를 구축해보도록 하자.
2-2. GitHub Actions 구축
2-2-1. 사전 준비
- S3가 준비되어있어야 한다.
- CodeDeploy가 준비되어있어야 한다.
- EC2가 준비되어있어야 한다.
- IAM 서비스 역할과 EC가 연결되어있어야한다.
- IAM 사용자를 생성하여 액세스키와 비밀키가 준비되어있어야 한다.
참 고맙게도 누군가 따라하면 쉽게 구축할 수 있도록 이미 다 포스팅을 해놨다.
그리고 지금 난 GitHub Actions 구축 방법을 포스팅 중이다.
참고 링크를 걸어둘테니 보고 준비해보면 된다.
보안 그룹 설정
EC2 생성
배포와 관련된 EC2 셋팅
AWS S3
IAM 서비스 역할과 사용자 생성
AWS CodeDeploy 구축
이제 준비가 끝났으니 본격적으로 GitHub Actions를 구축하자.
프로젝트 레포의 Actions 탭으로 간다.

화면과 같이 New workflow
를 선택해준다.

다음 화면처럼 샘플을 고르거나, 혹은 생성할 수 있는데,
나는 SpringBoot+Gradle 이므로 Java with Gradle을 선택했다.

Java with Gradle의 Configure를 클릭하면 다음과 같이 나온다.

일단 우측 상단의 초록버튼 Commit changes...
를 클릭하여 gradle.yml을 생성해준다.

프로젝트의 Actions 탭에 들어가면 GitHub Actions
가 실행되고 있는 것을 확인할 수 있다.처음엔 아마 실패할 것이다.

수행되고 있는 작업을 눌러보면,(Equal 그냥 둘 다 똑같다는 거다.)

다음과 같은 화면이 나오는데, 어떤 작업들이 순차적으로 수행되고 있는지를 확인할 수 있다.
배포 진행시, 여기서 어떤 작업을 수행중인지, 진행 상황을 알 수 있고, 혹여 실패했다면, 어떤 작업에서 실패했는지를 추적할 수 있다.

그리고 동시에 레포의 커밋 내역 표시에서 GitHub Actions
의 성공 여부를 알 수 있다.

이제 Actions에서 생성한 gradle.yml
파일을 통해 GitHub Action 설정을 할 수 있는데 먼저 해줘야 할 작업이 있다.
바로 IAM 사용자를 생성하면서 얻은 액세스 키를 프로젝트 Repository에 SecretKey로 저장해줘야 한다.
프로젝트의 Settings에서 Secrets and variables
- Actions
로 이동해서 저장해주면된다.

New repository secret
으로 값을 저장해준다.
나는 아래와 같이 저장했다.

Secrets
에는 IAM 사용자를 생성하면서 받은 실제 액세스키를 넣어야한다
액세스 비밀키도 액세스 키를 넣듯이 하면 된다.
내가 비밀키를 넣을 때는 AWS_SECRET_ACCESS_KEY
로 저장했다.
그리고 내가 설정한 값들
을 확인할 수 있다.

이 값들은 아까 Actions 탭에서 생성한 gradle.yml
에서 사용된다.
이제 그 파일을 수정할 것인데, 아래 스크립트를 참고해서 작성하면 된다.
지금 설정할 이 gradle.yml을 통해서 GitHub Actions의 각 작업들이 수행된다.
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
env:
S3_BUCKET_NAME: S3이름
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Build with Gradle
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
arguments: build
- name: init with Gradle
uses: gradle/gradle-build-action@v2
- run: gradle init
- name: Build with Gradle
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
gradle-version: 7.6.1 # gradle 버전
# build한 후 프로젝트를 압축
- name: Make zip file
run: zip -r ./애플리케이션이름-deploy.zip .
shell: bash
# Access Key와 Secret Access Key를 통해 권한을 확인
# 아래 코드에 Access Key와 Secret Key를 직접 작성하지 않도록한다.
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }} # 등록한 Github Secret을 자동으로 불러옴.
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # 등록한 Github Secret을 자동으로 불러옴.
aws-region: ap-northeast-2 # 서울 리전
# 압축한 프로젝트를 S3로 전송
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./애플리케이션이름-deploy.zip s3://$S3_BUCKET_NAME/애플리케이션이름-deploy.zip
# CodeDeploy에게 배포 명령을 내림.
- name: Code Deploy
run: >
aws deploy create-deployment --application-name 코드디플로이애플리케이션이름
--deployment-config-name CodeDeployDefault.AllAtOnce
--deployment-group-name 코드디플로이배포그룹이름
--s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=애플리케이션이름-deploy.zip
당부하는 바이지만, 나 같은 경우 이 외에도 설정이 더 들어간다..
그러니 이 글은 참고만 하길 바란다...
아까 Secrets에서 넣은 IAM 사용자 액세스 키, 비밀 키
는 이 부분에서 쓰인다.

그리고 코드에 한글로 써진 부분들이 있다.
S3이름
은 AWS에서 설정한 S3이름을 적어주면된다.애플리케이션이름
이라고 표시되어있는 부분은 각자 커스터마이징 하면된다.코드디플로이배포그룹이름
,코드디플로이애플리케이션이름
은 AWS CodeDeploy에서 설정한 대로 적어주면된다.
그리고 프로젝트 최상단의 디렉터리 내에 appspec.yml
파일을 생성해서 작성해줘야 하는데, 이 파일을 통해서 배포가 어느 경로에서 진행될지, 배포를 진행시 어느 스크립트(리눅스 명령어집합 파일)를 참고할지 설정해준다.
다음을 참고해주면 된다.
# Code Deploy의 작동을 모아놓은 파일
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/디렉터리이름 # 배포가 진행 되는 디렉터리 / 깃허브 레포의 zip파일이 압축해제 되는 곳 /여기서 빌드 진행됨.
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
ApplicationStart:
- location: scripts/deploy.sh # /scripts/deploy.sh 가 실행됨 : '.sh'는 쉘 스크립트 확장자
timeout: 60
runas: ubuntu
overwrite: yes
✅참고로 /home/ubuntu/디렉터리이름
을 설정했다면, EC2에 실제로 해당 디렉터리가 존재해야 한다.
배포하기 전에 EC2에 접속해서 디렉터리를 생성해주자.
그리고 빌드가 완료된 후에 실행될 명령어들을 쉘 스크립트를 통해서 작성해주면 된다.
쉘 스크립트는 최상단/scripts/deploy.sh
으로 생성주면 된다.
#!/bin/bash
BUILD_JAR=$(ls /home/ubuntu/action/build/libs/practice-githubAction-deploy-0.0.1-SNAPSHOT.jar)
JAR_NAME=$(basename $BUILD_JAR)
echo "> 현재 시간: $(date)" >> /home/ubuntu/action/deploy.log
echo "> build 파일명: $JAR_NAME" >> /home/ubuntu/action/deploy.log
echo "> build 파일 복사" >> /home/ubuntu/action/deploy.log
DEPLOY_PATH=/home/ubuntu/action/
cp $BUILD_JAR $DEPLOY_PATH
echo "> 현재 실행중인 애플리케이션 pid 확인" >> /home/ubuntu/action/deploy.log
CURRENT_PID=$(pgrep -f $JAR_NAME)
if [ -z $CURRENT_PID ]
then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." >> /home/ubuntu/action/deploy.log
else
echo "> kill -9 $CURRENT_PID" >> /home/ubuntu/action/deploy.log
sudo kill -9 $CURRENT_PID
sleep 5
fi
DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "> DEPLOY_JAR 배포" >> /home/ubuntu/action/deploy.log
sudo nohup java -jar $DEPLOY_JAR >> /home/ubuntu/action/deploy.log 2>/home/ubuntu/action/deploy_err.log &
🤔 참고로 해당 명령어들이 이해가 되지 않으면 리눅스 명령어를 참고해보길 바란다.
✅ 작성한 이 쉘 스크립트에 있는 log파일이나 디렉터리
는 EC2에 생성되어 있는 상태여야 한다.
여기까지 하면 GitHub Actions에 대한 설정이 대부분 완료된 것이다.
그리고 gradle.yml에서 설정된 대로 main 브랜치 push를 해보면, 작업이 수행되고 있는 표시가 나온다.

그리고 성공하면, 이쁜 초록색이 나온다.

그리고 배포가 잘 되었는지 확인해보면 된다.
먼저 AWS의 CodeDeploy
에서 확인해보면, 다음과 같이 배포 내역에 기록된다.

그리고 배포가 잘 되었는지 확인해보면...!!!
자~알 나온다.!!

3. 요약
GitHub Actions에 대해 간략히 언급하고, 그것을 구축하는 과정에 대한 내용이었다.
참고로... 위에 있는 yml파일을 배껴쓰더라도 혹여 안 될 수도 있다.
참고해서 적절한 구글링 + ChatGPT를 통해 각자 상황에 맞게 커스터마이징해서 작성하길 바란다.
'Deploy > GitHub' 카테고리의 다른 글
GitHub Organization 팀 멤버 권한 변경해주기 (0) | 2023.06.13 |
---|---|
깃허브 레포 Public, Private으로 바꾸는 방법 (0) | 2023.06.12 |
깃허브 issue 템플릿 작성 (5) | 2023.05.24 |
깃허브 레포 생성 후 참여자 초대 (0) | 2023.05.21 |