Skip to content

install.sh 동시 실행 시 바이너리와 install.json을 하나의 트랜잭션으로 보호 #20

Description

@leehyowon14

요약

동일한 설치 경로를 대상으로 두 install.sh가 동시에 실행되면 바이너리 교체와 install.json 기록 사이에 다른 설치가 끼어들 수 있습니다. 두 설치가 모두 성공했다고 출력하면서 최종 바이너리와 영수증이 서로 다른 버전을 기록하는 것을 재현했습니다.

  • 검토 기준: main@4e87765f95c106edb3c956cfad2abc1db64c0c39
  • 판정: Unix install.sh mismatch CONFIRMED
  • 우선순위: P2

영향

업그레이드, 진단, 제거 또는 이후 자동화가 잘못된 version, asset, checksum 정보를 사용할 수 있습니다.

발생 조건 및 확인 범위

  • 동일 HOME, 설치 디렉터리와 receipt 경로를 사용할 것
  • 서로 다른 버전 설치가 시간상 겹칠 것
  • 배치·검증·영수증 이동 사이에 특정 interleaving이 발생할 것

macOS fixture에서 최종 binary 2.0.0, receipt 1.0.0을 확인했습니다. 실제 dpt version은 빨라 일반 경쟁 창은 fixture보다 좁습니다. rollback이 다른 설치를 삭제하는 경우와 install.ps1의 동일 문제는 코드상 가능하지만 직접 재현하지 않았습니다.

재현 및 검증 방법

  1. 올바른 checksum을 가진 1.0.0/2.0.0 로컬 release fixture를 준비합니다.
  2. v1 설치 후 version 검증을 지연하고, v2 download validation을 다르게 지연해 interleaving을 만듭니다.
  3. 동일 $HOMEDPT_INSTALL_DIR로 두 install.sh를 병렬 실행합니다.
  4. 두 exit code와 성공 메시지를 확인합니다.
  5. 최종 dpt versioninstall.json.version, asset, sha256의 일치를 검사합니다.

확인된 결과는 두 installer exit 0, binary 2.0.0, receipt 1.0.0입니다.

기대 동작

동일 설치 대상은 프로세스 간 잠금으로 직렬화되어야 하며 바이너리 교체, 최종 버전 검증, receipt 반영과 rollback이 하나의 트랜잭션으로 일관성을 유지해야 합니다.

완료 조건

  • 정규화된 target/receipt를 기준으로 프로세스 간 잠금을 적용한다.
  • 설치 후 바이너리 출력이 요청 버전과 정확히 일치하는지 검증한다.
  • 실패 프로세스가 다른 설치의 target/backup을 삭제하지 않는다.
  • 동시 설치 테스트에서 binary와 receipt가 항상 일치한다.
  • install.ps1에도 동등한 보호와 테스트를 적용한다.
  • installer 테스트와 전체 품질 검증이 통과한다.

관련 코드

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions