GitHub Action's Environment
Categories:tech
GitHub Action’s Environment
GitHub Actions의 환경 변수와 설정에 대해 알아봅니다.
List
발단
GitHub Action’s 로 CI/CD 를 구축하다 알게된 사항이다.
우선 내가 임의로 만들어둔 CI/CD 파이프라인은 아래와 같다.
---
config:
layout: dagre
---
flowchart TB
n5["Push"] --> n6@{ label: "GitHub Action's" }
n6 --> n7["Lint Validation (eslint)"] & n10["SSH"]
n7 --> n8["Test Case Validation (Jest)"]
n8 --> n9["Build Validation"]
n10 -- Run Deploy Shell Script --> n11["Ubuntu Server"]
n9 --> n10
n6@{ shape: rect}
n10@{ shape: rect}
n8@{ shape: rect}
n9@{ shape: rect}
n11@{ shape: rect}
나는 ssh 원격으로 쉘 스크립트를 실행하는 명령이 실행되는 과정에서 이상한 점을 찾았었다. 분명 서버에는 node.js 와 pm2 등 필요한 패키지들이 설치되어있는데 node 명령어나 pm2 명령어를 쉘 스크립트가 해당 패키지들이 설치되어있지 않다고 오류를 뿜어대는 것이었다. 원인을 파악하기 위해 열심히 구글링을 하던 중 정말 기본적인 사실을 몰랐다는 것을 깨달았다.
원인
우선 ssh로 접속하는 환경(채널 타입)에는 여러가지가 있다.
구분 | 호출 예시 | 특징 | 프로토콜 채널 |
---|---|---|---|
대화형 세션 Interactive shell | ssh user@hostssh -t user@host | • 원격에 로그인 셸이 뜨고 TTY가 할당돼 사용자가 한 줄씩 직접 입력• ~. 등의 escape 시퀀스 사용 가능• 환경변수(프롬프트, PATH 등)와 히스토리가 유지 | shell channel (“terminal shell”) |
원격 명령 실행 Non-interactive / Exec | ssh user@host ‘ls -l /tmp’ | • 전달한 문자열을 bash -c ‘…’처럼 한 번에 실행 후 바로 연결 종료• TTY가 기본적으로 없어 배치(스크립트)용으로 적합• -o BatchMode=yes를 주면 패스워드 프롬프트도 차단 | exec channel |
서브시스템 SFTP·SCP 등 | sftp user@hostssh -s user@host sftp | • 셸 대신 특정 프로토콜(SFTP, Netconf 등)을 실행• 파일 전송이나 특수 서비스를 위해 정의 | subsystem channel (RFC 4254 §6) |
보통 우리가 터미널로 ssh 접속을 해서 명령어를 입력 하는 경우 대화형 세션(shell channel)을 사용하게 된다. 대화형 세션은 TTY가 할당돼고 한 줄씩 명령어 입력이 가능한 특징이 있다. 그리고 대화형 세션을 사용하다 보면 자주 보게되는 사용자에게 설정에 대한 답변을 요구하는 interaction이 있는 명령들이 있다 이것 또한 대화형 세션의 특징이다.
(참고) What is TTY?
원격 명령 실행(exec channel) 의 경우 입력한 명령만 단발적으로 실행 후 바로 연결을 종료한다.
이런 단발적인 명령 실행을 위해 기본적인 몇가지 특징을 가진다.
- 로그인 쉘을 띄우지 않는다.
- TTY를 할당하지 않는다.
- Profile(env)을 로드하지 않는다.
내가 문제를 느꼈던 부분인 분명 설치했던 Node.js, PM2 같은 프로그램들의 명령어 실행이 안되는 것의 원인은 3번 “Profile(env)을 로드하지 않는다.” 때문이었다. Profile(env)을 로드하지 않아 서버에 설치되어있는 프로그램들의 alias 나 PATH 설정이 인식되지 않아서 명령어 실행이 안되던 것이었다.
결론
ssh 접속에는 여러 환경(채널 타입)이 있고 이를 사용할 때 해당 환경이 어떤 특징을 가지고 있는지 파악 후 사용하여야 의도치 않은 오류 혹은 실행을 막을 수 있다.
터미널로 ssh를 접속하여 명령어를 한줄씩 실행하는 환경은 shell channel이다.
ssh로 단일 명령어를 실행시킬 경우의 환경은 exec channel 환경이다.
shell channel은 TTY가 활당되며 Profile(Env)을 로드하고 interaction이 가능한 환경이다.
exec channel은 기본적으로 TTY가 활당되지 않으며 Profile(Env)을 로드 하지 않으며 interaction이 불가능한 환경이다.