# GitHub Actions에서 어떤 프로그램이든 셸로 사용 가능함

> Clean Markdown view of GeekNews topic #20230. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=20230](https://news.hada.io/topic?id=20230)
- GeekNews Markdown: [https://news.hada.io/topic/20230.md](https://news.hada.io/topic/20230.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-04-09T10:00:08+09:00
- Updated: 2025-04-09T10:00:08+09:00
- Original source: [yossarian.net](https://yossarian.net/til/post/any-program-can-be-a-github-actions-shell/)
- Points: 4
- Comments: 2

## Topic Body

- 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`과 같은 값도 단순한 툴캐시 참조가 아닌 실제 경로 기반 실행임

## Comments



### Comment 36939

- Author: tujuc
- Created: 2025-04-09T11:34:31+09:00
- Points: 1

[github/runner-image](https://github.com/actions/runner-images) 레포만 봐도 그냥 사용할 수 있는 패키지가 꽤나 많이 설치가되죠....  
  
이미지 만들면 1GB는 그냥 들어가는....

### Comment 36928

- Author: neo
- Created: 2025-04-09T10:00:08+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=43617493) 
- 과거에 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를 작성하고 저수준 시스템 작업이라고 부를 수 있게 됨
  - 어셈블리도 작성할 수 있을 것임
