4P by GN⁺ 9일전 | ★ favorite | 댓글 2개
  • 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를 작성하고 저수준 시스템 작업이라고 부를 수 있게 됨
    • 어셈블리도 작성할 수 있을 것임