Skip to content

๐Ÿ› Fix: http2 ์„ค์ • ์˜ค๋ฅ˜ ํ•ด๊ฒฐ #24

๐Ÿ› Fix: http2 ์„ค์ • ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

๐Ÿ› Fix: http2 ์„ค์ • ์˜ค๋ฅ˜ ํ•ด๊ฒฐ #24

# github repository actions ํŽ˜์ด์ง€์— ๋‚˜ํƒ€๋‚  ์ด๋ฆ„
name: CI/CD using github actions & docker-compose
# event trigger
# dev ๋ธŒ๋žœ์น˜์— push๊ฐ€ ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰
on:
push:
branches: [ "dev" ]
permissions:
contents: read
jobs:
CI-CD:
runs-on: ubuntu-latest
steps:
# JDK setting - github actions์—์„œ ์‚ฌ์šฉํ•  JDK ์„ค์ • (ํ”„๋กœ์ ํŠธ๋‚˜ AWS์˜ java ๋ฒ„์ „๊ณผ ๋‹ฌ๋ผ๋„ ๋ฌด๋ฐฉ)
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# 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-
# gradle build
- name: Build with Gradle
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: ./gradlew build -x test
# source code docker image build & push to production
- name: Docker build & push to prod
if: contains(github.ref, 'dev')
run: |
IMAGE=${{ secrets.DOCKER_USERNAME }}/interview-be-service
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
docker build -f Dockerfile -t $IMAGE:latest .
docker push $IMAGE:latest
# compose & nginx ์„ค์ •์„ ์„œ๋ฒ„๋กœ ์ „์†ก (์ธ์ฆ์„œ ์ œ์™ธ)
- name: Upload compose & nginx configs
uses: appleboy/scp-action@master
if: contains(github.ref, 'dev')
with:
host: ${{ secrets.HOST_PROD }}
username: ubuntu
key: ${{ secrets.PRIVATE_KEY }}
source: "docker-compose.yml,nginx/**"
target: "/home/ubuntu/interview-be"
# deploy to production
- name: Deploy to prod
uses: appleboy/ssh-action@master
id: deploy-prod
if: contains(github.ref, 'dev')
with:
host: ${{ secrets.HOST_PROD }} # EC2 ํผ๋ธ”๋ฆญ IPv4 DNS
username: ubuntu
key: ${{ secrets.PRIVATE_KEY }}
script: |
set -e
APP_DIR=/home/ubuntu/interview-be
mkdir -p $APP_DIR
cd $APP_DIR
# ์„œ๋ฒ„์— .env ํŒŒ์ผ ๋ฎ์–ด์“ฐ๊ธฐ
cat > .env <<'EOF' # ๋ฉ€ํ‹ฐ๋ผ์ธ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉ
${{ secrets.ENV_FILE }}
EOF
chmod 600 .env
# docker-compose.yml ์† DOCKER_USERNAME ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ฃผ์ž…
export DOCKER_USERNAME="${{ secrets.DOCKER_USERNAME }}"
# ์ตœ์‹  ์ด๋ฏธ์ง€ pull & app ๊ต์ฒด
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
if docker ps -a --format '{{.Names}}' | grep -qx 'interview-be-nginx'; then
# ์ด๋ฏธ nginx๊ฐ€ ํ•œ ๋ฒˆ์ด๋ผ๋„ ์˜ฌ๋ผ๊ฐ„ ์ ์ด ์žˆ์œผ๋ฉด app๋งŒ ๊ต์ฒด
docker compose pull app
docker compose up -d app
else
# nginx๊ฐ€ ํ•œ ๋ฒˆ๋„ ์—†์—ˆ๋‹ค๋ฉด ์ฒ˜์Œ์— ๋‘˜ ๋‹ค ๋„์›Œ์•ผ ํ•จ
docker compose pull
docker compose up -d
fi
# ๋ถˆํ•„์š”ํ•œ ์ด๋ฏธ์ง€ ์ •๋ฆฌ
docker image prune -f
# nginx ์„ค์ •์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ ๋ฌด์ค‘๋‹จ ๋ฐ˜์˜
docker exec interview-be-nginx nginx -t && docker exec interview-be-nginx nginx -s reload || true