본문 바로가기
마구니 패치 노트

자동 배포 개선/기능추가

by puy0 2023. 3. 31.

github actions를 통해 빌드와 배포를 성공하고 2일이 지났다

https://github.com/geonho1943/LFG

 

GitHub - geonho1943/LFG: "Looking For Group" service

"Looking For Group" service. Contribute to geonho1943/LFG development by creating an account on GitHub.

github.com

 

프로젝트를 개선하고나서 커밋만 하면 자동으로 배포가 가능하기때문에

더이상 배포를 신경쓰지 않으려고 했지만

자동배포 스크립트에 문제점을 발견하기도 했고

나름의 최적화를 하고싶었기때문에

디버깅도 불편하고 하루에 수십번의 커밋이 거부감이들지만

다시 actions 를 건들여 보기로 했다

 

기존의 yml 파일이다

on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    
    steps:
      - name: Create Properties
        uses: actions/checkout@v3
      - run: touch ./src/main/resources/application-awsMariaDB.properties
      - run: echo "${{ secrets.APPLICATION_AWSMARIADB_PROPERTIES }}" > ./src/main/resources/application-awsMariaDB.properties
      - run: cat ./src/main/resources/application-awsMariaDB.properties

      - name: Setup JDK 17
        uses: actions/setup-java@v3
        with:
          distribution: 'zulu'
          java-version: '17'

      - name: Build with Gradle
        run: |
          chmod +x gradlew
          ./gradlew build
      - name: ssh connection
        uses: cross-the-world/ssh-scp-ssh-pipelines@latest
        with:
          host: ${{ secrets.HOST }}
          port: ${{ secrets.PORT }}
          user: ${{ secrets.USER }}
          key: ${{ secrets.KEY }}
          scp: |
            ./build/libs/LFG*-SNAPSHOT.jar => /home/support800/server/
          last_ssh: |
            cd /home/${{ secrets.USER }}/server/
            sudo -S sh -c "nohup java -jar LFG*-SNAPSHOT.jar &" <<< "${{ secrets.PW }}"

 

 

원래 실행권한이 있었기때문에

Gradlew의 권한 수정 을 생략했다

 

그리고 ssh/scp 액션의 latest 를 최신 버전명으로 직접 입력했다

만약 액션의 업데이트가 있을경우 사용하는 버전은 최신버전을 사용하지만

액션의 문법은 기존의 스크립트를 수행하기때문에

액션의 규칙이 바뀌면 자동 배포를 해줄수 없기때문이라고 생각했다

 

그리고 이번 푸시를 통해

기존의 빌드파일이 있을경우 자동 배포가 되지않는다는것을 알게되었다

LFG*-SNAPSHOT 은 실제로 LFG-x.x.x-SNAPSHOT.jar 이라는 빌드파일의

버전변경에 대응 하기위해 *를 사용했는대

0.0.1 버전의 파일이 있을때 위의 스크립트가 실행 되면

0.0.1 파일에 0.0.2파일이 더해져 한번에 두개의 파일이 실행되며

충돌이 발생했다

 

그래서 기존의 파일을 삭제후 새버전의 빌드파일을 올려줘야 했다

내가 사용하는 액션의 가장큰장점은

first_ssh 와 last_ssh가 나뉘어 있다는것이다

더 인기있는 액션의 경우 속도도 더빠르고 업데이트도 잦을지모르겠지만

딱봤을때 actions 로그에서 문제가 발생한 원인을 비교적 빠르게 알수있다

로컬에서 테스트 해볼수 없기때문에 무수히 많은 echo를 남발하고 싶지않았다

 

github actions는 job 단위로 다시 돌려볼수있는대 

 

이때 디버깅보드를 활성화하는 방식으로 디버깅을 할수있다

하지만 디버깅모드가 기존의 ide 처럼 친절하지는 않았다

 

&& 로 [ ] 의 파일의 존재를  -e 옵션으로 채크할수있다

만약 해당 파일이 있다면 그것 삭제 시키고 delete success를 출력한다

