참여자: 고세연, 김태완, 이창하, 최은기
git action이란? 임시링크
-> github cloud라는 곳에서 사용자가 정의한 어떤 일을 하는걸 의미하는 듯. .yml 파일을 수정하여 설정한다. 여러 실행 트리거가 있다 (머지, 푸쉬, pr등록, 직접실행 등등)
petition-CI.yml 파일을 작성하는데, 이 파일에
on:
pull_request:
branches: [ develop ]
이런 조건이 걸려있어, pr이 등록될때나 pr에 새로운 커밋이 등록될때 작동한다.
기본적으로 ./gradlew build를 사용해 build가 잘 되는지와 test를 통과하는지 테스트 하고 (./gradlew bootJar는 테스트를 안함), 추가적으로 여러 제약사항을 추가할 수도 있다.
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
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
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
#!/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 를 사용하는 모든 프로토콜에서 적용된다