From 00dc8bd0fa25dc8a30ccf04187b0922bd108f351 Mon Sep 17 00:00:00 2001 From: Sin-Kang Date: Sun, 14 Jun 2026 01:21:59 +0900 Subject: [PATCH] dist: make jbang the primary install path + auto-publish on tag Point the jbang catalog alias at releases/latest/download/datalinq.jar (a stable, unversioned asset name), so 'jbang app install datalinq@devslab-kr/datalinq' gives a real 'datalinq' command that jbang keeps current - no per-release catalog edits. Add a Release workflow that builds the fat jar and attaches it on every v* tag, so pushing a tag auto-publishes the jbang-installable jar. Lead the README (en + ko) with jbang; keep 'java -jar' as the no-jbang path. --- .github/workflows/release.yml | 33 ++++++++++++++++++++++++++++ README.ko.md | 40 +++++++++++++++++++++++----------- README.md | 41 ++++++++++++++++++++++++----------- jbang-catalog.json | 2 +- 4 files changed, 89 insertions(+), 27 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..5bb766e --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,33 @@ +name: Release + +on: + push: + tags: [ 'v*' ] + +permissions: + contents: write + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: '21' + cache: gradle + + - name: Build the fat jar + run: ./gradlew shadowJar --no-daemon + + # shadowJar produces an unversioned `datalinq.jar`, so the asset name is stable and + # releases/latest/download/datalinq.jar always resolves - that is exactly what the jbang + # catalog points at. Pushing a `v*` tag therefore auto-publishes the jbang-installable jar. + - name: Publish the release with the fat jar + uses: softprops/action-gh-release@v2 + with: + files: build/libs/datalinq.jar + generate_release_notes: true diff --git a/README.ko.md b/README.ko.md index 953e01d..6919847 100644 --- a/README.ko.md +++ b/README.ko.md @@ -121,24 +121,38 @@ options: - `destructive=true` 작업은 실행 전 명시적 확인을 요구합니다. - 각 작업은 **하나의 타겟 트랜잭션** 안에서 실행: 성공 시 커밋, 오류 시 롤백. -## 실행 +## 설치 & 실행 -기본 명령은 **TUI** 이고, 모든 기능은 CLI로도 스크립트화할 수 있습니다. +기본 명령은 **TUI** 이고, 모든 하위 명령은 스크립트화할 수 있습니다. + +### jbang으로 (권장) + +[jbang](https://www.jbang.dev/) 은 DataLinq를 실제 `datalinq` 명령으로 설치해 주고, JDK가 없으면 +알맞은 JDK까지 받아 줍니다: + +```bash +jbang app install datalinq@devslab-kr/datalinq # 한 번만 - `datalinq` 명령 생성 +datalinq # TUI 실행 (마이그레이션 / DB 연결 / 설정 / 정보) +datalinq init # 편집용 기본값 생성 (i18n/, branding/, 예시 설정, sql/) +datalinq list # 발견된 작업 목록 +datalinq run 0 # 0번 작업 dry-run +datalinq run 0 --execute # 실제 쓰기 +``` + +설치 없이 한 번만 실행하려면: `jbang datalinq@devslab-kr/datalinq`. + +### jar로 (jbang 없이) + +[최신 릴리스](https://github.com/devslab-kr/datalinq/releases/latest)에서 `datalinq.jar` 를 받아 +직접 실행합니다(**JDK 21+** 필요). `java -jar datalinq.jar <명령>` 은 `datalinq <명령>` 과 동일합니다: ```bash -./gradlew shadowJar # 자기완결형 jar 빌드 -java -jar build/libs/datalinq.jar # TUI 메뉴 (마이그레이션 / DB 연결 / 설정 / 정보) - -# 또는 CLI로: -java -jar build/libs/datalinq.jar init # 편집용 기본값 생성 (i18n/, branding/, 예시 설정, sql/) -java -jar build/libs/datalinq.jar list # 발견된 작업 목록 -java -jar build/libs/datalinq.jar config # 해석된 설정 표시(비밀번호 마스킹) -java -jar build/libs/datalinq.jar run 0 # 0번 작업 dry-run -java -jar build/libs/datalinq.jar run 0 --execute # 실제 쓰기 +java -jar datalinq.jar # TUI +java -jar datalinq.jar config # 해석된 설정 표시(비밀번호 마스킹) +java -jar datalinq.jar run 0 --execute ``` -jar는 단일 드롭형 산출물입니다(Shadow fat-jar, `jbang-catalog.json` 에 [jbang](https://www.jbang.dev/) -별칭 포함). 개발 중에는 `./gradlew run --args="..."` 도 동작합니다. +개발 중에는 `./gradlew run --args="..."` 도 동작하며, `./gradlew shadowJar` 로 jar을 빌드합니다. ## 상태 diff --git a/README.md b/README.md index 4d5acdd..c5da2f9 100644 --- a/README.md +++ b/README.md @@ -121,24 +121,39 @@ also be edited from inside the app (DB Connection screen) and saved. - `destructive=true` operations require an explicit confirmation before running. - Each operation runs in **one target transaction**: commit on success, rollback on any error. -## Run +## Install & run -The default command is the **TUI**; everything is also scriptable from the CLI. +The default command is the **TUI**; every subcommand is also scriptable. + +### With jbang (recommended) + +[jbang](https://www.jbang.dev/) installs DataLinq as a real `datalinq` command and will even +provision a JDK for you if none is present: + +```bash +jbang app install datalinq@devslab-kr/datalinq # once - creates the `datalinq` command +datalinq # launch the TUI (Migrations / DB Connection / Settings / About) +datalinq init # write editable defaults (i18n/, branding/, example config, sql/) +datalinq list # list discovered operations +datalinq run 0 # dry-run operation #0 +datalinq run 0 --execute # actually write +``` + +Or run it once without installing: `jbang datalinq@devslab-kr/datalinq`. + +### With the jar (no jbang) + +Download `datalinq.jar` from the [latest release](https://github.com/devslab-kr/datalinq/releases/latest) +(needs **JDK 21+**) and run it directly - `java -jar datalinq.jar ` is equivalent to +`datalinq `: ```bash -./gradlew shadowJar # build the self-contained jar -java -jar build/libs/datalinq.jar # TUI menu (Migrations / DB Connection / Settings / About) - -# or via the CLI: -java -jar build/libs/datalinq.jar init # write editable defaults (i18n/, branding/, example config, sql/) -java -jar build/libs/datalinq.jar list # list discovered operations -java -jar build/libs/datalinq.jar config # show resolved config (passwords masked) -java -jar build/libs/datalinq.jar run 0 # dry-run operation #0 -java -jar build/libs/datalinq.jar run 0 --execute # actually write +java -jar datalinq.jar # TUI +java -jar datalinq.jar config # show resolved config (passwords masked) +java -jar datalinq.jar run 0 --execute ``` -The jar is a single droppable artifact (Shadow fat-jar, with a [jbang](https://www.jbang.dev/) -alias in `jbang-catalog.json`). During development `./gradlew run --args="..."` works too. +During development `./gradlew run --args="..."` works too; `./gradlew shadowJar` builds the jar. ## Status diff --git a/jbang-catalog.json b/jbang-catalog.json index e800327..b81ec3a 100644 --- a/jbang-catalog.json +++ b/jbang-catalog.json @@ -1,7 +1,7 @@ { "aliases": { "datalinq": { - "script-ref": "build/libs/datalinq.jar", + "script-ref": "https://github.com/devslab-kr/datalinq/releases/latest/download/datalinq.jar", "description": "DataLinq - cross-vendor JDBC data-migration TUI (DevsLab Co., Ltd.)", "java-options": [ "-Dstdout.encoding=UTF-8",