forked from oclif/oclif
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tarballs.ts
80 lines (69 loc) 路 3.67 KB
/
tarballs.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import {Command, Flags} from '@oclif/core'
import {Interfaces} from '@oclif/core'
import * as qq from 'qqjs'
import aws from '../../aws'
import {log} from '../../log'
import * as Tarballs from '../../tarballs'
import {commitAWSDir, templateShortKey} from '../../upload-util'
export default class UploadTarballs extends Command {
static description = `upload an oclif CLI to S3
"aws-sdk" will need to be installed as a devDependency to upload.
`
static flags = {
root: Flags.string({char: 'r', description: 'path to oclif CLI root', default: '.', required: true}),
targets: Flags.string({char: 't', description: 'comma-separated targets to upload (e.g.: linux-arm,win32-x64)'}),
xz: Flags.boolean({description: 'also upload xz', allowNo: true}),
}
async run(): Promise<void> {
const {flags} = await this.parse(UploadTarballs)
if (process.platform === 'win32') throw new Error('upload does not function on windows')
const buildConfig = await Tarballs.buildConfig(flags.root, {xz: flags.xz, targets: flags?.targets?.split(',')})
const {s3Config, dist, config, xz} = buildConfig
// fail early if targets are not built
for (const target of buildConfig.targets) {
const tarball = dist(templateShortKey('versioned', {ext: '.tar.gz', bin: config.bin, version: config.version, sha: buildConfig.gitSha, ...target}))
// eslint-disable-next-line no-await-in-loop
if (!await qq.exists(tarball)) this.error(`Cannot find a tarball ${tarball} for ${target.platform}-${target.arch}`, {
suggestions: [`Run "oclif pack --target ${target.platform}-${target.arch}" before uploading`],
})
}
const S3Options = {
Bucket: s3Config.bucket!,
ACL: s3Config.acl || 'public-read',
}
const uploadTarball = async (options?: { platform: Interfaces.PlatformTypes; arch: Interfaces.ArchTypes}) => {
const TarballS3Options = {...S3Options, CacheControl: 'max-age=604800'}
const releaseTarballs = async (ext: '.tar.gz' | '.tar.xz') => {
const localKey = templateShortKey('versioned', ext, {
// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain
arch: options?.arch!,
bin: config.bin,
// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain
platform: options?.platform!,
sha: buildConfig.gitSha,
version: config.version,
})
const cloudKey = `${commitAWSDir(config.version, buildConfig.gitSha, s3Config)}/${localKey}`
await aws.s3.uploadFile(dist(localKey), {...TarballS3Options, ContentType: 'application/gzip', Key: cloudKey})
}
await releaseTarballs('.tar.gz')
if (xz) await releaseTarballs('.tar.xz')
const ManifestS3Options = {...S3Options, CacheControl: 'max-age=86400', ContentType: 'application/json'}
const manifest = templateShortKey('manifest', {
// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain
arch: options?.arch!,
bin: config.bin,
// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain
platform: options?.platform!,
sha: buildConfig.gitSha,
version: config.version,
})
const cloudKey = `${commitAWSDir(config.version, buildConfig.gitSha, s3Config)}/${manifest}`
await aws.s3.uploadFile(dist(manifest), {...ManifestS3Options, Key: cloudKey})
}
if (buildConfig.targets.length > 0) log('uploading targets')
// eslint-disable-next-line no-await-in-loop
for (const target of buildConfig.targets) await uploadTarball(target)
log(`done uploading tarballs & manifests for v${config.version}-${buildConfig.gitSha}`)
}
}