과정
시작하기에 앞서 과정부터 설명해드리겠습니다.
master branch에 push 가 되면 GitHub Actions 에서
소스를 build 를 하고 추출된 jar 를 서버에 이동시킨 뒤 서버에서 기동되도록 합니다.
master push > github actions > 개인서버
SSH Key 생성
Jar 파일 전송과 서버에서의 script 실행을 위해서 SSH를 사용합니다.
그래서 SSH Key 를 생성해줍니다.
해당 키는 Actions에서 사용할 SSH 플러그인(?) 에서 요구하는 사항이라
PEM 형태의 키로 생성합니다.
ssh-keygen -m PEM -t rsa -b 4096
해당 명령어를 실행하면 몇가지 질문이 나오는데 그냥 엔터 엔터 해줍니다.
생성이 끝나고나면 ~/.ssh 경로에 id_rsa 와 id_rsa.pub 파일이 생성됩니다.
vi id_rsa
vi 명령어로 파일을 열어봅니다.
아주 길게 암호화된 키가 있습니다.
그럼 이제 이파일의 전체 내용을 복사합니다.
—–BEGIN 부터 —END 도 다 포함해줍니다.
Secret Data
이제 Actions 파일을 만들어 보기전에 Secret Data 를 만들겁니다.
이게 뭐냐면 GitHub에서 특정 변수 값을 암호화 해서 사용할수있게 만드는 겁니다.
그냥 작성해도 되지만 Secret 을 사용하게되면 GitHub 계정을 해킹당하더라도
서버의 중요 정보는 털리지 않기 때문에 꼭 사용하길 권장합니다.
안그러면 GitHub을 해킹당하는 순간 서버도 해킹을 당하는거나 마찬가지겠죠?
해당 Repository 사이트로 이동하여 Settings 에 들어갑니다.
들어가면 Secrets and variables > actions 로 이동합니다.
여기서 Secret data 를 생성할 수 있습니다.
New repository secret 을 클릭하여 생성해봅니다.
SERVER_HOST 는 서버 아이피 (포트제외) ex) 123.123.123.123
SERVER_KEY 에는 아까 복사한 SSH Key
SERVER_USERNAME 은 서버 로그인 아이디 입니다.
Action 파일 생성
자 이제 준비는 끝났습니다.
Actions 파일을 만들어보겠습니다.
Actions 를 클릭해보면 set up a workflow yourself 를 클릭하여
새롭게 만들어보겠습니다.
이제 action 파일을 작성해보자
env 에는 변수를 선언할수있다.
jar 파일을 서버에 둘 경로와 jar 파일명을 선언하였다.
name: Deploy to Server on: push: branches: - master env: FILE_PATH: /var/www/batch/ FILE_NAME: batch.jar jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout Repository uses: actions/checkout@v2 - name: Set up JDK uses: actions/setup-java@v2 with: distribution: 'adopt' java-version: '17' - name: Gradle Permission run: chmod +x gradlew - name: Build and Package uses: gradle/gradle-build-action@v3.0.0-beta.1 with: arguments: build - name: Deploy uses: easingthemes/ssh-deploy@v5.0.0 with: REMOTE_HOST: ${{ secrets.SERVER_HOST }} REMOTE_USER: ${{ secrets.SERVER_USERNAME }} SSH_PRIVATE_KEY: ${{ secrets.SERVER_KEY }} REMOTE_PORT: 22 SOURCE: 'build/libs/${{env.FILE_NAME}}' TARGET: '${{env.FILE_PATH}}' SCRIPT_AFTER: | pid=$(ps aux | grep "${{env.FILE_NAME}}" | grep -v grep | awk '{print $2}') echo "pid : $pid" echo "jar : ${{env.FILE_PATH}}${{env.FILE_NAME}}" if [ -n "$pid" ]; then kill -9 $pid fi nohup java -jar ${{env.FILE_PATH}}${{env.FILE_NAME}} 2>&1 &
과정을 설명하자면 ubuntu 환경에서 repository를 checkout 한다.
그 후 jdk 를 setup 하고 gradle 로 빌드 한다.
이후 빌드되서 나온 jar 파일을 서버로 전송한다.
그리고 기존 실행되어있는 batch.jar 가 있다면 kill 해준다.
마지막으로 jar 파일을 실행해준다.
env 에 jar 경로와 파일명을 미리 선언해주어서 사용하였다.
그리고 앞서 등록했던 secret 변수로 ssh 를 사용하였다.
gradle build가 완료되면 기본 경로는 build/libs 에 jar 가 생성된다.
참고로 jar 의 이름은 build.gradle 에서 수정할 수 있다.
나는 jar 파일이 batch.jar 로 추출되도록 하였다.
원하는 이름으로 jar 가 생성되도록 수정해주자.
// build.gradle bootJar{ archiveFileName = 'batch.jar' }
Actions 확인
자 이제 master brach 에 push 를 했을때 actions가 잘 실행되는지 확인해보자.
master brach 에 push 를 해주고 actions 메뉴에 와보면 우리가 만든게 실행이 되고있는걸 확인할 수 있다.
클릭을 해서 보면 더 자세하게 볼 수 있다.
이제 dev brach에서 개발 후 master 에 push 해준다면
자동으로 배포까지 되도록 설정이 완료되었다.
actions 는 개인이 쓰기에 무료에 좋다.
외부값을 받아서도 쓸수도있고 기능이 꽤나 많은듯하다.