문제
https://github.com/innovationacademy-kr/swlabs-helper/
프로젝트를 진행하며 github Action을 사용하여 CD 구현중에 생긴 이슈이다.
name: remote ssh command for release deploy
on:
push:
# main 브랜치에서만 작동합니다.
branches: [main]
paths-ignore:
- 'README.md'
- 'docs/**'
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: executing remote ssh commands using key
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: |
cd git/helper-release/scripts
sh deploy.sh
github action 코드는 위와 같다.
ssh-action@master 를 사용하여 ssh로 접근하여 deploy.sh 파일을 실행시킨다. deploy.sh 파일에는 서버 배포를 위한 스크립트가 존재한다.
gitbut action으로 push 될시 배포로직은 시작되나 spring 서버의 PID가 죽는 이슈가 있었다.
수동으로 서버에서 deploy.sh를 실행시킬때에는 서버가 잘 실행되었다.
문제 찾기
팀분들과 함께 찾아본결과 서버의 env 값들을 제대로 불러오지 못하는것을 확인하였다.
deploy.sh의 일부를 수정하여 확인하였다.
nohup java -jar $JAR_PATH --spring.config.location=classpath:/application.properties --spring.profiles.active=dev > helper.log
서버를 실행시키고 helper.log 파일에 쓰도록 리다이렉션 시켰다. 이후 서버에서 로그를 확인한 결과 데이터 베이스 연결 과정에
‘${DB_USERNAME}’=‘localhost’ 같은 형식으로 로그가 남은 것을 확인하였다.
서버의 환경변수를 제대로 불러오지 못한 것으로 판단하였다.
문제 해결
예상대로 ssh 로 실행시킨 쉘에서 환경변수를 불러오지 못하였다.
ssh-action 에서 살펴보니 docker entrypoint.sh에서 사용는 쉘이 /bin/drone-ssh drone-ssh를 사용하여 연결하는것으로 보인다.
해결방법은 두가지가 있다.
source ~/.bash_profile
서버에 존재하는 bash_profile 다시 실행하는 로직을 제일 상단에 추가하였다.
또는
- name: ssh commands
image: appleboy/drone-ssh
settings:
host: foo.com
username: root
password: 1234
port: 22
+ envs:
- aws_access_key_id
script:
- export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
http://plugins.drone.io/appleboy/drone-ssh/
github Setting 의 Secret 에서 Key, Value 값을 추가시킴으로써 환경변수에 전달하는 방법이 있다.