DVA v0.3.0
v0.3.0은 plan 선언의 재사용 범위와 native 실행의 안전한 경계를 넓히고, 실행 전 입력과
종료 상태를 더 엄격하게 확인합니다.
선언과 계획
- **plan
alias와 단일 부모extends**를 지원합니다. alias는 대상 plan만 가리켜야 하며
description외의 필드와 함께 쓸 수 없습니다. alias 체인은 최대 10단계까지 허용하며, 순환·자기참조·미정의 참조와 깊이 초과는 거부됩니다.
extends는 단일 부모와 최대 3단계만 허용하고,composes:plan에는 적용할 수 없습니다.
자식은 scalar를 덮고vars는 키별로 합치며, 같은 이름의entries는 서비스 합집합이 아니라
자식 선언으로 교체합니다. - stack 엔트리에 **
optional·primary**를, native runner에 **post_build**를 추가했습니다.
optional은 선언한 디렉터리가 없을 때 해당 엔트리만 plan에서 빼고, 다른 런타임 실패를 숨기지
않습니다. primary는 대표 엔트리를 명시하며, post_build는 build 성공 뒤 같은 dir/env에서
실행되고 실패하면 build도 실패합니다. - interaction hook의
plans:필터가 지정한 plan에서만 hook을 실행합니다. 필터가 없으면 기존처럼
모든 plan에 적용됩니다. drift_ignore와suggestions: {makefile, package_json}로 자동 탐지·제안 억제를 선언할 수
있습니다. 선언됐지만 없는 파일이나 서비스를 참조하는 interaction은 억제 대상이 아닙니다.interaction.destructive: true는 하위 명령에 상속되며,dva agent-deny install --scope project가
해당 interaction의 deny 패턴을 투영합니다. 하위 명령은destructive: false로 해제할 수
있습니다.
실행 안전성
- composition plan의 native readiness 대기는 health check의 가장 큰
ready_timeout(미지정 시
30초)으로 제한됩니다. native 프로세스가 시작 직후 끝나면 PID와 log 경로를 포함해 빠르게
실패하며, 무한 대기하지 않습니다. - required
env_file입력이 없거나 잘못됐을 때dva run은 실행·--dry-run미리보기·파괴적
명령 확인보다 먼저 실패합니다. import/direct-child route도 명령 소유자의 입력만 판정합니다. - native process의
stop/down은 SIGTERM 뒤 최대 5초 동안 종료를 기다립니다. 취소·시간 초과
또는 종료 실패에는 PID/log 파일을 남겨 살아 있는 프로세스를 새 실행이 덮어쓰지 않게 합니다. - config module/override 병합은 typed runner 설정을 필드 단위로 deep merge하여 native 환경과
runner별 설정을 보존합니다.
CI profile 의존성
CI profile은 이미 ci.profiles.<name>.steps 배열로 선언합니다. depends_on은 profile이나
ci 아래가 아니라 각 step 항목에 둡니다.
ci:
profiles:
commit:
steps:
- name: test
run: go test ./...
- name: lint
run: go vet ./...
depends_on: [test]이 구조에서 lint는 test가 성공한 뒤 실행됩니다. step 이름은 같은 profile 안에서 유일해야
하며 의존 대상도 그 profile의 step이어야 합니다.
확인할 점
alias/extends, optional native entry, destructive interaction을 쓰는 config는 먼저
dva config validate로 확인하세요.- process 종료가 timeout으로 실패하면 PID/log를 지우거나 새
up을 시도하기 전에 해당 프로세스의
실제 상태를 확인하세요. - 기존 CI profile 문법은 이 릴리스에서 새로 도입된 것이 아닙니다. 의존성을 추가할 때에는 위처럼
step 아래에 배치하세요.