FAQ: 무료 셸이 등록된 러너가 아닌 이유
요약
본 글은 챗 모델의 출력물(모델 답변), 무료 셸 세션, GitLab job 기록 등 여러 출력을 하나의 증거로 오인하는 경향을 지적합니다. 각 객체는 독립적인 정보를 담고 있으며, 이들을 혼동하면 시스템의 실제 상태를 잘못 판단할 수 있습니다.
핵심 포인트
- 모델 출력과 실제 작업 추적 기록은 별개의 객체입니다.
- 무료 셸 세션이 실제로 GitLab runner인지 확인해야 합니다.
- 진정한 증거는 러너 ID와 코디네이터가 관리하는 공식 기록에 있습니다.
챗 모델에게 배포 스크립트를 요청했습니다.
그 스크립트를 무료 셸에 붙여넣었습니다.
프로세스가 0으로 종료되었기 때문에 마침내 안심했습니다.
그런데 그 무료 셸이 실제로 당신의 GitLab runner인가요?
출력된 stdout이 실제로 당신의 job trace인가요?
저는 이 FAQ를 작성했기 때문에, 그것들은 서로 다른 객체이기 때문입니다.
저는 사설 연구실의 벤치마크를 공유하는 것이 아닙니다.
제가 공유하는 것은 여러분 스스로 실행할 수 있는 체크리스트입니다.
아래의 모든 명령을 영수증이 아닌 제안으로 간주하십시오.
이 신화가 사실처럼 느껴지는 이유
접근 가능한 호스트는 마치 자신이 소유한 인프라처럼 느껴집니다.
0 종료(zero exit)는 완료된 파이프라인 작업처럼 느껴집니다.
이러한 느낌들은 작업을 기록하는 코디네이터를 건너뛰게 만듭니다.
당신은 러너 ID보다 호스트 이름을 더 신뢰해 본 적이 있나요?
터미널 스크롤백을 증거로 보관한 적이 있나요?
저는 어느 습관에 대해서도 브랜치를 병합하지 않을 것입니다.
제가 병합하기를 거부하는 세 가지 객체
저는 모델의 답변을 하나의 버킷에 보관합니다.
무료 셸 세션은 다른 버킷에 보관합니다.
GitLab job 기록은 세 번째 버킷에 보관합니다.
한 버킷의 녹색 표시(green mark)는 로컬입니다.
그것이 나머지 두 버킷을 찍어주지는 않습니다.
이 분리가 바로 전체 수정된 정신 모델입니다.
각 객체가 정직하게 증명할 수 있는 것
모델 답변은 모델이 텍스트를 방출했다는 것을 증명합니다.
무료 셸은 해당 호스트가 프로세스를 실행했음을 증명합니다.
GitLab job은 코디네이터가 작업을 예약했음을 증명합니다.
하나의 스크린샷이 이 세 가지 증거를 모두 담을 수 있을까요?
저는 한 파일로 그것이 가능하다고 보지 않습니다.
주장하는 내용과 실제로 일치하는 기록을 요구하십시오.
신화 1: 호스트 이름은 등록이다
누군가 호스트를 게시하고 그것을 CI라고 부릅니다.
ping 응답이 여러분을 위해 러너를 등록할 수 있나요?
등록은 DNS 이름이 아니라 코디네이터의 기록입니다.
셸 로그인은 러너 토큰이 아닙니다.
러너 토큰은 개인 액세스 토큰(personal access token)이 아닙니다.
GitLab은 러너를 프로젝트 또는 그룹에 바인딩합니다.
호스트를 신뢰하기 전에 던져야 할 질문들
- GitLab에서 반환된 숫자 러너 ID는 무엇인가요?
- 오늘 그 러너가 광고하는 태그는 무엇인가요?
- 그 러너는 일시 중지되었나요, 잠겼나요, 오프라인인가요, 아니면 누락되었나요?
- 팀원 중 누가 그 러너 토큰을 교체할 수 있나요?
# 실행되지 않은 제안: 실제 토큰을 기록에 붙여넣지 마세요.
curl --silent --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" "${GITLAB_HOST}/api/v4/projects/${PROJECT_ID}/runners" | jq '.[] | {id, description, active, paused, status, tag_list}'
이 목록에 무료 셸(free shell)이 없다면 중단하세요.
호스트는 존재할 수 있지만 여전히 등록되지 않았을 수 있습니다.
curl 타임아웃 또한 러너 ID가 아닙니다.
신화 2: 모델의 stdout은 작업 추적 기록이다 (job trace)
모델은 가짜 작업 URL을 출력할 수 있습니다.
당신의 코디네이터가 실제로 그 작업 ID를 생성했나요?
아니라면, 그 링크는 단지 장식품일 뿐입니다.
작업 추적 기록(job trace)에는 작업 ID와 프로젝트가 포함됩니다.
그것은 GitLab 자체가 저장한 상태(status)를 가지고 있습니다.
사용자의 로컬 터미널 스크롤백에는 이 둘 중 어느 것도 없습니다.
# 제안: 하나의 작업을 가져온 다음, 방어할 수 있는 필드를 비교하세요.
curl --silent --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" "${GITLAB_HOST}/api/v4/projects/${PROJECT_ID}/jobs/${JOB_ID}" | jq '{id, status, ref, runner: .runner.id, started_at, finished_at}'
러너 ID를 등록 목록과 일치시키세요.
ref를 주장하는 브랜치와 일치시키세요.
둘 중 어느 하나라도 일치가 실패하면, 당신은 시연(demo)을 하는 것입니다.
실패한 상태 역시 실제 작업일 수 있습니다.
성공은 상태 값일 뿐이며, 신원 증명은 아닙니다.
신원은 여전히 러너 ID 필드에서 나옵니다.
추적 기록이 분위기(vibe)는 아니다
사람들은 스크립트를 '분위기 있게' 코딩하고 스크롤백을 전송합니다.
그 스크롤백에 실제 파이프라인 ID가 명시되어 있나요?
ID가 누락되었다면, 당신은 리허설(rehearsal) 기록을 보관한 것입니다.
저는 초기 탐색을 위한 빠른 초안(fast drafts)은 여전히 좋아합니다.
하지만 검토 과정에서 가짜 원장(fake ledgers)은 싫습니다.
속도가 작업 기록을 대체할 수는 없습니다.
신화 3: 무료 모델 접근은 비밀 관리(secret hygiene)를 건너뛴다
무료 모델 접근은 비밀 저장소가 아닙니다.
프롬프트 로그는 마스킹된 CI 변수가 아닙니다.
배포 키(deploy key)를 채팅창에 붙여넣을 건가요?}<tool_call|>```{
저는 여전히 초안 작성을 위한 모델을 원합니다.
다만, 이 모델이 운영(production) 자격 증명(credentials)을 보유하는 것은 원치 않습니다.
그 경계는 어떤 무료 등급 발표에도 견뎌내야 합니다.
# 제안: 비밀번호 형태의 텍스트가 초안에 있으면 실행 거부.
if grep -E '(glpat-|PRIVATE-TOKEN|BEGIN OPENSSH)' draft.sh; then
echo '초안에 비밀번호 형태의 텍스트가 있습니다; 중단'
...
공개합니다: 이 문서는 MonkeyCode의 제품 홍보(product outreach)의 일환으로 준비되었습니다.
MonkeyCode 무료 모델 액세스는 체크리스트 텍스트를 초안 작성할 수 있습니다.
무료 서버 옵션은 로컬 절반을 실행할 수 있습니다.
이 둘 중 어느 것도 귀하의 그룹에 러너(runner)를 등록하지 않습니다.
저는 할당량, 모델 목록 또는 하드웨어에 대해 인용하는 것이 아닙니다.
그러한 세부 정보는 변경되며, 이 페이지가 출처는 아닙니다.
의존하기 전에 최신 제품 문서를 읽으십시오.
모델이 jq 필터만 제안하도록 하세요.
무료 서버가 로컬 해시를 출력하게 하세요.
GitLab을 유일한 기록 시스템으로 남겨두세요.
고객 데이터를 무료 채팅에 보내지 마세요.
사인업 배너를 SLA(Service Level Agreement)로 취급하지 마세요.
프롬프트에 러너 토큰을 저장하지 마세요.
초안 디버깅 중에 토큰을 에코(echo)하지 마세요.
자격 증명은 이미 통제하고 있는 CI 변수에 보관하세요.
신화 4: 무료 호스트는 여분의 러너 용량
무료 서버 옵션은 계약이 아닌 편의성입니다.
누가 귀하의 작업이 내일 그곳에 도착할 것이라고 약속했나요?
저는 여기에 그러한 약속을 반복할 수 없습니다.
기간, 용량 및 로그 보존 기간은 여기서 명시되지 않습니다.
사인업 페이지에서 SLA를 만들지 마세요.
운영 배포(production deploys)를 데모 호스트에 연결하지 마세요.
# 제안: 해당 호스트에서 실제로 관찰할 수 있는 것을 기록합니다.
date -u +%Y-%m-%dT%H:%M:%SZ
uname -srm
...
해당 호스트의 체크섬은 로컬 사실입니다.
이것이 파이프라인 사실이 되는 것은 GitLab이 그것을 저장한 후에만 가능합니다.
파일을 작업 아티팩트(job artifact)로 업로드한 다음 다시 가져오세요.
# 제안: GitLab이 실제로 저장한 아티팩트를 확인합니다.
curl --silent --header
로컬 해시와 저장된 해시를 비교하세요.
불일치한다는 것은 다른 파일을 리허설했다는 의미입니다.
해당 해시들이 일치할 때까지 플릿(fleet) 논의를 중단하세요.
## 실행 결과를 신뢰하기 전 결정표
저는 셸만 답변할 수 있는 행은 신뢰하지 않을 것입니다.
병합 주장을 위해서는 GitLab 컬럼이 필요합니다.
이 표를 자체 노트에서 게이트로 사용하세요.
| 질문 | 무료 셸만 가능 | 필수 기록 |
| :--- | :--- | :--- |
| 호스트에 도달할 수 있나요? | Ping 또는 SSH가 성공할 수 있음 | 러너 API의 러너 ID |
| ... |
If the right column is empty, the myth is still in charge.
채팅 기록을 재진술하는 것이 아니라 API 출력을 채우세요.
재진술된 채팅은 이러한 혼란이 시작되는 방식입니다.
## 레이블 '미실행(unrun)'의 짧은 워크플로우
저는 이 시퀀스를 스크래치 프로젝트에서 실행할 것입니다.
이 초안을 위해 저는 이를 실행하지 않았습니다.
실제 ID로 교체한 후에만 복사하세요.
1. 무료 모델 접근으로 검사 스크립트 초안 작성.
2. 해당 초안에서 먼저 토큰 형태의 문자열을 스캔합니다.
3. 무료 서버에서 로컬 해시 명령 실행.
4. GitLab 자체 흐름을 통해 실제 러너 등록.
5. 보호되지 않은 브랜치에 파이프라인 하나 트리거.
6. 작업 JSON과 아티팩트 zip 가져오기.
7. 러너 ID, 참조(ref), 상태, 그리고 체크섬 비교(Diff).
8. 병합 요청에 불일치 사항 작성.
러너를 생성하지 않는 미실행 골격 코드입니다.
set -eu
test -n "${GITLAB_HOST}"
...
jq가 실패하면, 당신은 러너 기반 작업이 없습니다.
스크립트를 조정하기 전에 등록을 수정하세요.
더 스마트한 프롬프트가 그 ID를 지어내지 않습니다.
### 제가 실패를 읽는 방법
누락된 러너 ID는 셸이 부차적인 단계였음을 의미합니다.
누락된 아티팩트는 해시가 GitLab에 진입하지 않았음을 의미합니다.
보호 브랜치 오류는 당신이 올바르게 리허설 단계에 머물렀음을 의미합니다.
부차적 단계를 위해 누군가를 페이지(page)하시겠습니까?
저는 그 격차를 위해 그들을 페이지하지 않을 것입니다.
그 격차를 기록하고 실제 러너에서 재실행할 것입니다.
구형 모델: green shell은 파이프라인이 실행되었음을 의미합니다.
신규 모델: GitLab 기록만이 유일한 작업 증명(job proof)입니다.
셸은 장소이지, 원장(ledger)이 아닙니다.
구형 모델: 무료 접근은 프롬프트에 비밀 정보가 있어도 괜찮다는 뜻입니다.
신규 모델: 프롬프트는 저장소가 아니라 입력값일 뿐입니다.
마스킹(Masking)은 여전히 CI 설정에서 처리해야 합니다.
구형 모델: 무료 서버는 여분의 러너 용량입니다.
신규 모델: 이는 연습할 수 있는 선택적 장소일 뿐입니다.
러너 용량 자체는 별도의 플랜이 필요합니다.
## 이 접근 방식을 사용해서는 안 되는 경우
컴플라이언스 증명(compliance attestation)이 필요한 경우 건너뛰세요.
러너가 반드시 비공개로 유지되어야 하는 경우 건너뛰세요.
무료 호스트 장애 시 알림을 받아야 하는 경우 건너뛰세요.
학생들은 임시 프로젝트에서 이 체크리스트를 연습할 수 있습니다.
규제 대상 리포지토리의 관리자는 여기에 의존해서는 안 됩니다.
API 권한이 없는 사람은 여섯 번째 단계를 완료할 수 없습니다.
유료 러너, 비공개 네트워크, 변경 기간(change windows)은 이 FAQ 밖에 존재합니다.
제가 그것들을 제거하라고 말하는 것이 아닙니다.
셸을 이용해 가짜로 만들지 말라고 말씀드리는 것입니다.
## 제가 명확히 하지 않을 제한 사항들
이 초안에는 서비스 중단 시간(uptime)이나 할당량(quota) 숫자가 언급되어 있지 않습니다.
이 초안에는 모델 이름이나 머신 크기가 언급되어 있지 않습니다.
그러한 사실들은 현재의 주요 제품 문서에 포함되어야 합니다.
운영자는 여기서 단지 두 가지 가용성 주장만 제시했습니다.
그 주장은 영구적이거나 용량에 대한 약속이 아닙니다.
읽는 날짜의 문서를 확인하세요.
API 예시는 이미 보유하고 있는 토큰을 가정합니다.
이는 다른 사람의 프로젝트에 접근할 권한을 부여하지 않습니다.
보호된 브랜치나 승인(approvals)을 우회하지도 못합니다.
무료 셸은 비밀 정보가 업로드될 경우 데이터 유출이 발생할 수 있습니다.
무료 모델은 키를 전송할 경우 붙여넣은 키를 보존할 수 있습니다.
두 도구 모두 '초안' 측에 두는 것이 좋습니다.
공개 GitLab API 형태(shapes)는 시간이 지남에 따라 변경될 수 있습니다.
해당 엔드포인트를 최신 GitLab 문서와 비교하여 확인하세요.
이 FAQ에서 특정 버전을 고정하지 않습니다.
## 제가 시작할 곳
로컬 부분만 원한다면, 임시 리포지토리부터 시작하세요.
사용하기 전에 현재의 무료 접근 관련 문서를 읽으세요.
그런 다음 이 체크리스트를 실행하고 GitLab을 원장으로 유지하세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기