CI/CD using github actions & docker #8
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI/CD using github actions & docker | |
on: | |
pull_request: | |
branches: [ "develop" ] | |
push: | |
branches: [ "develop" ] | |
workflow_dispatch: | |
jobs: | |
CI-CD: | |
# Operating system - ubuntu-latest | |
runs-on: ubuntu-latest | |
permissions: | |
contents: read | |
steps: | |
# Checkout - 가상 머신에 체크아웃(저장소 코드 체크아웃) | |
- name: Checkout code | |
uses: actions/checkout@v3 | |
# JDK setting - JDK 17 설정 | |
- name: Set up JDK 17 | |
uses: actions/setup-java@v3 | |
with: | |
java-version: '17' | |
distribution: 'corretto' | |
# 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 - 테스트 없이 gradle 빌드 | |
- name: Build with Gradle | |
run: | | |
chmod +x gradlew | |
./gradlew clean build -x test | |
shell: bash | |
# Set up Docker Buildx - Docker Buildx 설치 | |
- name: Set up Docker Buildx | |
uses: docker/[email protected] | |
- name: Docker Image Build | |
uses: docker/build-push-action@v5 | |
with: | |
context: . | |
dockerfile: Dockerfile | |
push: false | |
tags: ${{ secrets.DOCKER_USERNAME }}/dearnote:latest | |
# Log in to Docker Hub - Docker Hub 로그인 | |
- name: Log in to Docker Hub | |
uses: docker/login-action@v3 | |
with: | |
username: ${{ secrets.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKER_TOKEN }} | |
# Docker image 푸시 | |
- name: Docker Push | |
uses: docker/build-push-action@v5 | |
with: | |
context: . | |
dockerfile: Dockerfile | |
push: true | |
tags: ${{ secrets.DOCKER_USERNAME }}/dearnote:latest | |
## deploy to develop | |
- name: Deploy to dev | |
uses: appleboy/ssh-action@master | |
with: | |
host: ${{ secrets.EC2_HOST }} # EC2 퍼블릭 IPv4 DNS | |
username: ${{ secrets.EC2_USERNAME }} # ec-user | |
key: ${{ secrets.EC2_PRIVATE_KEY }} | |
port: 22 | |
script: | | |
# Docker 네트워크가 존재하지 않으면 생성 | |
if [ -z "$(sudo docker network ls --filter name=${{ secrets.DOCKER_NETWORK }} -q)" ]; then | |
sudo docker network create ${{ secrets.DOCKER_NETWORK }} | |
fi | |
sudo docker pull ${{ secrets.DOCKER_USERNAME }}/dearnote:latest | |
# 기존 컨테이너 중지 및 제거 | |
EXISTING_CONTAINER_ID=$(sudo docker ps -q -f "publish=8080" -f "status=running") # 현재 실행 중이며 8080 포트를 사용하는 컨테이너의 ID | |
if [ ! -z "$EXISTING_CONTAINER_ID" ]; then | |
sudo docker stop $EXISTING_CONTAINER_ID | |
sudo docker rm $EXISTING_CONTAINER_ID | |
fi | |
EXISTING_CONTAINER_ID=$(sudo docker ps -q -f "publish=8080" -f "status=exited") # 8080 포트를 사용하지만 중지된 컨테이너의 ID | |
if [ ! -z "$EXISTING_CONTAINER_ID" ]; then | |
sudo docker rm $EXISTING_CONTAINER_ID | |
fi | |
# 상태가 exited인 모든 컨테이너를 제거 | |
sudo docker rm $(sudo docker ps --filter 'status=exited' -a -q) | |
sudo docker run -d --env-file ~/.env --name dearnote -p 8080:8080 --net ${{secrets.DOCKER_NETWORK}} -e TZ=Asia/Seoul ${{ secrets.DOCKER_USERNAME }}/dearnote:latest | |
sudo docker image prune -a -f |