5 Commits
v0.6 ... v0.6.2

Author SHA1 Message Date
Artur Stolear
b882929b02 added create action for GRM 2020-01-26 23:01:40 +02:00
Artur Stolear
18ac32b856 re-arranged files 2020-01-26 09:03:09 +02:00
Artur Stolear
57e92d55a3 updated README 2020-01-25 19:37:19 +02:00
Artur Stolear
ad52a31bda rework the tasks structure 2020-01-25 09:29:13 +02:00
Artur Stolear
b8df3542ce rework the tasks structure 2020-01-25 08:48:01 +02:00
62 changed files with 134960 additions and 96151 deletions

14
.eslintrc.js Normal file
View File

@@ -0,0 +1,14 @@
module.exports = {
root: true,
parser: '@typescript-eslint/parser',
plugins: [
'@typescript-eslint',
'sort-keys-fix'
],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/eslint-recommended',
'plugin:@typescript-eslint/recommended',
'prettier/@typescript-eslint',
],
};

View File

@@ -8,6 +8,7 @@ jobs:
strategy:
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
fail-fast: false
steps:
- uses: actions/checkout@v2
- name: Fetch all history for all tags and branches

View File

@@ -35,7 +35,7 @@ jobs:
. .\dist\azure\update-version.ps1
update-manifest .\dist\azure\vss-extension.json -Version $version
dir .\dist\azure\**\task.json | % { update-task $_ -Major $major -Minor $minor }
dir -r .\dist\**\task.json | % { update-task $_ -Major $major -Minor $minor }
npm run publish:azure -- --token ${{ secrets.TFX_TOKEN }}
shell: pwsh

12
.vscode/launch.json vendored
View File

@@ -9,7 +9,7 @@
"request": "launch",
"preLaunchTask": "Build-Mock",
"name": "Debug Mock Setup GitVersion",
"program": "${workspaceFolder}/dist/mock/setup-gitversion/bundle.js",
"program": "${workspaceFolder}/dist/mock/gitversion/setup/bundle.js",
"outFiles": [ "${workspaceFolder}/**/*.js" ]
},
{
@@ -17,7 +17,7 @@
"request": "launch",
"preLaunchTask": "Build-Azure",
"name": "Debug Azure Setup GitVersion",
"program": "${workspaceFolder}/dist/azure/setup-gitversion/bundle.js",
"program": "${workspaceFolder}/dist/azure/gitversion/setup/bundle.js",
"outFiles": [ "${workspaceFolder}/**/*.js" ]
},
{
@@ -25,7 +25,7 @@
"request": "launch",
"preLaunchTask": "Build-GitHub",
"name": "Debug GitHub Setup GitVersion",
"program": "${workspaceFolder}/dist/github/setup-gitversion/bundle.js",
"program": "${workspaceFolder}/dist/github/gitversion/setup/bundle.js",
"outFiles": [ "${workspaceFolder}/**/*.js" ]
},
{
@@ -33,7 +33,7 @@
"request": "launch",
"preLaunchTask": "Build-Mock",
"name": "Debug Mock Execute GitVersion",
"program": "${workspaceFolder}/dist/mock/execute-gitversion/bundle.js",
"program": "${workspaceFolder}/dist/mock/gitversion/execute/bundle.js",
"outFiles": [ "${workspaceFolder}/**/*.js" ]
},
{
@@ -41,7 +41,7 @@
"request": "launch",
"preLaunchTask": "Build-Azure",
"name": "Debug Azure Execute GitVersion",
"program": "${workspaceFolder}/dist/azure/execute-gitversion/bundle.js",
"program": "${workspaceFolder}/dist/azure/gitversion/execute/bundle.js",
"outFiles": [ "${workspaceFolder}/**/*.js" ]
},
{
@@ -49,7 +49,7 @@
"request": "launch",
"preLaunchTask": "Build-GitHub",
"name": "Debug GitHub Execute GitVersion",
"program": "${workspaceFolder}/dist/github/execute-gitversion/bundle.js",
"program": "${workspaceFolder}/dist/github/gitversion/execute/bundle.js",
"outFiles": [ "${workspaceFolder}/**/*.js" ]
},
]

View File

