From 42a468462c86c15262de2c39f1d7a090b96de888 Mon Sep 17 00:00:00 2001 From: Oliver King Date: Fri, 8 Jul 2022 11:31:12 -0400 Subject: [PATCH] swap to graphql --- README.md | 6 ++++-- src/run.test.ts | 2 +- src/run.ts | 43 +++++++++++++++++++++++++------------------ 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 20556df..9255b09 100644 --- a/README.md +++ b/README.md @@ -9,14 +9,16 @@ Acceptable values are latest or any semantic version string like v3.5.0 Use this ```yaml - uses: azure/setup-helm@v3 with: - version: '' # default is latest stable + version: '' # default is latest (stable) id: install ``` +> Note: When using latest version you might hit the GitHub GraphQL API hourly rate limit of 5,000. The action will then return the hardcoded default stable version (currently v3.9.0). If you rely on a certain version higher than the default, you should use that version instead of latest. + The cached helm binary path is prepended to the PATH environment variable as well as stored in the helm-path output variable. Refer to the action metadata file for details about all the inputs https://github.com/Azure/setup-helm/blob/master/action.yml -# Contributing +## Contributing This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us diff --git a/src/run.test.ts b/src/run.test.ts index 14c3351..6002693 100644 --- a/src/run.test.ts +++ b/src/run.test.ts @@ -74,7 +74,7 @@ describe('run.ts', () => { expect(os.type).toBeCalled() }) - test('getLatestHelmVersion() - return the latest version of HELM', async () => { + test('getLatestHelmVersion() - return the stable version of HELM since its not authenticated', async () => { try { expect(await run.getLatestHelmVersion()).toBe('v3.8.0') } catch (e) { diff --git a/src/run.ts b/src/run.ts index d017d08..0dd16c4 100644 --- a/src/run.ts +++ b/src/run.ts @@ -9,10 +9,10 @@ import * as fs from 'fs' import * as toolCache from '@actions/tool-cache' import * as core from '@actions/core' +import {graphql} from '@octokit/graphql' const helmToolName = 'helm' -const stableHelmVersion = 'v3.8.0' -const helmAllReleasesUrl = 'https://api.github.com/repos/helm/helm/releases' +const stableHelmVersion = 'v3.9.0' export async function run() { let version = core.getInput('version', {required: true}) @@ -46,30 +46,37 @@ export function getValidVersion(version: string): string { return 'v' + version } -// Downloads the helm releases JSON and parses all the recent versions of helm from it. -// Defaults to sending stable helm version if none are valid or if it fails - +// Gets the latest helm version or returns a default stable if getting latest fails export async function getLatestHelmVersion(): Promise { - const helmJSONPath: string = await toolCache.downloadTool(helmAllReleasesUrl) - try { - const helmJSON = JSON.parse(fs.readFileSync(helmJSONPath, 'utf-8')) - for (let i in helmJSON) { - if (isValidVersion(helmJSON[i].tag_name)) { - return helmJSON[i].tag_name - } - } + const {repository} = await graphql( + ` + { + repository(name: "helm", owner: "helm") { + releases(last: 100) { + nodes { + tagName + } + } + } + } + ` + ) + const releases = repository.releases.nodes.reverse() + const latestValidRelease = releases.find((release: {tagName: string}) => + isValidVersion(release.tagName) + ) + if (latestValidRelease) return latestValidRelease } catch (err) { core.warning( - util.format( - 'Error while fetching the latest Helm release. Error: %s. Using default Helm version %s', - err.toString(), - stableHelmVersion - ) + `Error while fetching latest Helm release: ${err.toString()}. Using default version ${stableHelmVersion}` ) return stableHelmVersion } + core.debug( + `Could not find valid release. Using default version ${stableHelmVersion}` + ) return stableHelmVersion }