pantry/scripts/get-platform.ts
2023-02-11 15:46:39 -05:00

117 lines
No EOL
2.8 KiB
TypeScript
Executable file

#!/usr/bin/env tea
/*---
args:
- deno
- run
- --allow-read
- --allow-env
- --allow-write
---*/
import { panic } from "utils"
import { Package, PackageRequirement } from "types"
import * as ARGV from "./utils/args.ts"
const exceptions: { [project: string]: number } = {
"deno.land": 4,
"ziglang.org": 8,
}
const packages = await ARGV.toArray(ARGV.pkgs())
type Output = {
os: OS,
buildOs: OS,
container?: string,
testMatrix: { os: OS, container?: string }[]
cacheSet: string
}
type OS = string | string[]
const platform = Deno.env.get("PLATFORM") ?? panic("$PLATFORM not set")
const home = Deno.env.get("HOME")
const cacheSets = {
"darwin": `${home}/Library/Caches/deno/deps/https/`,
"linux": `${home}/.cache/deno/deps/https/`
}
const output: Output = (() => {
switch(platform) {
case "darwin+x86-64": {
// Using GHA resources for now, until we resolve network issues with our runners
// buildOs: ["self-hosted", "macOS", "X64"]
const os = "macos-11"
return {
os,
buildOs: os,
testMatrix: [{ os }],
cacheSet: cacheSets["darwin"]
}
}
case "darwin+aarch64": {
const os = ["self-hosted", "macOS", "ARM64"]
return {
os,
buildOs: os,
testMatrix: [{ os }],
cacheSet: cacheSets["darwin"]
}
}
case "linux+aarch64": {
const os = ["self-hosted", "linux", "ARM64"]
return {
os,
buildOs: os,
testMatrix: [{ os }],
cacheSet: cacheSets["linux"]
}
}
case "linux+x86-64": {
// Using GHA resources for now, until we resolve network issues with our runners
// buildOs: ["self-hosted", "linux", "X64"]
// testMatrix.push({ os: buildOs, container: undefined })
const os = "ubuntu-latest"
const container = "ghcr.io/teaxyz/infuser:latest"
return { os,
buildOs: sizedUbuntu(packages),
container,
testMatrix: [
{ os },
{ os, container },
{ os, container: "debian:buster-slim" }
],
cacheSet: cacheSets["linux"]
}
}
default:
panic(`Invalid platform description: ${platform}`)
}})()
const rv = `os=${JSON.stringify(output.os)}\n` +
`build-os=${JSON.stringify(output.buildOs)}\n` +
`container=${JSON.stringify(output.container)}\n` +
`test-matrix=${JSON.stringify(output.testMatrix)}\n` +
`cache-set=${JSON.stringify(output.cacheSet)}\n`
Deno.stdout.write(new TextEncoder().encode(rv))
if (Deno.env.get("GITHUB_OUTPUT")) {
const envFile = Deno.env.get("GITHUB_OUTPUT")!
await Deno.writeTextFile(envFile, rv, { append: true})
}
function sizedUbuntu(packages: (Package | PackageRequirement)[]): string {
const size = Math.max(2, ...packages.map(p => exceptions[p.project] ?? 2))
if (size == 2) {
return "ubuntu-latest"
} else if ([4, 8, 16].includes(size)) {
return `ubuntu-latest-${size}-cores`
} else {
panic(`Invalid size: ${size}`)
}
}