download from zip

This commit is contained in:
Rimo
2024-01-26 15:22:17 +00:00
parent fdb656e148
commit 9dea1aac7e
5 changed files with 93 additions and 54 deletions

View File

@@ -7,6 +7,7 @@ import * as path from 'path'
const ToolName = 'ossutil'
const DownloadEndpoint = 'https://gosspublic.alicdn.com/ossutil'
const IS_WINDOWS = process.platform === 'win32'
/**
* Install ossutil to PATH
@@ -33,58 +34,79 @@ export async function installOssutil(version: string): Promise<void> {
*/
async function downloadOssutil(version: string): Promise<string> {
// download
let toolFile: string
const downloadFileName = getDownloadFileName(version)
let downloadedFile: string
try {
const downloadUrl = getDownloadUrl(version)
const downloadUrl = `${DownloadEndpoint}/${version}/${downloadFileName}.zip`
core.info(`Downloading ossutil from: ${downloadUrl}`)
toolFile = await tc.downloadTool(downloadUrl)
downloadedFile = await tc.downloadTool(downloadUrl)
} catch (error) {
core.error('Failed to download ossutil')
throw error
}
core.debug(`ossutil downloaded to: ${toolFile}`)
core.info(`ossutil downloaded to: ${downloadedFile}`)
// extract (if needed)
if (process.platform === 'win32') {
const zipFile = `${toolFile}.zip`
await io.mv(toolFile, zipFile)
const extractFolder = await tc.extractZip(zipFile)
toolFile = path.join(extractFolder, 'ossutil64', 'ossutil64.exe')
core.debug(`ossutil extracted to: ${toolFile}`)
// extract
const zipFile = `${downloadedFile}.zip`
await io.mv(downloadedFile, zipFile)
const extractFolder = await tc.extractZip(zipFile)
const toolFileName = IS_WINDOWS ? 'ossutil64.exe' : 'ossutil64'
const toolFile = path.join(extractFolder, downloadFileName, toolFileName)
if (fs.existsSync(toolFile)) {
core.info(`ossutil extracted to: ${toolFile}`)
} else {
throw new Error('Unrecognized zip file structure')
}
// change permission
fs.chmodSync(toolFile, 0o755)
// cache
const fileName = process.platform === 'win32' ? `${ToolName}.exe` : ToolName
const toolPath = await tc.cacheFile(toolFile, fileName, ToolName, version)
core.debug(`ossutil cached to: ${toolPath}`)
const cacheFileName = IS_WINDOWS ? `${ToolName}.exe` : ToolName
const toolPath = await tc.cacheFile(
toolFile,
cacheFileName,
ToolName,
version
)
core.info(`ossutil installed to: ${toolPath}`)
return toolPath
}
/**
* Get the URL of the specific version of ossutil
* Get the file name of the specific version of ossutil
* @param version the version of ossutil to download
* @returns the URL
* @returns the file name (e.g., ossutil-v1.7.19-linux-amd64)
*/
function getDownloadUrl(version: string): string {
let downloadUrl = `${DownloadEndpoint}/${version}/`
function getDownloadFileName(version: string): string {
let platform = ''
switch (process.platform) {
case 'linux':
downloadUrl += 'ossutil64'
platform = 'linux'
break
case 'win32':
downloadUrl += 'ossutil64.zip'
platform = 'windows'
break
case 'darwin':
downloadUrl += 'ossutilmac64'
platform = 'mac'
break
default:
throw new Error(`Unknown platform ${process.platform}`)
throw new Error(`Unsupported platform ${process.platform}`)
}
return downloadUrl
let arch = ''
switch (process.arch) {
case 'arm64':
arch = 'arm64'
break
case 'x64':
arch = 'amd64'
break
default:
throw new Error(`Unsupported arch ${process.arch}`)
}
return `ossutil-v${version}-${platform}-${arch}`
}
/**

View File

@@ -8,8 +8,8 @@ import * as installer from './installer'
*/
export async function run(): Promise<void> {
try {
install()
config()
await install()
await config()
} catch (error) {
// Fail the workflow run if an error occurs
if (error instanceof Error) core.setFailed(error.message)