
간단하게 GitHub Actions가 뭔지 알아보고 실습을 진행해보겠습니다.
GitHub Actions는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 지속적 통합 및 지속적 배포(CI/CD) 플랫폼입니다.
1. Workflow
2. Event
3. Job
4. Action
5. Runner
https://docs.github.com/en/actions/about-github-actions/understanding-github-actions

깃허브 레포지토리를 보시면 Actions라는 탭이 있습니다. 이걸 클릭하면 위 사진과 비슷하게 나올 텐데 저는 Java with Gradle을 활용하였습니다. 레포지토리의 코드를 분석해 추천해주는 템플릿 같은 것입니다. 셀프로 설정하셔도 됩니다.
name: Java CI with Gradle
# 워크 플로우 실행 조건 설정
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
# 작업
jobs:
build:
# 작업 환경
runs-on: ubuntu-latest
permissions:
contents: read # 코드 읽기 권한만 부여
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: application.yml 생성 후 secret 값 복붙
run: | # 보안 설정된 application.yml 파일 생성
mkdir -p ./src/main/resources
touch ./src/main/resources/application.yml
echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application.yml
cat ./src/main/resources/application.yml
- name: Setup Gradle
uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
- name: Build with Gradle Wrapper
run: ./gradlew build
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: memo-study
path: build/libs/memo-study-0.0.1-SNAPSHOT.jar


Github Actions에는 secret 값을 설정할 수 있는 기능이 있는데 깃허브 레포지토리의 Setting를 보시면 왼쪽에 Security에 Secrets and variables가 보일 겁니다. 저는 이렇게 빌드에 필요한 application.yml을 APPLICATION을 생성하여 넣어줬습니다.
applicaion.yml은 설정 파일이므로 프로젝트 빌드 전에 가져와야 합니다!!
1. AWS EC2 설정
2. EC2 접속용 SSH 키 준비
키 페어 읽는 방법
저는 텍스트 편집기로 열어서 secrets에 복사 붙여넣기 했습니다.
vscode로 열어도 되고 터미널 열어서 cat 명령어로 확인하셔도 됩니다.
3. GitHub Secrets 설정
4. GitHub Actions Workflow 설정(전체)
name: Spring Boot CI/CD on EC2
# 워크 플로우 실행 조건 설정
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
# 작업
jobs:
build:
# 작업 환경
runs-on: ubuntu-latest
permissions:
contents: read # 코드 읽기 권한만 부여
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: application.yml 생성 후 secret 값 복붙
run: | # 보안 설정된 application.yml 파일 생성
mkdir -p ./src/main/resources
touch ./src/main/resources/application.yml
echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application.yml
cat ./src/main/resources/application.yml
- name: Setup Gradle
uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
- name: Build with Gradle Wrapper
run: ./gradlew build
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: memo-study
path: build/libs/memo-study-0.0.1-SNAPSHOT.jar
# EC2 서버로 배포 작업 정의
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Download build artifact
uses: actions/download-artifact@v4
with:
name: memo-study
path: build/libs/
# EC2에 배포
- name: Deploy to EC2
run: |
# EC2 접근을 위한 SSH 개인 키 저장 및 권한 설정
echo "${{ secrets.EC2_SSH_KEY }}" > private_key.pem
chmod 600 private_key.pem
# EC2로 JAR 파일 복사
scp -i private_key.pem -o StrictHostKeyChecking=no build/libs/memo-study-0.0.1-SNAPSHOT.jar ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }}:/home/${{ secrets.EC2_USERNAME }}/memo-study.jar
# EC2에서 기존 Java 프로세스 종료 후 새 애플리케이션 실행
ssh -i private_key.pem -o StrictHostKeyChecking=no ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} "pgrep java | xargs kill -9; nohup java -jar /home/${{ secrets.EC2_USERNAME }}/memo-study.jar > app.log 2>&1 &"
# 보안상 개인 키 삭제
rm -f private_key.pem
dependency-submission:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Generate and submit dependency graph
uses: gradle/actions/dependency-submission@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
과정을 모두 마치면 git push를 통해 테스트해보면 됩니다.


AWS 인바운드 규칙 설정에서 Spring Boot 8080번 포트 설정(TCP 프로토콜) 하시길 ㅠ 저는 이걸 까먹고 왜 자꾸 접속이 안 되지 하고 있었습니다..