gotesttools-gotestfmt-action/index.js
Y. Meyer-Norwood ed11bda1c4
Fix installation on Windows runners (#10)
* Correctly identify windows os

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Prevent darwin from being reported as Linux

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Remove unix specific logging and determine .zip extension on windows

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Add selftest on windows

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Run self test on all push events (for testing)

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Inline postfix declaration

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Separate extension detection from postfix

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Correctly avoid assignment to const variable

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Make postfix constant

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Prevent curl from assuming tar.gz format

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Refactor download stage

* Separate logical steps
* Use string interpolation for curl command

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Use environment defined temp path

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Fix missing `$`

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Correct all references to hardcoded filename

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Attempt debugging missing download

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Restore original console loggers

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* USe GOOs

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Extract binary directly to GOPATH rather than hardcoded lib path

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Properly log GOOS detection

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Remove GOOS detection as GOOS not in environment

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Replace GOPATH with system dependent lib path

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Fix windows path separator problems

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Simplify archive path

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Fix escape character

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Use more meaningful name for binpath

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Fix whitespace

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Add debugger lines

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Add debugger lines for executed commands

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Use console debug instead of log

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Use program files as binpath

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Add install directory to path

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Remove debuggers

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Fix os check

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Remove redundant pathsep variable

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Add documentation comments

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Fix missing path separators

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Explicitly echo bin path into GITHUB_PATH

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Quote bin path when `cd`ing into it to avoid shell globbing

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Ensure bin path exists

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Attempt to prevent existing directories causing problems

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Use core.addPath to add binpath to job's PATH

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Attempt to use pre-existing lib path instead of creating new one

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Add debugger for PATH variable

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* List System32 files to look for gotestfmt binary

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Remove debugger

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Manually setup binpath and add it to system path

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* List PATH targets for debugging

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Add debuggers for userprofile

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* List install target's contents

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* List files recursively and verbosely

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Search `/bin` specifically

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Only manually add the binpath on windows

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* List all PATHs

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Split on correct separator

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Don't force the directory to exist/into PATH

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Attempt to create custom binpath in windows

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Fix mkdir invocation

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Create all path components

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* List all files in target directory

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Try using pwsh for Windows runner

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Try using exe for pwsh

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Remove testing step

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* List files extracted to bin path

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Expand debugger

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* List files in temporary directory

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* List files in current directory

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Rather than changing directories, specify target to tar command

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Quote parameters to tar command

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Specify target directory before target files

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Move extracted binary manually

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Add callback to file move

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Use system defined target file

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Correct interpolation

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Copy binfile instead of renaming to prevent cross-device linking

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* List installed files

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Use binfile in final success log message

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Remove explicit path separator

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Specify fs.constants.COPYFILE_EXCL copy mode

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Extract archive directly into workspace

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Remove redundant `binfile` variable

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Remove debugger

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* List all files in workspace

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Remove debugging steps

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>

* Remove inline comments

This is per @engelmi's comment: https://github.com/GoTestTools/gotestfmt-action/pull/10/files#r1017614705

Signed-off-by: Y. Meyer-Norwood <106889957+norwd@users.noreply.github.com>

Signed-off-by: Yuri Norwood <106889957+norwd@users.noreply.github.com>
Signed-off-by: Y. Meyer-Norwood <106889957+norwd@users.noreply.github.com>
2022-11-10 17:43:54 +01:00

113 lines
4.2 KiB
JavaScript

const core = require('@actions/core');
const { Octokit } = require("@octokit/rest");
const fs = require("fs")
const { execSync } = require("child_process")
async function downloadRelease(octokit, os, org, repo, release, token) {
const postfix = `_${os}_amd64.${os === "windows" ? "zip" : "tar.gz"}`;
const tempdir = os === "windows" ? process.env.TEMP + "\\" : "/tmp/";
const extract = os === "windows" ? "tar -xvf" : "tar -xvzf";
const archive = `${tempdir}gotestfmt${postfix}`;
const releaseAssets = await octokit.rest.repos.listReleaseAssets({
owner: org,
repo: repo,
release_id: release.id,
})
for (let asset of releaseAssets.data) {
console.log("Examining release asset " + asset.name + " at " + asset.browser_download_url + " ...")
if (asset.name.endsWith(postfix)) {
console.log("Found binary named " + asset.name + " at " + asset.browser_download_url + " , attempting download...")
if (token) {
execSync(`curl -L -o ${archive} -H "Authorization: Bearer ${token}" ${asset.browser_download_url}`)
} else {
execSync(`curl -L -o ${archive} ${asset.browser_download_url}`)
}
console.log("Unpacking archive file...")
core.addPath(process.env.GITHUB_WORKSPACE)
process.chdir(process.env.GITHUB_WORKSPACE)
execSync(`${extract} "${archive}"`)
console.log("Removing asset archive...")
fs.unlinkSync(archive)
console.log("Successfully set up gotestfmt.")
return
}
}
throw `No release asset matched postfix '${postfix}'.`
}
async function downloadGofmt(octokit, version, versionPrefix, os, org, repo, token) {
if (version !== "") {
if (!version.startsWith(versionPrefix)) {
throw "Specified version " + version + " does not start with required version prefix " + versionPrefix + "."
}
console.log("Downloading gotestfmt version " + version + " from " + org + "/" + repo + "...")
} else {
console.log("Downloading latest stable gotestfmt version starting with " + versionPrefix + " from " + org + "/" + repo + "...")
}
const releases = await octokit.rest.repos.listReleases({
owner: org,
repo: repo
// No pagination added, we are optimistic that there is a stable release within the first 100
// releases.
})
let tries = 0
for (let release of releases.data) {
if ((version !== "" && release.name === version) || (!release.prerelease && release.name.startsWith(versionPrefix))) {
console.log("Found release " + release.name + " matching criteria, attempting to download binary...")
try {
await downloadRelease(octokit, os, org, repo, release, token)
return
} catch (e) {
tries++
if (tries > 3) {
console.log("Binary download failed, tried " + tries + " times, giving up. (" + e + ")")
throw e
}
console.log("Binary download failed, trying next release. (" + e + ")")
}
}
}
console.log("Failed to find a release matching the criteria.")
throw "Failed to find a release matching the criteria."
}
async function determineOS() {
const uname = execSync("uname")
let os = uname.toString().trim().toLowerCase()
if (os.indexOf("msys_nt") === 0)
{
os = "windows";
}
console.log(`Running on OS '${os}'`)
return os
}
async function main() {
try {
// versionPrefix is the prefix of the version gotestfmt-action supports.
const versionPrefix = "v2."
const token = core.getInput('token');
const version = core.getInput('version');
const org = core.getInput("org")
const repo = core.getInput("repo")
const octokit = new Octokit({
auth: token,
})
const os = await determineOS()
await downloadGofmt(octokit, version, versionPrefix, os, org, repo, token)
console.log("Setup complete.")
} catch (error) {
console.log("Setup failed.")
core.setFailed(error);
}
}
main()