GitHub Actions 시크릿은 이름이 틀려도 오류를 안 낸다
워크플로에 시크릿 네 개를 넣었다. 돌렸더니 이렇게 죽었다.
NOTION_TOKEN 과 NOTION_DB 환경변수가 필요합니다.
##[error]Process completed with exit code 1.
시크릿은 분명히 등록했는데 스크립트는 없다고 한다.
여기서 대개 의심하는 것
스크립트부터 의심했다. 환경변수 읽는 코드가 잘못됐나 싶어 열어봤다.
const TOKEN = process.env.NOTION_TOKEN;
멀쩡했다. 로컬에서 잘 돌던 그 스크립트 그대로였다.
다음은 워크플로 문법. ${{ secrets.NOTION_TOKEN }} 도 맞게 썼다.
실제 원인
secrets.NOTION_TOKEN 이라는 시크릿이 없었다.
없으면 워크플로가 멈출 것 같은데 안 멈춘다. 없는 시크릿을 참조하면 빈 문자열로 치환하고 그냥 진행한다. 오류도 경고도 없다.
내가 등록한 이름은 GONGSU_DB 하나뿐이었다. 나머지 셋은 저장조차 안 돼 있었다.
어떻게 알아채나
로그의 env: 블록을 본다.
env:
NOTION_TOKEN:
NOTION_DB:
여기가 비어 있으면 그 이름의 시크릿이 없다.
값이 제대로 들어갔으면 이렇게 나온다.
env:
NOTION_TOKEN: ***
GitHub 은 시크릿 값을 로그에서 *** 로 가린다. 가릴 값이 있으면 별표가 찍히고 없으면 아무것도 안 찍힌다. 이 차이가 사실상 유일한 단서다.
확인하는 법
gh CLI 를 쓰면 등록된 이름이 바로 나온다. 값은 안 나오고 이름만.
gh secret list
내 경우 이렇게 나왔다.
GONGSU_DB 2026-08-15T07:49:21Z
이걸 5분 만에 돌렸으면 30분을 아꼈다.
왜 헷갈리나
세 가지가 겹친다.
저장이 실패해도 조용하다. 나는 Name 칸에 NOTION_TOKEN= 이라고 = 를 붙여 넣었다. 셸에서 환경변수 쓰던 습관이다. 시크릿 이름은 영문·숫자·언더바만 받으니 이건 거부된다. 그런데 거부됐다는 걸 나중에 확인하지 않으면 등록된 줄 안다.
저장소 시크릿과 환경 시크릿은 다른 곳이다. 같은 화면 위아래에 있어서 헷갈린다. 워크플로에 environment: 를 안 썼으면 환경 시크릿은 job 에서 안 보인다. 환경에 넣고 안 된다고 하는 경우가 여기다.
그리고 실패 지점이 시크릿에서 멀다. 오류는 스크립트가 내는데 스크립트는 자기가 왜 빈 값을 받았는지 모른다. 그래서 스크립트를 먼저 뒤지게 된다.
처방
등록 후 이름부터 확인한다.
gh secret list
시크릿이 아니어도 되는 값은 시크릿으로 두지 않는다. 나는 노션 DB id 를 시크릿에서 빼서 워크플로에 직접 넣었다.
env:
NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
NOTION_DB: 1db27661-1676-45f6-95fd-bda8366a9898
DB id 는 토큰 없이는 아무것도 못 하는 식별자다. 숨겨서 얻는 게 없는데 시크릿으로 두면 이름 어긋날 자리만 하나 더 생긴다.
빈 값을 초반에 잡고 싶으면 한 줄 넣는다.
- run: test -n "$NOTION_TOKEN" || { echo "NOTION_TOKEN 이 비었다"; exit 1; }
env:
NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
npm ci 로 1분 쓰고 나서 죽는 것보다 낫다.
남은 것
secrets 컨텍스트에 없는 키를 참조하면 경고라도 내주면 좋겠는데 찾아본 범위에서는 그런 설정이 없었다. 오타 하나가 조용히 빈 문자열이 되는 구조는 지금도 좀 이상하다.