Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
root = true

# 기본은 LF
# 기본?� LF
[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8

# Windows 전용 스크립트는 CRLF를 원하면(선택 사항):
# Windows ?�용 ?�크립트??CRLF�??�하�??�택 ?�항):
[*.bat]
end_of_line = crlf
[*.ps1]
end_of_line = crlf

# Bash/셸 스크립트는 반드시 LF
# Bash/???�크립트??반드??LF
[*.sh]
end_of_line = lf
9 changes: 8 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
@@ -1,2 +1,9 @@
# Auto detect text files and perform LF normalization
* text=auto
* text=auto eol=lf

# Windows-specific scripts: CRLF
*.bat text eol=crlf
*.ps1 text eol=crlf

# Shell scripts: LF
*.sh text eol=lf
54 changes: 27 additions & 27 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -1,39 +1,39 @@
<!-- ablestack-qemu-exec-tools: Copilot 지침 (한국어) -->
# 코드 어시스턴트를 위한 빠른 안내 (20–50줄)
<!-- ablestack-qemu-exec-tools: Copilot 지시서(한국어) -->
# 코드 시나리오에 대한 빠른 이해 (2025년 0월)

이 저장소는 QEMU/libvirt VM 내부에서 qemu-guest-agent를 통해 명령을 실행하는 소형 셸 유틸리티들과 RPM/DEB/MSI 패키징을 제공합니다. AI 코딩 에이전트가 즉시 생산적으로 작업할 수 있도록 발견 가능한 핵심 정보를 간결하게 정리했습니다.
이 저장소는 QEMU/libvirt VM 환경에서 qemu-guest-agent를 통해 명령을 실행하는 형편성 유틸리티와 RPM/DEB/MSI 패키징을 제공합니다. AI 코딩 어시스턴트가 즉시 산출물을 만들 수 있도록 프로젝트의 주요 구조와 발견 가능한 핵심 정보를 간결하게 정리합니다.

- 개요
- 주요 스크립트: `bin/vm_exec.sh`, `bin/agent_policy_fix.sh`, `bin/cloud_init_auto.sh` 공통 로직은 `lib/`(특히 `common.sh`, `cloud_init_common.sh`, 파서들)에 위치합니다.
- 빌드/패키지: `Makefile`에서 `rpm`, `deb`, `windows` 타깃을 실행합니다. 릴리스와 빌드는 GitHub Actions(`.github/workflows/`)로 자동화되어 있습니다.
- 주요 스크립트: `bin/vm_exec.sh`, `bin/agent_policy_fix.sh`, `bin/cloud_init_auto.sh` 공통 로직은 `lib/`(특히 `common.sh`, `cloud_init_common.sh`, 서버측 설치)
- 빌드/패키지: `Makefile`에서 `rpm`, `deb`, `windows` 타깃을 실행합니다. 릴리즈 시 빌드는 GitHub Actions(`.github/workflows/`)에서 자동화됩니다.

- 주요 개발/운영 흐름
- 로컬 설치: `chmod +x install.sh ; sudo ./install.sh` (자세한 내용은 `INSTALL.md`).
- 주요 개발/운영 워크플로우
- 로컬 설치: `chmod +x install.sh ; sudo ./install.sh` (자세한 사용은 `INSTALL.md`).
- 패키지 빌드: `make rpm`, `make deb`, `make windows` (Windows는 `powershell` 호출 포함).
- 도구 실행 예: `vm_exec -l|-w|-d <vm-name> <command> [options]` (`bin/vm_exec.sh`, `docs/usage_vm_exec.md` 참고).
- 구동 실행 예: `vm_exec -l|-w|-d <vm-name> <command> [options]` (`bin/vm_exec.sh`, `docs/usage_vm_exec.md` 참고).

- 코드/런타임 규약 (구체적)
- 스크립트는 POSIX/Bash 스타일로 작성되어 있습니다. 설치 시 `lib/*` `/usr/local/lib/ablestack-qemu-exec-tools`로 복사되고 실행 시 해당 경로에서 `source` 합니다 (Makefile 참조).
- `virsh qemu-agent-command` 호출 결과를 `jq` 파싱하는 패턴이 많습니다 (`bin/vm_exec.sh`). `jq` 의존성을 염두에 두세요.
- 표/CSV 출력 정규화 파서는 `lib/parse_linux_table.sh`, `lib/parse_windows_table.sh`, `lib/parse_csv.sh` 입니다. 출력 파싱이 필요하면 이들 재사용을 우선시하세요.
- 지역화: `lib/cloud_init_common.sh` 로케일을 감지해 한국어/영어 메시지를 출력합니다. 사용자 출력 추가 시 `_IS_KO` 플래그를 존중하세요.
- 코드/작성 규약 (구체적)
- 모든 스크립트는 POSIX/Bash 스크립트로 작성되어 있습니다. 설치 시 `lib/*` `/usr/local/lib/ablestack-qemu-exec-tools`에 복사하고 실행 시 해당 경로에서 `source` 합니다(Makefile 참조).
- `virsh qemu-agent-command` 호출 결과에 `jq` 파싱하는 패턴이 많습니다 (`bin/vm_exec.sh`). `jq` 존재를 확인하세요.
- CSV 출력 규칙에서는 `lib/parse_linux_table.sh`, `lib/parse_windows_table.sh`, `lib/parse_csv.sh` 등이 있으며 출력 파싱이 필요하면 이들 라이브러리를 우선 사용하세요.
- 지역화: `lib/cloud_init_common.sh`에서 로케일을 감지하여 한국어 메시지를 출력합니다. 사용자 출력 추출 시 `_IS_KO` 플래그를 존중하세요.

- 검증(실무) 팁
- 저장소에 자동 단위 테스트는 없습니다. 스크립트 문법 검사는 `bash -n <file>` 로 수행하세요. 수정 후에는 가능한 경우 테스트 VM에서 `vm_exec`로 스모크 실행 권장.
- 패키징 관련 변경은 `make deb` / `make rpm` / `make windows`로 빌드 확인을 수행하세요.
- 검증 및 품질
- 프로젝트의 자동화 수준은 높습니다. 스크립트 문법 검증은 `bash -n <file>` 으로 실행하세요. 특정 에러가 있는 경우 테스트 VM에서 `vm_exec`를 시뮬레이션 실행 권장.
- 패키지 관련 변경 시 `make deb` / `make rpm` / `make windows`로 빌드 검증하세요.

- 버전/릴리스 관련
- 버전 정보는 `VERSION` 파일에서 읽습니다. 버전을 갱신하고 태그(`git tag vX.Y.Z`)를 푸시하면 빌드/릴리스 워크플로우가 동작합니다.
- Windows MSI 빌드는 `windows/msi/` 내부 스크립트(`build-msi.ps1`)를 사용합니다.
- 버전/릴리즈 관리
- 버전 정보는 `VERSION` 파일에서 관리합니다. 버전을 갱신하고 태그(`git tag vX.Y.Z`)를 생성 시 빌드/릴리즈 워크플로우가 자동으로 작동합니다.
- Windows MSI 빌드는 `windows/msi/` 스크립트(`build-msi.ps1`)를 사용합니다.

- 통합 포인트 및 주의사항
- 외부 바이너리(예: `virsh`, `jq`, `dpkg-deb`, `rpmbuild`, `powershell`) 강하게 의존합니다. 절대 경로 하드코딩을 피하고 명령어 이름을 그대로 사용하세요.
- 개발 중에는 `LIBDIR` 변수를 임시로 조정하거나 저장소 루트에서 실행하여 `/usr/local` 설치를 대신할 수 있습니다.
- 통합 및 주의사항
- 필수 바이너리(예: `virsh`, `jq`, `dpkg-deb`, `rpmbuild`, `powershell`) 강하게 존재하니 필요 경로 하드코딩 없이 명령어 이름을 그대로 사용하세요.
- 개발 중에는 `LIBDIR` 변수를 임시 조정하거나 저장소 루트에서 실행하여 `/usr/local` 설치와 유사한 환경을 만들 수 있습니다.

- 참고 파일 (변경 시 우선 확인)
- `bin/vm_exec.sh` — 핵심 명령 동작과 옵션
- `lib/common.sh`, `lib/cloud_init_common.sh` 공용 유틸리티와 cloud-init 관련 로직
- `docs/usage_vm_exec.md`, `docs/usage_agent_policy_fix.md` — 사용자 예제 및 사용법
- `Makefile`, `rpm/ablestack-qemu-exec-tools.spec`, `deb/control`, `windows/msi/*` — 패키징 관련 스크립트/템플릿
- `bin/vm_exec.sh` 주요 명령 작업 설명
- `lib/common.sh`, `lib/cloud_init_common.sh` 공용 유틸리티 및 cloud-init 관련 로직
- `docs/usage_vm_exec.md`, `docs/usage_agent_policy_fix.md` 사용법 세부 내용
- `Makefile`, `rpm/ablestack-qemu-exec-tools.spec`, `deb/control`, `windows/msi/*` 패키지 관련 스크립트/템플릿

추가로 한국어 예제나 로컬 개발 절차(예: Windows에서 MSI 빌드 상세 단계 등)를 넣고 싶으면 어느 부분을 확장할지 알려주세요. 제가 바로 반영하겠습니다.
추가 한국어 제안이나 로컬 개발 차원(예: Windows에서 MSI 빌드 시 계정 문제 등)에서 느끼는 부분을 알려주세요. 바로 반영하겠습니다.
6 changes: 3 additions & 3 deletions .github/workflows/build-winpe-core.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ jobs:
WORKDIR: C:\winpe_work
OUTDIR: C:\out

# Microsoft Learn(ADK/WinPE Add-on)에서 안내되는 fwlink를 사용.
# 향후 linkid 변경 가능성이 있으니, 실패 시 이 2개 URL만 갱신하면 됩니다.
# Microsoft Learn(ADK/WinPE Add-on)에서 제공하는 fwlink를 사용.
# 추후 linkid 변경 가능성이 있으므로 실패 시 URL을 갱신하면 됩니다.
ADK_SETUP_URL: "https://go.microsoft.com/fwlink/?linkid=2289980"
WINPE_ADDON_URL: "https://go.microsoft.com/fwlink/?linkid=2289981"

Expand Down Expand Up @@ -341,4 +341,4 @@ jobs:
path: |
C:\out\*.iso
C:\out\SHA256SUMS
retention-days: ${{ inputs.retention_days }}
retention-days: ${{ inputs.retention_days }}
8 changes: 4 additions & 4 deletions .github/workflows/build-winpe-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,12 @@ jobs:
- name: Attach assets to GitHub Release
uses: softprops/action-gh-release@v2
with:
# 어떤 태그 릴리즈에 붙일지 명시 (tag push 이벤트 기준)
# 어떤 태그 릴리즈에 붙일지 명시 (tag push 이벤트 기반)
tag_name: ${{ github.ref_name }}
# 릴리즈 본문/노트는 build.yml이 통합 생성(권장) → 여기서는 건드리지 않음
# 릴리즈 본문/노트는 build.yml에서 통합 생성(권장) 이므로 건드리지 않음
generate_release_notes: false
files: |
dist/*.iso
dist/SHA256SUMS
# 산출물 누락 시 조기 실패(릴리즈 누락 방지)
fail_on_unmatched_files: true
# 파일 매칭 실패 시 조기 실패(릴리즈 실패 방지)
fail_on_unmatched_files: true
Loading