본문 바로가기

CI CD

ssh 를 사용하여 배포시 서버측의 environment 를 불러오지 못하는 문제 (github action)

728x90

 

문제

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 값을 추가시킴으로써 환경변수에 전달하는 방법이 있다.

 

 

728x90