211205 github에서 CI/CD 적용하기 (github action)

GuruneLee·2021년 12월 5일
2

GIST청원사이트-BE

목록 보기
4/11

참여자: 고세연, 김태완, 이창하, 최은기

git action이란? 임시링크
-> github cloud라는 곳에서 사용자가 정의한 어떤 일을 하는걸 의미하는 듯. .yml 파일을 수정하여 설정한다. 여러 실행 트리거가 있다 (머지, 푸쉬, pr등록, 직접실행 등등)

Continuous-Integration

petition-CI.yml 파일을 작성하는데, 이 파일에

on:
  pull_request:
    branches: [ develop ]

이런 조건이 걸려있어, pr이 등록될때나 pr에 새로운 커밋이 등록될때 작동한다.
기본적으로 ./gradlew build를 사용해 build가 잘 되는지와 test를 통과하는지 테스트 하고 (./gradlew bootJar는 테스트를 안함), 추가적으로 여러 제약사항을 추가할 수도 있다.

Continuous-Deployment

codedeploy를 사용하지 않고, jar와 실행스크립트를 ec2에 직접 옮겨 스크립트를 통해 실행하는 방법을 사용한다.

< appleboy의 action >
파일을 옮기기 위해 github appleboy/scp-action을, 스크립트를 실행하기 위해 github appleboy/ssh-action를 사용한다 (감사합니다 appleboy... )

< ec2 key >
Github Setting 의 Secret key에 'HOST' 와 'PRIVATE_KEY'를 알맞게 넣어줘야 작동한다.

< nohup >

# 1. nohup java -jar -Duser.timezone=Asia/Seoul $JAR_NAME &
# 2. nohup java -jar -Duser.timezone=Asia/Seoul $JAR_NAME 1>nohup/stdout.txt 2>nohup/stderr.txt &

1번처럼 하면 nohup이 제대로 작동하지 않았다 (nohup.out 파일 생성 안됨), 스크립트 내부적으로 nohup을 사용시 그 output의 책임을 스크립트가 가지고 있다는 듯 하다. 파일디스크립터가 다른곳을 향하도록 해서 문제를 해결하도록 한다. (by wantae) stackoverflow

Snippets

github action CI yaml

name: Java CI with Gradle

on:
  pull_request:
    branches: [ develop ]

jobs:
  build:

    runs-on: ubuntu-20.04

    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'adopt'
    - name: Build with Gradle
      uses: gradle/gradle-build-action@4137be6a8bf7d7133955359dbd952c0ca73b1021
      with:
        arguments: build

github action CD yaml

name: CD

on:
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-20.04
    steps:
      - name: Checkout source code
        uses: actions/checkout@v2
        
      - name: Build App
        run: ./gradlew bootJar

      - name: Deploy Prod use SCP
        uses: appleboy/scp-action@master
        with:
          username: ubuntu
          host: ${{ secrets.HOST }}
          key: ${{ secrets.PRIVATE_KEY }}
          source: "./build/libs/*.jar"
          target: "/home/ubuntu/deploy"
          strip_components: 2
          
      - name: Transfer Deploy Script use SCP
        uses: appleboy/scp-action@master
        with:
          username: ubuntu
          host: ${{ secrets.HOST }}
          key: ${{ secrets.PRIVATE_KEY }}
          source: "deploy.sh"
          target: "/home/ubuntu/deploy"

      - name: Execute Server Init Script
        uses: appleboy/ssh-action@master
        with:
          username: ubuntu
          host: ${{ secrets.HOST }}
          key: ${{ secrets.PRIVATE_KEY }}
          script_stop: true
          script: chmod +x /home/ubuntu/deploy/deploy.sh && sh /home/ubuntu/deploy/deploy.sh

run jar file script

#!/bin/bash
 echo "> now ing app pid find!"
 CURRENT_PID=$(pgrep -f gist-competition)
 echo "$CURRENT_PID"
 if [ -z $CURRENT_PID ]; then
         echo "> no ing app."
 else
         echo "> kill -9 $CURRENT_PID"
         kill -9 $CURRENT_PID
         sleep 3
 fi
 echo "> new app deploy"

 cd /home/ubuntu/deploy
 JAR_NAME=$(ls | grep 'gist-competition' | tail -n 1)
 echo "> JAR Name: $JAR_NAME"

 # nohup java -jar -Duser.timezone=Asia/Seoul $JAR_NAME &
 nohup java -jar -Duser.timezone=Asia/Seoul $JAR_NAME 1>nohup/stdout.txt 2>nohup/stderr.txt &
 sleep 2

기타

domain name은 http에서만 적용되나?
ㄴㄴ tcp/ip 를 사용하는 모든 프로토콜에서 적용된다

profile
Today, I Shoveled AGAIN....

0개의 댓글