diff --git a/.github/workflows/release-tamagotchi.yml b/.github/workflows/release-tamagotchi.yml index 4ae388be4..67aa62143 100644 --- a/.github/workflows/release-tamagotchi.yml +++ b/.github/workflows/release-tamagotchi.yml @@ -169,11 +169,19 @@ jobs: - name: Rename Artifacts (Nightly) if: ${{ github.event_name == 'schedule' }} - run: pnpm run -F @proj-airi/stage-tamagotchi rename-artifacts ${{ matrix.target }} + id: rename_artifacts_nightly + run: | + pnpm -F @proj-airi/stage-tamagotchi name-of-artifacts ${{ matrix.target }} --out bundle_name + echo "bundle_name=$(node -p "require('node:fs').readFileSync(require('node:path').join('apps', 'stage-tamagotchi', 'bundle_name')).toString('utf-8')")" > $GITHUB_ENV + pnpm run -F @proj-airi/stage-tamagotchi rename-artifacts ${{ matrix.target }} - name: Rename Artifacts (Manual) if: ${{ github.event_name == 'workflow_dispatch' }} - run: pnpm run -F @proj-airi/stage-tamagotchi rename-artifacts ${{ matrix.target }} --release --tag ${{ github.event.inputs.tag }} --auto-tag + id: rename_artifacts_manual + run: + pnpm -F @proj-airi/stage-tamagotchi name-of-artifacts ${{ matrix.target }} --out bundle_name + echo "bundle_name=$(node -p "require('node:fs').readFileSync(require('node:path').join('apps', 'stage-tamagotchi', 'bundle_name')).toString('utf-8')")" > $GITHUB_ENV + pnpm run -F @proj-airi/stage-tamagotchi rename-artifacts ${{ matrix.target }} --release --tag ${{ github.event.inputs.tag }} --auto-tag - name: Rename Artifacts (Automatic) if: ${{ github.event_name == 'release' }} @@ -183,17 +191,15 @@ jobs: if: ${{ github.event_name == 'schedule' }} uses: actions/upload-artifact@v4 with: - name: Artifacts + name: ${{ steps.rename_artifacts_nightly.outputs.bundle_name }} path: bundle/${{ env.PRODUCT_NAME }}_* - overwrite: true - name: Upload Artifacts (Manual + Non-Release) if: ${{ github.event_name == 'workflow_dispatch' && !github.event.inputs.build_only && github.event.inputs.artifacts_only }} uses: actions/upload-artifact@v4 with: - name: Artifacts + name: ${{ steps.rename_artifacts_manual.outputs.bundle_name }} path: bundle/${{ env.PRODUCT_NAME }}_* - overwrite: true - name: Upload To GitHub Releases (Manual + Release) if: ${{ github.event_name == 'workflow_dispatch' && !github.event.inputs.build_only && !github.event.inputs.artifacts_only }} diff --git a/apps/stage-tamagotchi/bundle_name b/apps/stage-tamagotchi/bundle_name new file mode 100644 index 000000000..c083f26fe --- /dev/null +++ b/apps/stage-tamagotchi/bundle_name @@ -0,0 +1 @@ +AIRI_nightly-20250719-76e5463_macos_arm64.dmg \ No newline at end of file diff --git a/apps/stage-tamagotchi/package.json b/apps/stage-tamagotchi/package.json index 0333942c4..09b59d1af 100644 --- a/apps/stage-tamagotchi/package.json +++ b/apps/stage-tamagotchi/package.json @@ -14,7 +14,8 @@ "preview": "vite preview", "tauri": "tauri", "build:unpack": "tauri build --no-bundle", - "rename-artifacts": "tsx scripts/rename-artifacts.ts" + "rename-artifacts": "tsx scripts/rename-artifacts.ts", + "name-of-artifacts": "tsx scripts/name-of-artifacts.ts" }, "dependencies": { "@formkit/auto-animate": "^0.8.2", diff --git a/apps/stage-tamagotchi/scripts/name-of-artifacts.ts b/apps/stage-tamagotchi/scripts/name-of-artifacts.ts new file mode 100644 index 000000000..be6b0a657 --- /dev/null +++ b/apps/stage-tamagotchi/scripts/name-of-artifacts.ts @@ -0,0 +1,60 @@ +import process from 'node:process' + +import { existsSync, mkdirSync, writeFileSync } from 'node:fs' +import { dirname } from 'node:path' + +import { cac } from 'cac' + +import { getFilename } from './utils' + +async function main() { + const cli = cac('name-of-artifact') + .option( + '--release', + 'Rename with version from package.json', + { default: false }, + ) + .option( + '--auto-tag', + 'Automatically tag the release with the latest git ref', + { default: false }, + ) + .option( + '--tag ', + 'Tag to use for the release', + { default: '', type: [String] }, + ) + .option( + '--out ', + 'Path to output the filename', + { default: '', type: [String] }, + ) + + const args = cli.parse() + + const argOptions = args.options as { + release: boolean + autoTag: boolean + tag: string[] + out: string[] + } + + const target = args.args[0] + const filename = await getFilename(target, argOptions) + if (argOptions.out[0]) { + if (!existsSync(dirname(argOptions.out[0]))) { + mkdirSync(dirname(argOptions.out[0]), { recursive: true }) + } + + writeFileSync(argOptions.out[0], filename, { encoding: 'utf-8' }) + } + else { + console.log(filename) + } +} + +main() + .catch((error) => { + console.error('Error during generating name:', error) + process.exit(1) + }) diff --git a/apps/stage-tamagotchi/scripts/rename-artifacts.ts b/apps/stage-tamagotchi/scripts/rename-artifacts.ts index c79d4a8e9..b6ea9815d 100644 --- a/apps/stage-tamagotchi/scripts/rename-artifacts.ts +++ b/apps/stage-tamagotchi/scripts/rename-artifacts.ts @@ -4,122 +4,105 @@ import { mkdirSync, readdirSync, renameSync } from 'node:fs' import { join } from 'node:path' import { cac } from 'cac' -import { execa } from 'execa' import packageJSON from '../package.json' assert { type: 'json' } import tauriConfigJSON from '../src-tauri/tauri.conf.json' assert { type: 'json' } -const cli = cac('rename-artifact') - .option( - '--release', - 'Rename with version from package.json', - { default: false }, - ) - .option( - '--auto-tag', - 'Automatically tag the release with the latest git ref', - { default: false }, - ) - .option( - '--tag ', - 'Tag to use for the release', - { default: '', type: [String] }, - ) +import { getFilename, getVersion } from './utils' -const args = cli.parse() +async function main() { + const cli = cac('rename-artifact') + .option( + '--release', + 'Rename with version from package.json', + { default: false }, + ) + .option( + '--auto-tag', + 'Automatically tag the release with the latest git ref', + { default: false }, + ) + .option( + '--tag ', + 'Tag to use for the release', + { default: '', type: [String] }, + ) -let version = packageJSON.version -const target = args.args[0] -const productName = tauriConfigJSON.productName -const dirname = import.meta.dirname + const args = cli.parse() -const beforeVersion = version -const beforeProductName = productName + let version = packageJSON.version + const target = args.args[0] + const productName = tauriConfigJSON.productName + const dirname = import.meta.dirname -const argOptions = args.options as { - release: boolean - autoTag: boolean - tag: string[] -} + const beforeVersion = version + const beforeProductName = productName -if (argOptions.release) { - // If --release is specified, use the version from package.json - version = packageJSON.version - - if (argOptions.tag) { - if (argOptions.tag[0] !== 'true') { - // If --tag is specified, use the provided tag - version = String(argOptions.tag[0]).replace(/^v/, '').trim() - } - else { - version = '' - } - - if (!version) { - if (argOptions.autoTag) { - // If --auto-tag is specified, fetch the latest git ref - const res = await execa('git', ['describe', '--tags', '--abbrev=0']) - version = String(res.stdout).replace(/^v/, '').trim() - } - else { - throw new Error('Tag cannot be empty when --release is specified') - } - } + const argOptions = args.options as { + release: boolean + autoTag: boolean + tag: string[] } -} -else { - // Otherwise, fetch from the latest git ref - const res = await execa('git', ['log', '-1', '--pretty=format:"%H"']) - const date = new Date().toISOString().split('T')[0].replace(/-/g, '') - version = `nightly-${date}-${String(res.stdout.replace(/"/g, '')).trim().substring(0, 7)}` + + version = await getVersion(argOptions) + + console.log('target:', target) + console.log('dirname', dirname) + console.log('version from:', beforeVersion, 'to:', version) + console.log('product name from:', beforeProductName, 'to:', productName) + + if (!target) { + throw new Error(' is required') + } + + const srcPrefix = join(dirname, '..', '..', '..', 'target', target, 'release', 'bundle') + const bundlePrefix = join(dirname, '..', '..', '..', 'bundle') + + console.log('renaming directory from:', srcPrefix) + console.log('renaming directory to:', bundlePrefix) + console.log(readdirSync(srcPrefix)) + + mkdirSync(bundlePrefix, { recursive: true }) + + let renameFrom = '' + let renameTo = '' + const filename = await getFilename(target, argOptions) + + switch (target) { + case 'x86_64-pc-windows-msvc': + renameFrom = join(srcPrefix, 'nsis', `${beforeProductName}_${beforeVersion}_x64-setup.exe`) + renameTo = join(bundlePrefix, filename) + break + case 'x86_64-unknown-linux-gnu': + renameFrom = join(srcPrefix, 'appimage', `${beforeProductName}_${beforeVersion}_amd64.AppImage`) + renameTo = join(bundlePrefix, filename) + break + case 'aarch64-unknown-linux-gnu': + renameFrom = join(srcPrefix, 'appimage', `${beforeProductName}_${beforeVersion}_aarch64.AppImage`) + renameTo = join(bundlePrefix, filename) + break + case 'aarch64-apple-darwin': + renameFrom = join(srcPrefix, 'dmg', `${beforeProductName}_${beforeVersion}_aarch64.dmg`) + renameTo = join(bundlePrefix, filename) + break + case 'x86_64-apple-darwin': + renameFrom = join(srcPrefix, 'dmg', `${beforeProductName}_${beforeVersion}_x64.dmg`) + renameTo = join(bundlePrefix, filename) + break + default: + console.error('Target is not supported') + process.exit(1) + } + + console.log('renaming, from:', renameFrom, 'to:', renameTo) + renameSync(renameFrom, renameTo) } -console.log('version:', beforeVersion, version) -console.log('target:', target) -console.log('productName:', beforeProductName, productName) -console.log('dirname:', dirname) - -if (!target) { - throw new Error(' is required') -} - -const srcPrefix = join(dirname, '..', '..', '..', 'target', target, 'release', 'bundle') -const bundlePrefix = join(dirname, '..', '..', '..', 'bundle') - -console.log('srcPrefix:', srcPrefix) -console.log('bundlePrefix:', bundlePrefix) -console.log(readdirSync(srcPrefix)) - -mkdirSync(bundlePrefix, { recursive: true }) - -let renameFrom = '' -let renameTo = '' - -switch (target) { - case 'x86_64-pc-windows-msvc': - renameFrom = join(srcPrefix, 'nsis', `${beforeProductName}_${beforeVersion}_x64-setup.exe`) - renameTo = join(bundlePrefix, `${productName}_${version}_windows_amd64-setup.exe`) - break - case 'x86_64-unknown-linux-gnu': - renameFrom = join(srcPrefix, 'appimage', `${beforeProductName}_${beforeVersion}_amd64.AppImage`) - renameTo = join(bundlePrefix, `${productName}_${version}_linux_amd64.AppImage`) - break - case 'aarch64-unknown-linux-gnu': - renameFrom = join(srcPrefix, 'appimage', `${beforeProductName}_${beforeVersion}_aarch64.AppImage`) - renameTo = join(bundlePrefix, `${productName}_${version}_linux_arm64.AppImage`) - break - case 'aarch64-apple-darwin': - renameFrom = join(srcPrefix, 'dmg', `${beforeProductName}_${beforeVersion}_aarch64.dmg`) - renameTo = join(bundlePrefix, `${productName}_${version}_macos_arm64.dmg`) - break - case 'x86_64-apple-darwin': - renameFrom = join(srcPrefix, 'dmg', `${beforeProductName}_${beforeVersion}_x64.dmg`) - renameTo = join(bundlePrefix, `${productName}_${version}_macos_amd64.dmg`) - break - default: - console.error('Target is not supported') +main() + .then(() => { + console.log('Renaming completed successfully.') + }) + .catch((error) => { + console.error('Error during renaming:', error) process.exit(1) -} - -console.log('renaming, from:', renameFrom, 'to:', renameTo) -renameSync(renameFrom, renameTo) + }) diff --git a/apps/stage-tamagotchi/scripts/utils.ts b/apps/stage-tamagotchi/scripts/utils.ts new file mode 100644 index 000000000..5a694837e --- /dev/null +++ b/apps/stage-tamagotchi/scripts/utils.ts @@ -0,0 +1,70 @@ +import process from 'node:process' + +import { execa } from 'execa' + +import packageJSON from '../package.json' assert { type: 'json' } +import tauriConfigJSON from '../src-tauri/tauri.conf.json' assert { type: 'json' } + +export async function getVersion(options: { release: boolean, autoTag: boolean, tag: string[] }) { + if (!options.release || !options.tag) { + // Otherwise, fetch from the latest git ref + const res = await execa('git', ['log', '-1', '--pretty=format:"%H"']) + const date = new Date().toISOString().split('T')[0].replace(/-/g, '') + return `nightly-${date}-${String(res.stdout.replace(/"/g, '')).trim().substring(0, 7)}` + } + + // If --release is specified, use the version from package.json + let version = packageJSON.version + + // If --tag is specified, use the provided tag + if (options.tag[0] !== 'true') { + version = String(options.tag[0]).replace(/^v/, '').trim() + } + // Otherwise, even for --tag option (true / enabled), ignore the input + else { + version = '' + } + + if (version) { + return version + } + + // If no version is provided and --auto-tag is not specified, throw an error + if (!options.autoTag) { + throw new Error('Tag cannot be empty when --release is specified') + } + + // Now, only auto-tag & release && non-specific tag is the only possibility, + // fetch the latest git ref + const res = await execa('git', ['describe', '--tags', '--abbrev=0']) + return String(res.stdout).replace(/^v/, '').trim() +} + +export async function getFilename(target: string, options: { release: boolean, autoTag: boolean, tag: string[] }) { + const productName = tauriConfigJSON.productName + const version = await getVersion(options) + + if (!target) { + throw new Error(' is required') + } + + switch (target) { + case 'x86_64-pc-windows-msvc': + return `${productName}_${version}_windows_amd64-setup.exe` + break + case 'x86_64-unknown-linux-gnu': + return `${productName}_${version}_linux_amd64.AppImage` + break + case 'aarch64-unknown-linux-gnu': + return `${productName}_${version}_linux_arm64.AppImage` + break + case 'aarch64-apple-darwin': + return `${productName}_${version}_macos_arm64.dmg` + break + case 'x86_64-apple-darwin': + return `${productName}_${version}_macos_amd64.dmg` + default: + console.error('Target is not supported') + process.exit(1) + } +} diff --git a/cspell.config.yaml b/cspell.config.yaml index 0ec39ad33..89cf277c5 100644 --- a/cspell.config.yaml +++ b/cspell.config.yaml @@ -137,6 +137,7 @@ words: - modnet - moeru - Morioki + - msvc - Myriam - ndarray - Neko