chore(ci): improve scripts

This commit is contained in:
Neko Ayaka
2025-07-19 20:47:05 +08:00
parent 76e546316a
commit d434c9486f
7 changed files with 235 additions and 113 deletions
+12 -6
View File
@@ -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 }}
+1
View File
@@ -0,0 +1 @@
AIRI_nightly-20250719-76e5463_macos_arm64.dmg
+2 -1
View File
@@ -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",
@@ -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>',
'Tag to use for the release',
{ default: '', type: [String] },
)
.option(
'--out <path>',
'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)
})
+89 -106
View File
@@ -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>',
'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>',
'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('<Target> 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('<Target> 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)
})
+70
View File
@@ -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('<Target> 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)
}
}
+1
View File
@@ -137,6 +137,7 @@ words:
- modnet
- moeru
- Morioki
- msvc
- Myriam
- ndarray
- Neko