GitHub Actions에서 어떤 프로그램이든 셸로 사용 가능함
(yossarian.net)- GitHub Actions에서
run:
블록을 실행할 때 사용하는 셸을shell
키워드로 지정할 수 있음 - 워크플로에서는 선택 사항이지만, 개별 액션 정의에서는 필수 항목임
- 기본값은 운영체제에 따라 자동 지정됨: Linux/macOS는
bash
, Windows는pwsh
- 명시적으로
shell: bash
를 설정하면, 다음과 같은 기본 플래그도 포함됨:--noprofile --norc -eo pipefail
아무 실행 파일이나 shell
로 지정 가능함
- 일반적으로
shell
에 사용할 수 있는 값이 제한되어 있다고 생각하기 쉬움 - 실제로는
$PATH
에 있는 모든 실행 파일을 셸로 사용할 수 있음 - 실행 명령이 파일 입력을 받지 않으면, 특별한 인자인
{0}
를 넘겨야 함 -
{0}
는 GitHub가 자동으로 임시 파일 경로로 대체해 줌
실험적인 예시들
- C 언어 컴파일러(tcc)를 셸처럼 사용하여 직접 실행하는 것도 가능함
-
$PATH
를 조작하여 가짜bash
셸을 만들어 사용하는 것도 가능함 - GitHub는
shell
항목에 명시된 값이 실제 어떤 실행 파일이든 상관하지 않음
보안적 시사점
- GitHub Actions에서는 파일 쓰기와 실행 간의 경계가 희미함 (
GITHUB_ENV
,$GITHUB_PATH
등으로도 실행 가능성 존재) -
shell: bash
등 잘 알려진 값조차도$PATH
를 통해 탐색되며, 고정된 실행 경로(/bin/bash
)를 사용하지 않음 - 예상과 달리,
python
과 같은 값도 단순한 툴캐시 참조가 아닌 실제 경로 기반 실행임
github/runner-image 레포만 봐도 그냥 사용할 수 있는 패키지가 꽤나 많이 설치가되죠....
이미지 만들면 1GB는 그냥 들어가는....
Hacker News 의견
- 과거에 bash의 -x 플래그를 사용하여 Actions 워크플로우에서 실행되는 모든 명령을 출력하도록 강제한 경험이 있음. 이는 디버깅에 매우 유용함
- 작업 중 발견한 GitHub Actions의 멋진 비공식 트릭은 와일드카드를 사용하여 repository_dispatch 이벤트 이름을 매칭하는 것임
- 이는 중앙 집중식 릴리스 파이프라인을 통해 정의된 재사용 가능한 워크플로우를 강제할 수 있는 유일한 방법임
- 이벤트를 디스패치할 때 제품과 버전을 쉽게 식별할 수 있음
- GitHub Actions에서 작업을 적게 할수록 좋다는 경험이 있음
- 빌드 시스템(예: Make)을 사용하여 로직을 인코딩하고 GitHub Actions에서 호출하거나
- 작은 CLI 프로그램을 작성하여 GitHub Actions에서 호출하는 것을 선호함
- 로컬에서 디버깅하는 것이 CI에서 디버깅하는 것보다 훨씬 쉬움
- 스프레드시트를 코드로 변환하라는 요청을 받았을 때 두려워했던 세대가 있었음
- 이 세대는 GitHub Actions로 구축된 배포에 규율을 부여하라는 요청을 받을 때 두려워할 것임
- Github Actions Runner 코드가 읽기 쉬움
- 인기 있는 셸/바이너리에 대한 기본 인수를 정의하는 특정 위치가 있음
- ScriptHandler.cs에는 프로세스 환경, 인수 등을 준비하는 모든 코드가 있음
- 전체적으로 이 코드의 단순성에 긍정적으로 놀랐음
- 기본 셸 'bash'를 속여서 어떤 프로그램이든 실행할 수 있음
- 다른 액션의 독자가 무슨 일이 일어나고 있는지 알고 있는 한, 이는 매우 유용함
- 쉘 스크립트가 몇 줄에서 시작하여 백 줄 이상의 괴물로 성장한 경험이 있음
- Python stdlib의 배열과 타입을 포함한 기능을 원했음
- GitHub 워크플로우 YAML 파일에서 CI 작업을 직접 실행하는 Go 코드를 쉽게 실행할 수 있는 희망을 줌
- goeval은 아직 파일 입력을 직접 지원하지 않음
- 쉘 트릭이 필요함
- 약간의 보일러플레이트가 필요함
- goeval의 저자임
- Github CI yaml의 장점이 무엇인지 궁금함
- CI/CD에서 C를 작성하고 저수준 시스템 작업이라고 부를 수 있게 됨
- 어셈블리도 작성할 수 있을 것임