.github/workflows/bastion-deploy.yml
name: Deploy
on:
push:
branches: [ "main" ]
env:
DOCKER_IMAGE: ghcr.io/${{ github.actor }}/redis-spring-server
VERSION: ${{ github.sha }}
NAME: redis-spring-server
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
## jdk setting
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu' # https://github.com/actions/setup-java
## gradle caching
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Create application.properties for CD Deploy
run: |
mkdir -p src/main/resources
cd src/main/resources
pwd
echo "${{ secrets.DEPLOY_APPLICATION_PROPERTIES }}" > application.properties
- name: Create cors.properties for CD Deploy
run: |
mkdir -p src/main/resources
cd src/main/resources
pwd
echo "${{ secrets.DEPLOY_CORS_PROPERTIES }}" > cors.properties
- name: Create redis.properties for CD Deploy
run: |
mkdir -p src/main/resources
cd src/main/resources
pwd
echo "${{ secrets.DEPLOY_REDIS_PROPERTIES }}" > redis.properties
- name: Create mysql.properties for CD Deploy
run: |
mkdir -p src/main/resources
cd src/main/resources
pwd
echo "${{ secrets.DEPLOY_MYSQL_PROPERTIES }}" > mysql.properties
- name: Grant execute permission for gradlew
run: chmod +x gradlew
## gradle build
- name: Build with Gradle
run: ./gradlew build -x test
## docker build & push to production
- name: Docker build & push to prod
run: |
echo ${{ secrets.GHCR_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin
docker buildx create --name arm64builder --use
docker buildx build --platform linux/amd64,linux/arm64 -f Dockerfile -t ghcr.io/annsunghee/redis-spring-server:latest --push .
docker logout
deploy:
needs: build
name: Deploy
runs-on: [ self-hosted, deploy-redis-spring-backend ]
steps:
- name: Deploy to prod
uses: appleboy/ssh-action@v0.1.10
env:
GHCR_TOKEN: ${{ secrets.GHCR_TOKEN }}
GITHUB_ACTOR: ${{ github.actor }}
with:
host: ${{ secrets.BASTION_HOST }}
username: ec2-user
key: ${{ secrets.BASTION_PRIVATE_KEY }}
script_stop: true
script: |
cd deploy_scripts
./run_redis_backend_deploy.sh $GHCR_TOKEN $GITHUB_ACTOR
JSON
복사
•
name: Deploy: GitHub Actions 워크플로의 이름을 "Deploy"로 설정합니다.
•
on:: 워크플로를 시작할 트리거 이벤트를 나타냅니다.
◦
push:: 푸시 이벤트(즉, 코드가 저장소로 푸시될 때)에서 워크플로가 트리거되도록 지정합니다.
◦
branches: [ "main" ]: 코드가 main 분기로 푸시될 때만 워크플로가 실행됩니다. 워크플로 실행을 main 분기에 대한 변경 사항으로 제한합니다.
•
env:: 이 섹션은 워크플로우에서 사용될 환경 변수를 정의합니다.
◦
DOCKER_IMAGE: 이 변수는 Redis Spring 서버의 Docker 이미지 저장소 이름을 저장합니다. GitHub 행위자(즉, 워크플로를 트리거한 GitHub 계정의 사용자 이름)를 사용하여 이미지 이름을 구성합니다. 예를 들어 GitHub 액터가 "john_doe"인 경우 이미지 이름은 "ghcr.io/john_doe/redis-spring-server"가 됩니다.
◦
VERSION: 이 변수는 푸시된 코드의 GitHub SHA(커밋 해시)를 저장합니다. Docker 이미지의 버전으로 사용됩니다.
◦
NAME: 이 변수는 Redis Spring 서버 애플리케이션의 이름을 저장합니다. "redis-spring-server"로 설정되어 있습니다.
•
jobs:: 이 섹션은 워크플로의 일부로 실행될 작업을 정의합니다.
•
build:: 첫 번째 작업의 이름이며 "Build"라고 합니다.
•
runs-on: ubuntu-latest: 최신 버전의 Ubuntu 운영 체제를 사용하여 GitHub에서 호스팅하는 실행기에서 작업이 실행되도록 지정합니다.
•
Steps
1.
actions/checkout@v3: 이 단계는 GitHub 리포지토리에서 코드를 체크아웃하여 후속 단계에서 소스 코드에 액세스할 수 있도록 합니다.
2.
actions/setup-java@v3: 이 단계는 Zulu 배포를 사용하여 JDK 17을 설정하여 애플리케이션 빌드에 필요한 Java 환경을 제공합니다.
3.
actions/cache@v3: 이 단계는 빌드 프로세스 속도를 높이기 위해 Gradle 종속성을 캐시합니다. 캐시된 디렉토리에는 ~/.gradle/caches 및 ~/.gradle/wrapper가 포함됩니다.
4.
Create application.properties for CD Deploy: 이 단계에서는 src/main/resources 디렉토리에 application.properties 파일을 생성합니다. 파일의 내용은 'DEPLOY_APPLICATION_PROPERTIES'라는 GitHub 비밀에서 가져오며 배포 관련 구성을 포함할 수 있습니다.
5.
Create cors.properties for CD Deploy: 이 단계에서는 이전 단계와 유사하게 src/main/resources 디렉토리에 cors.properties 파일을 생성합니다. 파일의 콘텐츠는 DEPLOY_CORS_PROPERTIES GitHub 암호에서 가져옵니다.
6.
Create redis.properties for CD Deploy: 이 단계에서는 이전 단계와 유사하게 src/main/resources 디렉토리에 redis.properties 파일을 생성합니다. 파일의 콘텐츠는 DEPLOY_REDIS_PROPERTIES GitHub 암호에서 가져옵니다.
7.
Create mysql.properties for CD Deploy: 이 단계에서는 이전 단계와 유사하게 src/main/resources 디렉토리에 mysql.properties 파일을 생성합니다. 파일의 콘텐츠는 DEPLOY_MYSQL_PROPERTIES GitHub 암호에서 가져옵니다.
8.
Grant execute permission for gradlew: 이 단계는 gradlew 스크립트에 실행 권한을 부여하여 다음 단계에서 실행할 수 있도록 합니다.
9.
Build with Gradle: 이 단계에서는 Gradle 빌드 명령(./gradlew build -x test)을 실행하여 테스트 실행(x test)을 제외하고 Spring Boot 애플리케이션을 빌드합니다.
10.
Docker build & push to prod: 이 단계는 애플리케이션용 Docker 이미지를 빌드하고 GitHub Container Registry(GHCR)로 푸시하는 일을 담당합니다. 이 프로세스에는 GHCR에 로그인하고, AMD64 및 ARM64 아키텍처를 모두 지원하는 다중 플랫폼 빌드를 만들고, 마지막으로 빌드된 이미지를 푸시하는 작업이 포함됩니다.
•
deploy:: 두 번째 작업의 이름이며 이름은 "Deploy"입니다.
•
needs: build: "배포" 작업이 "빌드" 작업의 성공적인 완료에 달려 있음을 나타냅니다. "구축" 작업이 성공한 경우에만 "배포" 작업이 실행되도록 합니다.
•
runs-on: [ self-hosted, deploy-redis-spring-backend ]: "배포" 작업이 "deploy-redis-spring-backend" 레이블이 있는 자체 호스팅 러너에서 실행되도록 지정합니다. 자체 호스팅 러너는 CI/CD 프로세스를 위한 사용자 지정 환경을 허용합니다.