if[]then fi 을 사용 하려고 했지만

줄바꿈이 있을때 github actions 의 컴파일러가 && 를 추가해버리기때문에 에러가 난듯해보였다

그래서 &&를 직접 사용해 한줄로 구현했다

first_ssh: |
            cd /home/${{ secrets.USER }}/server/
            [ -e LFG*-SNAPSHOT.jar ] && rm -f LFG*-SNAPSHOT.jar && echo 'delete success'

 

그리고 가장 오래걸리고 어려웠던 문제가

권한이 없으면 tomcat은 80포트에서 돌아가지않아서 셸에 <<< 로 pw변수를 대입 해주는것으로

해결했던 문제때문인지 nohup.out 로그파일이 생성되지않는것이였다

 

배포 자동화가 끝나면 가장 하고싶은것이 

testcase 를 만드는것과

로그를 잘짜서 플젝이 잘 돌아가는지 어떤기능을 많이쓰고 있는지

모니터링 하는것이 가장 하고싶었다

하지만 로그파일이 안나와버리면 곤란하기때문에 

어떻게든 당장 해결하기로했다

 

진짜 원인을 찾은건 이 글 덕뿐이었다

https://velog.io/@tigger/%EB%B0%B0%ED%8F%AC-%EC%9E%90%EB%8F%99%ED%99%94-%EA%B5%AC%EC%84%B1

 

배포 자동화 구성

이제 Jar를 배포하여 실행해보자.scripts 디렉토리를 생성 후 안에 deploy.sh 파일을 만들어 준다. 위치는 다음 그림과 같다.imagedeploy.sh 파일을 작성하자.script의 파일도 S3에 보내주자. 다음 설정을 추

velog.io

nohup.out파일에 출력 을 지정 해주면서 문제가 해결되었다

 

n:
  push:
    branches:
      - main
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Create Properties
        uses: actions/checkout@v3
      - run: touch ./src/main/resources/application-awsMariaDB.properties
      - run: echo "${{ secrets.APPLICATION_AWSMARIADB_PROPERTIES }}" > ./src/main/resources/application-awsMariaDB.properties
      - run: cat ./src/main/resources/application-awsMariaDB.properties

      - name: Setup JDK 17
        uses: actions/setup-java@v3
        with:
          distribution: 'zulu'
          java-version: '17'

      - name: Build with Gradle
        run: |
          ./gradlew build
      - name: ssh connection
        uses: cross-the-world/ssh-scp-ssh-pipelines@v1.1.4
        with:
          host: ${{ secrets.HOST }}
          port: ${{ secrets.PORT }}
          user: ${{ secrets.USER }}
          key: ${{ secrets.KEY }}
          first_ssh: |
            cd /home/${{ secrets.USER }}/server/
            [ -e LFG*-SNAPSHOT.jar ] && rm -f LFG*-SNAPSHOT.jar && echo 'delete success'
          scp: |
            ./build/libs/LFG*-SNAPSHOT.jar => /home/${{ secrets.USER }}/server/
          last_ssh: |
            cd /home/${{ secrets.USER }}/server/
            sudo -S sh -c "nohup java -jar LFG*-SNAPSHOT.jar > /home/${{ secrets.USER }}/server/nohup.out 2>&1 &" <<< "${{ secrets.PW }}"

 

요약을 하자면

불필요한 과정을 생략하고

지속적으로 자동 배포가 가능하도록 기능과 절차를 추가했다

nohup.out 에 로그를 받을수 있도록 조치했다

 

 

 

직접 빌드하고 배포하는것은 간단하다

그냥 로컬에서 빌드하고 ftp로 파일을 전송하고 

서버에서 실행한다

하지만 자동화를 하니까

직접 ssh 접속 했을때는 간단하게 했던작업들이 스크립트에서는 더 힘들었다
베시 셸 로깅 Gradle scp 등등 평소에 잘 모르거나 생소한것들을 특히 더 많이 접했다

 

 

댓글