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 등등 평소에 잘 모르거나 생소한것들을 특히 더 많이 접했다
'마구니 패치 노트' 카테고리의 다른 글
| 비밀번호 해싱MD5 > sha256 문제 해결 (0) | 2023.05.19 |
|---|---|
| 서버타임 동기화 (0) | 2023.05.06 |
| SQL 쿼리 파라미터 바인딩 %?% 문제 (0) | 2023.03.03 |
| parsing 후 저장시 데이터 중복 문제 (0) | 2023.02.28 |
| VScode CSS 세팅(여러 선택자 줄바꿈 해결) (0) | 2023.02.17 |
댓글