introduce SettingsProviders
This commit is contained in:
@@ -4,16 +4,13 @@ import * as path from 'path'
|
||||
import * as http from 'typed-rest-client/HttpClient'
|
||||
|
||||
import { inject, injectable } from 'inversify'
|
||||
import { TYPES, IExecResult, IBuildAgent, ISetupSettings } from './models'
|
||||
import { TYPES, IExecResult, IBuildAgent } from './models'
|
||||
import { IVersionManager } from './versionManager'
|
||||
import { ISetupSettings } from '../tools/common/models'
|
||||
|
||||
export interface IDotnetTool {
|
||||
disableTelemetry(): void
|
||||
toolInstall(
|
||||
toolName: string,
|
||||
checkLatest: boolean,
|
||||
setupSettings: ISetupSettings
|
||||
): Promise<string>
|
||||
toolInstall(toolName: string, checkLatest: boolean, setupSettings: ISetupSettings): Promise<string>
|
||||
}
|
||||
|
||||
@injectable()
|
||||
@@ -22,20 +19,12 @@ export class DotnetTool implements IDotnetTool {
|
||||
protected versionManager: IVersionManager
|
||||
private httpClient: http.HttpClient
|
||||
|
||||
private static readonly nugetRoot: string =
|
||||
'https://azuresearch-usnc.nuget.org/'
|
||||
private static readonly nugetRoot: string = 'https://azuresearch-usnc.nuget.org/'
|
||||
|
||||
constructor(
|
||||
@inject(TYPES.IBuildAgent) buildAgent: IBuildAgent,
|
||||
@inject(TYPES.IVersionManager) versionManager: IVersionManager
|
||||
) {
|
||||
constructor(@inject(TYPES.IBuildAgent) buildAgent: IBuildAgent, @inject(TYPES.IVersionManager) versionManager: IVersionManager) {
|
||||
this.buildAgent = buildAgent
|
||||
this.versionManager = versionManager
|
||||
this.httpClient = new http.HttpClient(
|
||||
'dotnet',
|
||||
undefined,
|
||||
this.buildAgent.proxyConfiguration(DotnetTool.nugetRoot)
|
||||
)
|
||||
this.httpClient = new http.HttpClient('dotnet', undefined, this.buildAgent.proxyConfiguration(DotnetTool.nugetRoot))
|
||||
}
|
||||
|
||||
public disableTelemetry(): void {
|
||||
@@ -48,16 +37,10 @@ export class DotnetTool implements IDotnetTool {
|
||||
return this.buildAgent.exec(cmd, args)
|
||||
}
|
||||
|
||||
public async toolInstall(
|
||||
toolName: string,
|
||||
checkLatest: boolean,
|
||||
setupSettings: ISetupSettings
|
||||
): Promise<string> {
|
||||
public async toolInstall(toolName: string, checkLatest: boolean, setupSettings: ISetupSettings): Promise<string> {
|
||||
console.log('')
|
||||
console.log('--------------------------')
|
||||
console.log(
|
||||
`Installing ${toolName} version ` + setupSettings.versionSpec
|
||||
)
|
||||
console.log(`Installing ${toolName} version ` + setupSettings.versionSpec)
|
||||
console.log('--------------------------')
|
||||
|
||||
if (this.versionManager.isExplicitVersion(setupSettings.versionSpec)) {
|
||||
@@ -74,9 +57,7 @@ export class DotnetTool implements IDotnetTool {
|
||||
|
||||
if (!toolPath) {
|
||||
let version: string
|
||||
if (
|
||||
this.versionManager.isExplicitVersion(setupSettings.versionSpec)
|
||||
) {
|
||||
if (this.versionManager.isExplicitVersion(setupSettings.versionSpec)) {
|
||||
//
|
||||
// Explicit version was specified. No need to query for list of versions.
|
||||
//
|
||||
@@ -88,15 +69,9 @@ export class DotnetTool implements IDotnetTool {
|
||||
// If your tool doesn't offer a mechanism to query,
|
||||
// then it can only support exact version inputs.
|
||||
//
|
||||
version = await this.queryLatestMatch(
|
||||
toolName,
|
||||
setupSettings.versionSpec,
|
||||
setupSettings.includePrerelease
|
||||
)
|
||||
version = await this.queryLatestMatch(toolName, setupSettings.versionSpec, setupSettings.includePrerelease)
|
||||
if (!version) {
|
||||
throw new Error(
|
||||
`Unable to find ${toolName} version '${setupSettings.versionSpec}'.`
|
||||
)
|
||||
throw new Error(`Unable to find ${toolName} version '${setupSettings.versionSpec}'.`)
|
||||
}
|
||||
|
||||
//
|
||||
@@ -108,11 +83,7 @@ export class DotnetTool implements IDotnetTool {
|
||||
//
|
||||
// Download, extract, cache
|
||||
//
|
||||
toolPath = await this.acquireTool(
|
||||
toolName,
|
||||
version,
|
||||
setupSettings.ignoreFailedSources
|
||||
)
|
||||
toolPath = await this.acquireTool(toolName, version, setupSettings.ignoreFailedSources)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,10 +93,7 @@ export class DotnetTool implements IDotnetTool {
|
||||
//
|
||||
this.buildAgent.debug(`toolPath: ${toolPath}`)
|
||||
|
||||
if (
|
||||
os.platform() !== 'win32' &&
|
||||
!this.buildAgent.getVariable('DOTNET_ROOT')
|
||||
) {
|
||||
if (os.platform() !== 'win32' && !this.buildAgent.getVariable('DOTNET_ROOT')) {
|
||||
let dotnetPath = await this.buildAgent.which('dotnet')
|
||||
dotnetPath = fs.readlinkSync(dotnetPath) || dotnetPath
|
||||
const dotnetRoot = path.dirname(dotnetPath)
|
||||
@@ -136,19 +104,13 @@ export class DotnetTool implements IDotnetTool {
|
||||
return toolPath
|
||||
}
|
||||
|
||||
private async queryLatestMatch(
|
||||
toolName: string,
|
||||
versionSpec: string,
|
||||
includePrerelease: boolean
|
||||
): Promise<string> {
|
||||
private async queryLatestMatch(toolName: string, versionSpec: string, includePrerelease: boolean): Promise<string> {
|
||||
this.buildAgent.debug(
|
||||
`querying tool versions for ${toolName}${
|
||||
versionSpec ? `@${versionSpec}` : ''
|
||||
} ${includePrerelease ? 'including pre-releases' : ''}`
|
||||
`querying tool versions for ${toolName}${versionSpec ? `@${versionSpec}` : ''} ${includePrerelease ? 'including pre-releases' : ''}`
|
||||
)
|
||||
|
||||
const toolNameParam = encodeURIComponent(toolName.toLowerCase());
|
||||
const prereleaseParam = includePrerelease ? 'true' : 'false';
|
||||
const toolNameParam = encodeURIComponent(toolName.toLowerCase())
|
||||
const prereleaseParam = includePrerelease ? 'true' : 'false'
|
||||
const downloadPath = `${DotnetTool.nugetRoot}query?q=${toolNameParam}&prerelease=${prereleaseParam}&semVerLevel=2.0.0&take=1`
|
||||
|
||||
const res = await this.httpClient.get(downloadPath)
|
||||
@@ -160,23 +122,19 @@ export class DotnetTool implements IDotnetTool {
|
||||
const body: string = await res.readBody()
|
||||
const data = JSON.parse(body).data
|
||||
|
||||
const versions = (data[0].versions as { version: string }[]).map(
|
||||
x => x.version
|
||||
)
|
||||
const versions = (data[0].versions as { version: string }[]).map(x => x.version)
|
||||
if (!versions || !versions.length) {
|
||||
return null
|
||||
}
|
||||
|
||||
this.buildAgent.debug(`got versions: ${versions.join(', ')}`)
|
||||
|
||||
return this.versionManager.evaluateVersions(versions, versionSpec, { includePrerelease })
|
||||
return this.versionManager.evaluateVersions(versions, versionSpec, {
|
||||
includePrerelease
|
||||
})
|
||||
}
|
||||
|
||||
private async acquireTool(
|
||||
toolName: string,
|
||||
version: string,
|
||||
ignoreFailedSources: boolean
|
||||
): Promise<string> {
|
||||
private async acquireTool(toolName: string, version: string, ignoreFailedSources: boolean): Promise<string> {
|
||||
const tempDirectory = await this.buildAgent.createTempDir()
|
||||
let args = ['tool', 'install', toolName, '--tool-path', tempDirectory]
|
||||
|
||||
|
||||
@@ -5,19 +5,9 @@ export const TYPES = {
|
||||
IDotnetTool: Symbol.for('DotnetTool'),
|
||||
IGitVersionTool: Symbol.for('GitVersionTool'),
|
||||
IGitReleaseManagerTool: Symbol.for('GitReleaseManagerTool'),
|
||||
IVersionManager: Symbol.for('VersionManager')
|
||||
}
|
||||
|
||||
export enum SetupFields {
|
||||
includePrerelease = 'includePrerelease',
|
||||
versionSpec = 'versionSpec',
|
||||
ignoreFailedSources = 'ignoreFailedSources'
|
||||
}
|
||||
|
||||
export interface ISetupSettings {
|
||||
[SetupFields.versionSpec]: string
|
||||
[SetupFields.includePrerelease]: boolean
|
||||
[SetupFields.ignoreFailedSources]: boolean
|
||||
IVersionManager: Symbol.for('VersionManager'),
|
||||
IGitVersionSettingsProvider: Symbol.for('GitVersionSettingsProvider'),
|
||||
IGitReleaseManagerSettingsProvider: Symbol.for('GitReleaseManagerSettingsProvider')
|
||||
}
|
||||
|
||||
export interface IExecResult {
|
||||
@@ -26,17 +16,11 @@ export interface IExecResult {
|
||||
code: number
|
||||
error: Error
|
||||
}
|
||||
|
||||
export interface IBuildAgent {
|
||||
agentName: string
|
||||
proxyConfiguration(url: string): IRequestOptions
|
||||
find(toolName: string, versionSpec: string, arch?: string): string
|
||||
cacheDir(
|
||||
sourceDir: string,
|
||||
tool: string,
|
||||
version: string,
|
||||
arch?: string
|
||||
): Promise<string>
|
||||
cacheDir(sourceDir: string, tool: string, version: string, arch?: string): Promise<string>
|
||||
createTempDir(): Promise<string>
|
||||
debug(message: string): void
|
||||
setFailed(message: string, done?: boolean): void
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
import { IBuildAgent, SetupFields, ISetupSettings } from './models'
|
||||
|
||||
export class Settings {
|
||||
public static getSetupSettings(buildAgent: IBuildAgent): ISetupSettings {
|
||||
const versionSpec = buildAgent.getInput(SetupFields.versionSpec)
|
||||
const includePrerelease = buildAgent.getBooleanInput(
|
||||
SetupFields.includePrerelease
|
||||
)
|
||||
const ignoreFailedSources = buildAgent.getBooleanInput(
|
||||
SetupFields.ignoreFailedSources
|
||||
)
|
||||
|
||||
return {
|
||||
versionSpec,
|
||||
includePrerelease,
|
||||
ignoreFailedSources
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user