@@ -9,7 +9,9 @@ GitHub Actions that allow to install and use the GitVersion and GitReleaseManage
## Usage
See [setup](gitversion/setup) and [usage](gitversion/execute/action.yml)
See [setup](gitversion/setup/action.yml) and [usage](gitversion/execute/action.yml) for GitVersion
and [setup](gitreleasemanager/setup/action.yml) for GitReleaseManager
## Dependency
@@ -32,12 +34,12 @@ Basic:
- name: Fetch all history for all tags and branches
run: git fetch --prune --unshallow
- name: Install GitVersion
uses: gittools/actions/gitversion/setup@v0.6
uses: gittools/actions/gitversion/setup@v0.6.1
with:
versionSpec: '5.1.x'
- name: Use GitVersion
id: gitversion # step id used as reference for output values
uses: gittools/actions/gitversion/execute@v0.6
uses: gittools/actions/gitversion/execute@v0.6.1
- run: |
echo "Major: ${{ steps.gitversion.outputs.major }}"
echo "Minor: ${{ steps.gitversion.outputs.minor }}"
@@ -78,7 +80,6 @@ Private repos require credentials before you can fetch the master branch and tag
```yaml
steps:
- name: Checkout
- name: Checkout
uses: actions/checkout@v2
- name: Fetch all history for all tags and branches

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,24 @@
{
"id": "c77d38be-46a9-4ef1-a181-2d6050ed23d2",
"name": "gitreleasemanager/create",
"friendlyName": "Create GitReleaseManager Task",
"description": "Tool for creating and exporting releases for software applications hosted on GitHub",
"author": "GitTools Contributors",
"helpMarkDown": "See the [documentation](https://gittools.github.io/GitReleaseManager/docs/) for help",
"category": "Build",
"demands": [],
"version": {
"Major": "1",
"Minor": "0",
"Patch": "0"
},
"minimumAgentVersion": "2.115.0",
"execution": {
"Node": {
"target": "bundle.js",
"argumentFormat": "",
"workingDirectory": "."
}
},
"instanceNameFormat": "gitreleasemanager/create"
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -1,6 +1,6 @@
{
"id": "e3022448-b00d-4b57-b504-606a0bcf8279",
"name": "gitreleasemanager-setup",
"name": "gitreleasemanager/setup",
"friendlyName": "Setup GitReleaseManager Task",
"description": "Tool for creating and exporting releases for software applications hosted on GitHub",
"author": "GitTools Contributors",
@@ -20,7 +20,7 @@
"workingDirectory": "."
}
},
"instanceNameFormat": "gitreleasemanager-setup",
"instanceNameFormat": "gitreleasemanager/setup",
"inputs": [{
"name": "versionSpec",
"type": "string",

File diff suppressed because one or more lines are too long

View File

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -1,6 +1,6 @@
{
"id": "9013cf7f-ee8d-49f4-a39b-db244928d391",
"name": "gitversion-execute",
"name": "gitversion/execute",
"friendlyName": "Execute GitVersion Task",
"description": "Easy Semantic Versioning (http://semver.org) for projects using Git",
"author": "GitTools Contributors",
@@ -20,7 +20,7 @@
"workingDirectory": "."
}
},
"instanceNameFormat": "gitversion-execute",
"instanceNameFormat": "gitversion/execute",
"groups": [{
"name": "gitversionDetails",
"displayName": "GitVersion details",

18289
dist/azure/gitversion/setup/bundle.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

46
dist/azure/gitversion/setup/lib.json vendored Normal file
View File

@@ -0,0 +1,46 @@
{
"messages": {
"LIB_UnhandledEx": "Unhandled: %s",
"LIB_FailOnCode": "Failure return code: %d",
"LIB_MkdirFailed": "Unable to create directory '%s'. %s",
"LIB_MkdirFailedFileExists": "Unable to create directory '%s'. Conflicting file exists: '%s'",
"LIB_MkdirFailedInvalidDriveRoot": "Unable to create directory '%s'. Root directory does not exist: '%s'",
"LIB_MkdirFailedInvalidShare": "Unable to create directory '%s'. Unable to verify the directory exists: '%s'. If directory is a file share, please verify the share name is correct, the share is online, and the current process has permission to access the share.",
"LIB_MultilineSecret": "Secrets cannot contain multiple lines",
"LIB_ProcessError": "There was an error when attempting to execute the process '%s'. This may indicate the process failed to start. Error: %s",
"LIB_ProcessExitCode": "The process '%s' failed with exit code %s",
"LIB_ProcessStderr": "The process '%s' failed because one or more lines were written to the STDERR stream",
"LIB_ReturnCode": "Return code: %d",
"LIB_ResourceFileNotExist": "Resource file doesn\\'t exist: %s",
"LIB_ResourceFileAlreadySet": "Resource file has already set to: %s",
"LIB_ResourceFileNotSet": "Resource file haven\\'t set, can\\'t find loc string for key: %s",
"LIB_StdioNotClosed": "The STDIO streams did not close within %s seconds of the exit event from process '%s'. This may indicate a child process inherited the STDIO streams and has not yet exited.",
"LIB_WhichNotFound_Linux": "Unable to locate executable file: '%s'. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.",
"LIB_WhichNotFound_Win": "Unable to locate executable file: '%s'. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.",
"LIB_LocStringNotFound": "Can\\'t find loc string for key: %s",
"LIB_ParameterIsRequired": "%s not supplied",
"LIB_InputRequired": "Input required: %s",
"LIB_InvalidPattern": "Invalid pattern: '%s'",
"LIB_EndpointNotExist": "Endpoint not present: %s",
"LIB_EndpointDataNotExist": "Endpoint data parameter %s not present: %s",
"LIB_EndpointAuthNotExist": "Endpoint auth data not present: %s",
"LIB_InvalidEndpointAuth": "Invalid endpoint auth: %s",
"LIB_InvalidSecureFilesInput": "Invalid secure file input: %s",
"LIB_PathNotFound": "Not found %s: %s",
"LIB_PathHasNullByte": "Path cannot contain null bytes",
"LIB_OperationFailed": "Failed %s: %s",
"LIB_UseFirstGlobMatch": "Multiple workspace matches. using first.",
"LIB_MergeTestResultNotSupported": "Merging test results from multiple files to one test run is not supported on this version of build agent for OSX/Linux, each test result file will be published as a separate test run in VSO/TFS.",
"LIB_PlatformNotSupported": "Platform not supported: %s",
"TOOL_LIB_CachingTool": "Caching tool: %s %s %s",
"_TOOL_LIB_CachingTool.comment": "This informational log message indicates that a tool, that was just downloaded, is being copied into the cache directory. %s %s %s represent the tool name, version information, and processor architecture.",
"TOOL_LIB_Downloading": "Downloading: %s",
"_TOOL_LIB_Downloading.comment": "This information log message indicates that a file is being downloaded. %s represents the URL being downloaded.",
"TOOL_LIB_ExtractingArchive": "Extracting archive",
"_TOOL_LIB_ExtractingArchive.comment": "This informational log message indicates that an archive file is being extracted. For example, a .zip file, .7z file, or .tar.gz file.",
"TOOL_LIB_FoundInCache": "Found tool in cache: %s %s %s",
"_TOOL_LIB_FoundInCache.comment": "This informational log message indicates that the request tool is already cached, and does not need to be downloaded again. %s %s %s represent the tool name, version information, and processor architecture.",
"TOOL_LIB_PrependPath": "Prepending PATH environment variable with directory: %s",
"_TOOL_LIB_PrependPath.comment": "This informational log message indicates that a directory is being prepended to the front of the PATH environment variable. The directories specified by the PATH environment variable are used to resolve the location of command line tools."
}
}

View File

@@ -1,6 +1,6 @@
{
"id": "a06c02ae-7b9a-4082-90dc-fe27b500e54f",
"name": "gitversion-setup",
"name": "gitversion/setup",
"friendlyName": "Setup GitVersion Task",
"description": "Easy Semantic Versioning (http://semver.org) for projects using Git",
"author": "GitTools Contributors",
@@ -20,7 +20,7 @@
"workingDirectory": "."
}
},
"instanceNameFormat": "gitversion-setup",
"instanceNameFormat": "gitversion/setup",
"inputs": [{
"name": "versionSpec",
"type": "string",

File diff suppressed because one or more lines are too long

View File

@@ -11,9 +11,10 @@
"id": "Microsoft.VisualStudio.Services"
}],
"files": [
{ "path": "setup-gitversion" },
{ "path": "execute-gitversion" },
{ "path": "setup-gitreleasemanager" }
{ "path": "gitversion/setup" },
{ "path": "gitversion/execute" },
{ "path": "gitreleasemanager/setup" },
{ "path": "gitreleasemanager/create" }
],
"categories": [
"Azure Pipelines"
@@ -67,7 +68,7 @@
"ms.vss-distributed-task.tasks"
],
"properties": {
"name": "setup-gitversion"
"name": "gitversion/setup"
}
}, {
"id": "execute-gitversion-task",
@@ -76,7 +77,7 @@
"ms.vss-distributed-task.tasks"
],
"properties": {
"name": "execute-gitversion"
"name": "gitversion/execute"
}
}, {
"id": "setup-gitreleasemanager-task",
@@ -85,7 +86,16 @@
"ms.vss-distributed-task.tasks"
],
"properties": {
"name": "setup-gitreleasemanager"
"name": "gitreleasemanager/setup"
}
}, {
"id": "create-gitreleasemanager-task",
"type": "ms.vss-distributed-task.task",
"targets": [
"ms.vss-distributed-task.tasks"
],
"properties": {
"name": "gitreleasemanager/create"
}
}]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

12330
dist/github/gitversion/execute/bundle.js vendored Normal file

File diff suppressed because one or more lines are too long

12330
dist/github/gitversion/setup/bundle.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

7696
dist/mock/gitversion/execute/bundle.js vendored Normal file

File diff suppressed because one or more lines are too long

7696
dist/mock/gitversion/setup/bundle.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,9 @@
name: gitreleasemanager-create
description: GitHub Action for creating and exporting releases for software applications hosted on GitHub. Creates the release
author: GitTools
branding:
color: gray-dark
icon: git-pull-request
runs:
using: node12
main: ../../dist/github/gitreleasemanager/create/bundle.js

View File

@@ -6,7 +6,7 @@ branding:
icon: git-pull-request
runs:
using: node12
main: ../../dist/github/setup-gitreleasemanager/bundle.js
main: ../../dist/github/gitreleasemanager/setup/bundle.js
inputs:
versionSpec:
description: Required version in the form of 0.10.x or exact version like 0.10.2

View File

@@ -6,7 +6,7 @@ branding:
icon: git-pull-request
runs:
using: node12
main: ../../dist/github/execute-gitversion/bundle.js
main: ../../dist/github/gitversion/execute/bundle.js
inputs:
targetPath:
description: Optionally supply the path to the working directory

View File

@@ -6,7 +6,7 @@ branding:
icon: git-pull-request
runs:
using: node12
main: ../../dist/github/setup-gitversion/bundle.js
main: ../../dist/github/gitversion/setup/bundle.js
inputs:
versionSpec:
description: Required version in the form of 5.x or exact version like 5.0.0

View File

@@ -49,4 +49,4 @@
"webpack": "^4.41.5",
"webpack-cli": "^3.3.10"
}
}
}

View File

@@ -3,7 +3,7 @@ import { injectable } from "inversify";
import * as taskLib from "azure-pipelines-task-lib/task";
import * as toolLib from "azure-pipelines-tool-lib/tool";
import { IBuildAgent, IExecResult } from "../../core/interfaces";
import { IBuildAgent, IExecResult } from "../../core/common";
@injectable()
class BuildAgent implements IBuildAgent {

View File

@@ -10,7 +10,7 @@ import * as toolCache from "@actions/tool-cache";
import { injectable } from "inversify";
import { IBuildAgent, IExecResult } from "../../core/interfaces";
import { IBuildAgent, IExecResult } from "../../core/common";
@injectable()
class BuildAgent implements IBuildAgent {

View File

@@ -1,6 +1,6 @@
import { injectable } from "inversify";
import { IBuildAgent, IExecResult } from "../../core/interfaces";
import { IBuildAgent, IExecResult } from "../../core/common";
@injectable()
class BuildAgent implements IBuildAgent {

View File

@@ -9,16 +9,65 @@ import cmp from "semver-compare";
import { inject, injectable } from "inversify";
import { IBuildAgent,
IDotnetTool,
IExecResult,
IGitReleaseManagerTool,
IGitVersionOptions,
IGitVersionTool,
IVersionManager,
} from "./interfaces";
import { BuildAgent } from "../agent/mock/build-agent";
import { Container } from "inversify";
import { TYPES } from "./types";
const container = new Container();
export interface IVersionManager {
isExplicitVersion(versionSpec: string): boolean;
evaluateVersions(versions: string[], versionSpec: string): string;
cleanVersion(version: string): string;
}
export interface IBuildAgent {
agentName: string;
find(toolName: string, versionSpec: string, arch?: string): 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;
setSucceeded(message: string, done?: boolean): void;
exportVariable(name: string, val: string): void;
getVariable(name: string): string;
addPath(inputPath: string): void;
which(tool: string, check?: boolean): Promise<string>;
exec(exec: string, args: string[]): Promise<IExecResult>;
getSourceDir(): string;
isValidInputFile(input: string, file: string): boolean;
fileExists(file: string): boolean;
directoryExists(file: string): boolean;
setOutput(name: string, value: string): void;
getInput(input: string, required?: boolean): string;
getBooleanInput(input: string, required?: boolean): boolean;
}
export interface IDotnetTool {
run(args: string[]): Promise<IExecResult>;
toolInstall(toolName: string, versionSpec: string, checkLatest: boolean, includePre: boolean): Promise<string>;
}
export interface IExecResult {
stdout: string;
stderr: string;
code: number;
error: Error;
}
export const TYPES = {
IBuildAgent: Symbol.for("BuildAgent"),
IDotnetTool: Symbol.for("DotnetTool"),
IGitVersionTool: Symbol.for("GitVersionTool"),
IGitReleaseManagerTool: Symbol.for("GitReleaseManagerTool"),
IVersionManager: Symbol.for("VersionManager"),
};
export const SetupOptions = {
includePrerelease: "includePrerelease",
versionSpec: "versionSpec",
};
@injectable()
class DotnetTool implements IDotnetTool {
@@ -119,7 +168,7 @@ class DotnetTool implements IDotnetTool {
const body: string = await res.readBody();
const data = JSON.parse(body).data;
const versions = (data[0].versions as Array<{ version: string }>).map((x) => x.version);
const versions = (data[0].versions as { version: string }[]).map((x) => x.version);
if (!versions || !versions.length) {
return null;
}
@@ -153,102 +202,6 @@ class DotnetTool implements IDotnetTool {
}
}
@injectable()
class GitVersionTool implements IGitVersionTool {
private buildAgent: IBuildAgent;
private dotnetTool: IDotnetTool;
constructor(
@inject(TYPES.IBuildAgent) buildAgent: IBuildAgent,
@inject(TYPES.IDotnetTool) dotnetTool: IDotnetTool,
) {
this.buildAgent = buildAgent;
this.dotnetTool = dotnetTool;
}
public async install(versionSpec: string, includePrerelease: boolean): Promise<void> {
await this.dotnetTool.toolInstall("GitVersion.Tool", versionSpec, false, includePrerelease);
}
public run(options: IGitVersionOptions): Promise<IExecResult> {
const workDir = this.getRepoDir(options.targetPath);
const args = this.getArguments(workDir, options);
return this.buildAgent.exec("dotnet-gitversion", args);
}
private getRepoDir(targetPath: string): string {
let workDir: string;
const srcDir = this.buildAgent.getSourceDir();
if (!targetPath) {
workDir = srcDir;
} else {
if (this.buildAgent.directoryExists(targetPath)) {
workDir = path.join(srcDir, targetPath);
} else {
throw new Error("Directory not found at " + targetPath);
}
}
return workDir.replace(/\\/g, "/");
}
private getArguments(workDir: string, options: IGitVersionOptions): string[] {
const args = [
workDir,
"/output",
"json", // need to use buildserver later
];
const {
useConfigFile,
configFilePath,
updateAssemblyInfo,
updateAssemblyInfoFilename,
additionalArguments,
} = options;
if (useConfigFile) {
if (this.buildAgent.isValidInputFile("configFilePath", configFilePath)) {
args.push("/config", configFilePath);
} else {
throw new Error("GitVersion configuration file not found at " + configFilePath);
}
}
if (updateAssemblyInfo) {
args.push("/updateassemblyinfo");
if (this.buildAgent.isValidInputFile("updateAssemblyInfoFilename", updateAssemblyInfoFilename)) {
args.push(updateAssemblyInfoFilename);
} else {
throw new Error("AssemblyInfoFilename file not found at " + updateAssemblyInfoFilename);
}
}
args.push(additionalArguments);
return args;
}
}
@injectable()
class GitReleaseManagerTool implements IGitReleaseManagerTool {
private buildAgent: IBuildAgent;
private dotnetTool: IDotnetTool;
constructor(
@inject(TYPES.IBuildAgent) buildAgent: IBuildAgent,
@inject(TYPES.IDotnetTool) dotnetTool: IDotnetTool,
) {
this.buildAgent = buildAgent;
this.dotnetTool = dotnetTool;
}
public async install(versionSpec: string, includePrerelease: boolean): Promise<void> {
await this.dotnetTool.toolInstall("GitReleaseManager.Tool", versionSpec, false, includePrerelease);
}
}
@injectable()
class VersionManager implements IVersionManager {
@@ -297,9 +250,8 @@ class VersionManager implements IVersionManager {
}
}
export {
DotnetTool,
GitReleaseManagerTool,
GitVersionTool,
VersionManager,
};
container.bind<IVersionManager>(TYPES.IVersionManager).to(VersionManager);
container.bind<IBuildAgent>(TYPES.IBuildAgent).to(BuildAgent);
container.bind<IDotnetTool>(TYPES.IDotnetTool).to(DotnetTool);
export { container };

View File

@@ -1,22 +1,23 @@
import { IBuildAgent, IGitReleaseManagerTool } from "./interfaces";
import { ioc } from "./ioc";
import { SetupOptions, TYPES } from "./types";
import { IDotnetTool, IBuildAgent, TYPES } from "./common";
import { injectable, inject } from "inversify";
const gitReleaseManagerTool = ioc.get<IGitReleaseManagerTool>(TYPES.IGitReleaseManagerTool);
const buildAgent = ioc.get<IBuildAgent>(TYPES.IBuildAgent);
export interface IGitReleaseManagerTool {
install(versionSpec: string, includePrerelease: boolean): Promise<void>;
}
export async function setup() {
try {
@injectable()
export class GitReleaseManagerTool implements IGitReleaseManagerTool {
buildAgent.exportVariable("DOTNET_CLI_TELEMETRY_OPTOUT", "1");
private dotnetTool: IDotnetTool;
const versionSpec = buildAgent.getInput(SetupOptions.versionSpec);
const includePrerelease = buildAgent.getBooleanInput(SetupOptions.includePrerelease);
constructor(
@inject(TYPES.IBuildAgent) buildAgent: IBuildAgent,
@inject(TYPES.IDotnetTool) dotnetTool: IDotnetTool,
) {
this.dotnetTool = dotnetTool;
}
await gitReleaseManagerTool.install(versionSpec, includePrerelease);
buildAgent.setSucceeded("GitVersionManager installed successfully", true);
} catch (error) {
buildAgent.setFailed(error.message, true);
public async install(versionSpec: string, includePrerelease: boolean): Promise<void> {
await this.dotnetTool.toolInstall("GitReleaseManager.Tool", versionSpec, false, includePrerelease);
}
}

View File

@@ -1,102 +1,201 @@
import { IBuildAgent, IGitVersion, IGitVersionOptions, IGitVersionTool } from "./interfaces";
import { ioc } from "./ioc";
import { RunOptions, SetupOptions, TYPES } from "./types";
import { IBuildAgent, IDotnetTool, IExecResult, TYPES } from "./common";
import { injectable, inject } from "inversify";
import path = require("path");
const gitVersionTool = ioc.get<IGitVersionTool>(TYPES.IGitVersionTool);
const buildAgent = ioc.get<IBuildAgent>(TYPES.IBuildAgent);
export async function setup() {
try {
buildAgent.exportVariable("DOTNET_CLI_TELEMETRY_OPTOUT", "1");
const versionSpec = buildAgent.getInput(SetupOptions.versionSpec);
const includePrerelease = buildAgent.getBooleanInput(SetupOptions.includePrerelease);
await gitVersionTool.install(versionSpec, includePrerelease);
buildAgent.setSucceeded("GitVersion installed successfully", true);
} catch (error) {
buildAgent.setFailed(error.message, true);
}
export interface IGitVersionOptions {
targetPath: string;
useConfigFile: boolean;
configFilePath: string;
updateAssemblyInfo: boolean;
updateAssemblyInfoFilename: string;
additionalArguments: string;
srcDir: string;
}
export async function run() {
try {
const inputOptions: IGitVersionOptions = getGitVersionOptions();
export const RunOptions = {
targetPath: "targetPath",
const result = await gitVersionTool.run(inputOptions);
useConfigFile: "useConfigFile",
configFilePath: "configFilePath",
const gitversion = JSON.parse(result.stdout) as IGitVersion;
writeGitVersionToAgent(gitversion);
updateAssemblyInfo: "configFilePath",
updateAssemblyInfoFilename: "configFilePath",
if (result.code === 0) {
buildAgent.setSucceeded("GitVersion executed successfully", true);
additionalArguments: "additionalArguments",
};
export interface IGitVersion {
Major: number;
Minor: number;
Patch: number;
PreReleaseTag: string;
PreReleaseTagWithDash: string;
PreReleaseLabel: string;
PreReleaseNumber: number;
WeightedPreReleaseNumber: number;
BuildMetaData: number;
BuildMetaDataPadded: string;
FullBuildMetaData: string;
MajorMinorPatch: string;
SemVer: string;
LegacySemVer: string;
LegacySemVerPadded: string;
AssemblySemVer: string;
AssemblySemFileVer: string;
FullSemVer: string;
InformationalVersion: string;
BranchName: string;
Sha: string;
ShortSha: string;
NuGetVersionV2: string;
NuGetVersion: string;
NuGetPreReleaseTagV2: string;
NuGetPreReleaseTag: string;
VersionSourceSha: string;
CommitsSinceVersionSource: number;
CommitsSinceVersionSourcePadded: string;
CommitDate: string;
}
export interface IGitVersionTool {
install(versionSpec: string, includePrerelease: boolean): Promise<void>;
run(options: IGitVersionOptions): Promise<IExecResult>;
writeGitVersionToAgent(gitversion: IGitVersion): void;
getGitVersionOptions(): IGitVersionOptions;
}
@injectable()
export class GitVersionTool implements IGitVersionTool {
private buildAgent: IBuildAgent;
private dotnetTool: IDotnetTool;
constructor(
@inject(TYPES.IBuildAgent) buildAgent: IBuildAgent,
@inject(TYPES.IDotnetTool) dotnetTool: IDotnetTool,
) {
this.buildAgent = buildAgent;
this.dotnetTool = dotnetTool;
}
public async install(versionSpec: string, includePrerelease: boolean): Promise<void> {
await this.dotnetTool.toolInstall("GitVersion.Tool", versionSpec, false, includePrerelease);
}
public run(options: IGitVersionOptions): Promise<IExecResult> {
const workDir = this.getRepoDir(options.targetPath);
const args = this.getArguments(workDir, options);
return this.buildAgent.exec("dotnet-gitversion", args);
}
private getRepoDir(targetPath: string): string {
let workDir: string;
const srcDir = this.buildAgent.getSourceDir();
if (!targetPath) {
workDir = srcDir;
} else {
buildAgent.setFailed(result.error.message, true);
if (this.buildAgent.directoryExists(targetPath)) {
workDir = path.join(srcDir, targetPath);
} else {
throw new Error("Directory not found at " + targetPath);
}
}
return workDir.replace(/\\/g, "/");
}
private getArguments(workDir: string, options: IGitVersionOptions): string[] {
const args = [
workDir,
"/output",
"json", // need to use buildserver later
];
const {
useConfigFile,
configFilePath,
updateAssemblyInfo,
updateAssemblyInfoFilename,
additionalArguments,
} = options;
if (useConfigFile) {
if (this.buildAgent.isValidInputFile("configFilePath", configFilePath)) {
args.push("/config", configFilePath);
} else {
throw new Error("GitVersion configuration file not found at " + configFilePath);
}
}
if (updateAssemblyInfo) {
args.push("/updateassemblyinfo");
if (this.buildAgent.isValidInputFile("updateAssemblyInfoFilename", updateAssemblyInfoFilename)) {
args.push(updateAssemblyInfoFilename);
} else {
throw new Error("AssemblyInfoFilename file not found at " + updateAssemblyInfoFilename);
}
}
} catch (error) {
buildAgent.setFailed(error, true);
args.push(additionalArguments);
return args;
}
}
function getGitVersionOptions(): IGitVersionOptions {
public getGitVersionOptions(): IGitVersionOptions {
const targetPath = buildAgent.getInput(RunOptions.targetPath);
const targetPath = this.buildAgent.getInput(RunOptions.targetPath);
const useConfigFile = buildAgent.getBooleanInput(RunOptions.useConfigFile);
const configFilePath = buildAgent.getInput(RunOptions.configFilePath);
const useConfigFile = this.buildAgent.getBooleanInput(RunOptions.useConfigFile);
const configFilePath = this.buildAgent.getInput(RunOptions.configFilePath);
const updateAssemblyInfo = buildAgent.getBooleanInput(RunOptions.updateAssemblyInfo);
const updateAssemblyInfoFilename = buildAgent.getInput(RunOptions.updateAssemblyInfoFilename);
const updateAssemblyInfo = this.buildAgent.getBooleanInput(RunOptions.updateAssemblyInfo);
const updateAssemblyInfoFilename = this.buildAgent.getInput(RunOptions.updateAssemblyInfoFilename);
const additionalArguments = buildAgent.getInput(RunOptions.additionalArguments);
const additionalArguments = this.buildAgent.getInput(RunOptions.additionalArguments);
const srcDir = buildAgent.getSourceDir().replace(/\\/g, "/");
const srcDir = this.buildAgent.getSourceDir().replace(/\\/g, "/");
return {
targetPath,
useConfigFile,
configFilePath,
updateAssemblyInfo,
updateAssemblyInfoFilename,
additionalArguments,
srcDir,
};
}
return {
targetPath,
useConfigFile,
configFilePath,
updateAssemblyInfo,
updateAssemblyInfoFilename,
additionalArguments,
srcDir,
};
}
function writeGitVersionToAgent(gitversion: IGitVersion): void {
public writeGitVersionToAgent(gitversion: IGitVersion): void {
buildAgent.setOutput("major", gitversion.Major.toString());
buildAgent.setOutput("minor", gitversion.Minor.toString());
buildAgent.setOutput("patch", gitversion.Patch.toString());
buildAgent.setOutput("preReleaseTag", gitversion.PreReleaseTag);
buildAgent.setOutput("preReleaseTagWithDash", gitversion.PreReleaseTagWithDash);
buildAgent.setOutput("preReleaseLabel", gitversion.PreReleaseLabel);
buildAgent.setOutput("preReleaseNumber", gitversion.PreReleaseNumber.toString());
buildAgent.setOutput("weightedPreReleaseNumber", gitversion.WeightedPreReleaseNumber.toString());
buildAgent.setOutput("buildMetaData", gitversion.BuildMetaData.toString());
buildAgent.setOutput("buildMetaDataPadded", gitversion.BuildMetaDataPadded);
buildAgent.setOutput("fullBuildMetaData", gitversion.FullBuildMetaData);
buildAgent.setOutput("majorMinorPatch", gitversion.MajorMinorPatch);
buildAgent.setOutput("semVer", gitversion.SemVer);
buildAgent.setOutput("legacySemVer", gitversion.LegacySemVer);
buildAgent.setOutput("legacySemVerPadded", gitversion.LegacySemVerPadded);
buildAgent.setOutput("assemblySemVer", gitversion.AssemblySemVer);
buildAgent.setOutput("assemblySemFileVer", gitversion.AssemblySemFileVer);
buildAgent.setOutput("fullSemVer", gitversion.FullSemVer);
buildAgent.setOutput("informationalVersion", gitversion.InformationalVersion);
buildAgent.setOutput("branchName", gitversion.BranchName);
buildAgent.setOutput("sha", gitversion.Sha);
buildAgent.setOutput("shortSha", gitversion.ShortSha);
buildAgent.setOutput("nuGetVersionV2", gitversion.NuGetVersionV2);
buildAgent.setOutput("nuGetVersion", gitversion.NuGetVersion);
buildAgent.setOutput("nuGetPreReleaseTagV2", gitversion.NuGetPreReleaseTagV2);
buildAgent.setOutput("nuGetPreReleaseTag", gitversion.NuGetPreReleaseTag);
buildAgent.setOutput("versionSourceSha", gitversion.VersionSourceSha);
buildAgent.setOutput("commitsSinceVersionSource", gitversion.CommitsSinceVersionSource.toString());
buildAgent.setOutput("commitsSinceVersionSourcePadded", gitversion.CommitsSinceVersionSourcePadded);
buildAgent.setOutput("commitDate", gitversion.CommitDate);
}
this.buildAgent.setOutput("major", gitversion.Major.toString());
this.buildAgent.setOutput("minor", gitversion.Minor.toString());
this.buildAgent.setOutput("patch", gitversion.Patch.toString());
this.buildAgent.setOutput("preReleaseTag", gitversion.PreReleaseTag);
this.buildAgent.setOutput("preReleaseTagWithDash", gitversion.PreReleaseTagWithDash);
this.buildAgent.setOutput("preReleaseLabel", gitversion.PreReleaseLabel);
this.buildAgent.setOutput("preReleaseNumber", gitversion.PreReleaseNumber.toString());
this.buildAgent.setOutput("weightedPreReleaseNumber", gitversion.WeightedPreReleaseNumber.toString());
this.buildAgent.setOutput("buildMetaData", gitversion.BuildMetaData.toString());
this.buildAgent.setOutput("buildMetaDataPadded", gitversion.BuildMetaDataPadded);
this.buildAgent.setOutput("fullBuildMetaData", gitversion.FullBuildMetaData);
this.buildAgent.setOutput("majorMinorPatch", gitversion.MajorMinorPatch);
this.buildAgent.setOutput("semVer", gitversion.SemVer);
this.buildAgent.setOutput("legacySemVer", gitversion.LegacySemVer);
this.buildAgent.setOutput("legacySemVerPadded", gitversion.LegacySemVerPadded);
this.buildAgent.setOutput("assemblySemVer", gitversion.AssemblySemVer);
this.buildAgent.setOutput("assemblySemFileVer", gitversion.AssemblySemFileVer);
this.buildAgent.setOutput("fullSemVer", gitversion.FullSemVer);
this.buildAgent.setOutput("informationalVersion", gitversion.InformationalVersion);
this.buildAgent.setOutput("branchName", gitversion.BranchName);
this.buildAgent.setOutput("sha", gitversion.Sha);
this.buildAgent.setOutput("shortSha", gitversion.ShortSha);
this.buildAgent.setOutput("nuGetVersionV2", gitversion.NuGetVersionV2);
this.buildAgent.setOutput("nuGetVersion", gitversion.NuGetVersion);
this.buildAgent.setOutput("nuGetPreReleaseTagV2", gitversion.NuGetPreReleaseTagV2);
this.buildAgent.setOutput("nuGetPreReleaseTag", gitversion.NuGetPreReleaseTag);
this.buildAgent.setOutput("versionSourceSha", gitversion.VersionSourceSha);
this.buildAgent.setOutput("commitsSinceVersionSource", gitversion.CommitsSinceVersionSource.toString());
this.buildAgent.setOutput("commitsSinceVersionSourcePadded", gitversion.CommitsSinceVersionSourcePadded);
this.buildAgent.setOutput("commitDate", gitversion.CommitDate);
}
}

View File

@@ -1,96 +0,0 @@
export interface IVersionManager {
isExplicitVersion(versionSpec: string): boolean;
evaluateVersions(versions: string[], versionSpec: string): string;
cleanVersion(version: string): string;
}
export interface IBuildAgent {
agentName: string;
find(toolName: string, versionSpec: string, arch?: string): 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;
setSucceeded(message: string, done?: boolean): void;
exportVariable(name: string, val: string): void;
getVariable(name: string): string;
addPath(inputPath: string): void;
which(tool: string, check?: boolean): Promise<string>;
exec(exec: string, args: string[]): Promise<IExecResult>;
getSourceDir(): string;
isValidInputFile(input: string, file: string): boolean;
fileExists(file: string): boolean;
directoryExists(file: string): boolean;
setOutput(name: string, value: string): void;
getInput(input: string, required?: boolean): string;
getBooleanInput(input: string, required?: boolean): boolean;
}
export interface IDotnetTool {
run(args: string[]): Promise<IExecResult>;
toolInstall(toolName: string, versionSpec: string, checkLatest: boolean, includePre: boolean): Promise<string>;
}
export class Argument {
constructor(public readonly name: string, public readonly value: string) {
}
}
export interface IGitVersionTool {
install(versionSpec: string, includePrerelease: boolean): Promise<void>;
run(options: IGitVersionOptions): Promise<IExecResult>;
}
export interface IGitReleaseManagerTool {
install(versionSpec: string, includePrerelease: boolean): Promise<void>;
}
export interface IExecResult {
stdout: string;
stderr: string;
code: number;
error: Error;
}
export interface IGitVersionOptions {
targetPath: string;
useConfigFile: boolean;
configFilePath: string;
updateAssemblyInfo: boolean;
updateAssemblyInfoFilename: string;
additionalArguments: string;
srcDir: string;
}
export interface IGitVersion {
Major: number;
Minor: number;
Patch: number;
PreReleaseTag: string;
PreReleaseTagWithDash: string;
PreReleaseLabel: string;
PreReleaseNumber: number;
WeightedPreReleaseNumber: number;
BuildMetaData: number;
BuildMetaDataPadded: string;
FullBuildMetaData: string;
MajorMinorPatch: string;
SemVer: string;
LegacySemVer: string;
LegacySemVerPadded: string;
AssemblySemVer: string;
AssemblySemFileVer: string;
FullSemVer: string;
InformationalVersion: string;
BranchName: string;
Sha: string;
ShortSha: string;
NuGetVersionV2: string;
NuGetVersion: string;
NuGetPreReleaseTagV2: string;
NuGetPreReleaseTag: string;
VersionSourceSha: string;
CommitsSinceVersionSource: number;
CommitsSinceVersionSourcePadded: string;
CommitDate: string;
}

View File

@@ -1,16 +0,0 @@
import { Container } from "inversify";
import { BuildAgent } from "../agent/mock/build-agent";
import { DotnetTool, GitReleaseManagerTool, GitVersionTool, VersionManager } from "./common";
import { IBuildAgent, IDotnetTool, IGitReleaseManagerTool, IGitVersionTool, IVersionManager } from "./interfaces";
import { TYPES } from "./types";
const ioc = new Container();
ioc.bind<IVersionManager>(TYPES.IVersionManager).to(VersionManager);
ioc.bind<IBuildAgent>(TYPES.IBuildAgent).to(BuildAgent);
ioc.bind<IDotnetTool>(TYPES.IDotnetTool).to(DotnetTool);
ioc.bind<IGitVersionTool>(TYPES.IGitVersionTool).to(GitVersionTool);
ioc.bind<IGitReleaseManagerTool>(TYPES.IGitReleaseManagerTool).to(GitReleaseManagerTool);
export { ioc };

View File

@@ -1,26 +0,0 @@
const TYPES = {
IBuildAgent: Symbol.for("BuildAgent"),
IDotnetTool: Symbol.for("DotnetTool"),
IGitVersionTool: Symbol.for("GitVersionTool"),
IGitReleaseManagerTool: Symbol.for("GitReleaseManagerTool"),
IVersionManager: Symbol.for("VersionManager"),
};
const SetupOptions = {
includePrerelease: "includePrerelease",
versionSpec: "versionSpec",
};
const RunOptions = {
targetPath: "targetPath",
useConfigFile: "useConfigFile",
configFilePath: "configFilePath",
updateAssemblyInfo: "configFilePath",
updateAssemblyInfoFilename: "configFilePath",
additionalArguments: "additionalArguments",
};
export { SetupOptions, RunOptions, TYPES };

View File

@@ -1,4 +0,0 @@
import "reflect-metadata";
import { run } from "./core/gitversion";
run();

View File

@@ -1,4 +0,0 @@
import "reflect-metadata";
import { setup } from "./core/gitreleasemanager";
setup();

View File

@@ -1,4 +0,0 @@
import "reflect-metadata";
import { setup } from "./core/gitversion";
setup();

View File

@@ -0,0 +1,4 @@
import "reflect-metadata";
import { create } from "./main";
create();

View File

@@ -0,0 +1,34 @@
import { container, IBuildAgent, TYPES, SetupOptions } from "../../core/common";
import { IGitReleaseManagerTool, GitReleaseManagerTool } from "../../core/gitreleasemanager";
container.bind<IGitReleaseManagerTool>(TYPES.IGitReleaseManagerTool).to(GitReleaseManagerTool);
const gitReleaseManagerTool = container.get<IGitReleaseManagerTool>(TYPES.IGitReleaseManagerTool);
const buildAgent = container.get<IBuildAgent>(TYPES.IBuildAgent);
export async function setup() {
try {
buildAgent.exportVariable("DOTNET_CLI_TELEMETRY_OPTOUT", "1");
const versionSpec = buildAgent.getInput(SetupOptions.versionSpec);
const includePrerelease = buildAgent.getBooleanInput(SetupOptions.includePrerelease);
await gitReleaseManagerTool.install(versionSpec, includePrerelease);
buildAgent.setSucceeded("GitVersionManager installed successfully", true);
} catch (error) {
buildAgent.setFailed(error.message, true);
}
}
export async function create() {
try {
buildAgent.exportVariable("DOTNET_CLI_TELEMETRY_OPTOUT", "1");
buildAgent.setSucceeded("GitVersionManager created release successfully", true);
} catch (error) {
buildAgent.setFailed(error.message, true);
}
}

View File

@@ -0,0 +1,4 @@
import "reflect-metadata";
import { setup } from "./main";
setup();

View File

@@ -0,0 +1,4 @@
import "reflect-metadata";
import { run } from "./main";
run();

View File

@@ -0,0 +1,43 @@
import { container, IBuildAgent, TYPES, SetupOptions } from "../../core/common";
import { IGitVersionTool, IGitVersionOptions, IGitVersion, GitVersionTool } from "../../core/gitversion";
container.bind<IGitVersionTool>(TYPES.IGitVersionTool).to(GitVersionTool);
const gitVersionTool = container.get<IGitVersionTool>(TYPES.IGitVersionTool);
const buildAgent = container.get<IBuildAgent>(TYPES.IBuildAgent);
export async function setup() {
try {
buildAgent.exportVariable("DOTNET_CLI_TELEMETRY_OPTOUT", "1");
const versionSpec = buildAgent.getInput(SetupOptions.versionSpec);
const includePrerelease = buildAgent.getBooleanInput(SetupOptions.includePrerelease);
await gitVersionTool.install(versionSpec, includePrerelease);
buildAgent.setSucceeded("GitVersion installed successfully", true);
} catch (error) {
buildAgent.setFailed(error.message, true);
}
}
export async function run() {
try {
const inputOptions: IGitVersionOptions = gitVersionTool.getGitVersionOptions();
const result = await gitVersionTool.run(inputOptions);
const gitversion = JSON.parse(result.stdout) as IGitVersion;
gitVersionTool.writeGitVersionToAgent(gitversion);
if (result.code === 0) {
buildAgent.setSucceeded("GitVersion executed successfully", true);
} else {
buildAgent.setFailed(result.error.message, true);
}
} catch (error) {
buildAgent.setFailed(error, true);
}
}

View File

@@ -0,0 +1,4 @@
import "reflect-metadata";
import { setup } from "./main";
setup();

View File

@@ -8,9 +8,10 @@ module.exports = (env) => {
return {
entry: {
'setup-gitversion': path.resolve(__dirname, 'src/setup-gitversion.ts'),
'setup-gitreleasemanager': path.resolve(__dirname, 'src/setup-gitreleasemanager.ts'),
'execute-gitversion': path.resolve(__dirname, 'src/execute-gitversion.ts'),
'gitversion/setup': path.resolve(__dirname, 'src/tasks/gitversion/setup.ts'),
'gitversion/execute': path.resolve(__dirname, 'src/tasks/gitversion/execute.ts'),
'gitreleasemanager/setup': path.resolve(__dirname, 'src/tasks/gitreleasemanager/setup.ts'),
'gitreleasemanager/create': path.resolve(__dirname, 'src/tasks/gitreleasemanager/create.ts'),
},
target: 'node',
mode: mode,