Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Swap to GraphQL and add logging #83

Merged
merged 4 commits into from
Jul 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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: '<version>' # default is latest stable
version: '<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
Expand Down
8 changes: 2 additions & 6 deletions src/run.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,12 +74,8 @@ describe('run.ts', () => {
expect(os.type).toBeCalled()
})

test('getLatestHelmVersion() - return the latest version of HELM', async () => {
try {
expect(await run.getLatestHelmVersion()).toBe('v3.8.0')
} catch (e) {
return e
}
test('getLatestHelmVersion() - return the stable version of HELM since its not authenticated', async () => {
expect(await run.getLatestHelmVersion()).toBe('v3.9.0')
})

test('walkSync() - return path to the all files matching fileToFind in dir', () => {
Expand Down
62 changes: 34 additions & 28 deletions src/run.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,25 @@ 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})

if (version !== 'latest' && version[0] !== 'v') {
core.info('Getting latest Helm version')
version = getValidVersion(version)
}
if (version.toLocaleLowerCase() === 'latest') {
version = await getLatestHelmVersion()
}

core.debug(util.format('Downloading %s', version))
let cachedPath = await downloadHelm(version)
core.startGroup(`Downloading ${version}`)
const cachedPath = await downloadHelm(version)
core.endGroup()

try {
if (!process.env['PATH'].startsWith(path.dirname(cachedPath))) {
Expand All @@ -35,41 +37,46 @@ export async function run() {
//do nothing, set as output variable
}

console.log(
`Helm tool version: '${version}' has been cached at ${cachedPath}`
)
core.info(`Helm tool version '${version}' has been cached at ${cachedPath}`)
core.setOutput('helm-path', cachedPath)
}

//Returns version with proper v before it
// Prefixes version with v
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<string> {
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.warning(
`Could not find valid release. Using default version ${stableHelmVersion}`
)
return stableHelmVersion
}

Expand Down Expand Up @@ -135,10 +142,9 @@ export async function downloadHelm(version: string): Promise<string> {
)
} catch (exception) {
throw new Error(
util.format(
'Failed to download Helm from location',
getHelmDownloadURL(version)
)
`Failed to download Helm from location ${getHelmDownloadURL(
version
)}`
)
}

Expand Down