@dxdeveloperexperience/hygie
Version:
Hygie is an easy-to-use Open-Source REST API allowing you to interact with GIT events. This NestJS API expose a set of customizable rules to automate your project's life cycle.
97 lines (82 loc) • 3.07 kB
text/typescript
import { Runnable } from './runnable.class';
import { RuleResult } from '../rules/ruleResult';
import { CallbackType } from './runnables.service';
import { RunnableDecorator } from './runnable.decorator';
import { Utils } from '../rules/utils';
import { Utils as UtilsGeneral } from '../utils/utils';
import { logger } from '../logger/logger.service';
import { GitApiInfos } from '../git/gitApiInfos';
import { GitTypeEnum } from '../webhook/utils.enum';
import { GitlabService } from '../gitlab/gitlab.service';
import { GithubService } from '../github/github.service';
import { GitTag } from '../git/gitTag';
import { GitRef } from '../git/gitRef';
import { Inject } from '@nestjs/common';
import { Visitor } from 'universal-analytics';
import { EnvVarAccessor } from '../env-var/env-var.accessor';
interface CreateTagArgs {
tag: string;
message: string;
}
/**
* `CreateTagRunnable` creates a Tag Object with custom `tag` name and `message`.
* @warn make sure that the previous rule return a `commitSha`
*/
('CreateTagRunnable')
export class CreateTagRunnable extends Runnable {
constructor(
private readonly githubService: GithubService,
private readonly gitlabService: GitlabService,
('GoogleAnalytics')
private readonly googleAnalytics: Visitor,
private readonly envVarAccessor: EnvVarAccessor,
) {
super();
}
async run(
callbackType: CallbackType,
ruleResult: RuleResult,
args: CreateTagArgs,
): Promise<void> {
const data = ruleResult.data as any;
ruleResult.env = this.envVarAccessor.getAllEnvVar();
const gitApiInfos: GitApiInfos = ruleResult.gitApiInfos;
this.googleAnalytics
.event('Runnable', 'createTag', ruleResult.projectURL)
.send();
const lastItem = Utils.getLastItem(data.commits);
if (typeof lastItem === 'undefined') {
return;
}
const lastSha = lastItem.sha;
const tag = UtilsGeneral.render(args.tag, ruleResult);
const semVerRegexp = new RegExp(
// tslint:disable-next-line:max-line-length
/^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/,
);
if (!semVerRegexp.test(tag)) {
logger.error(`${tag} is not a correct tag name!`, {
location: 'CreateTagRunnable',
});
return;
}
const gitTag = new GitTag();
if (typeof args.message !== 'undefined') {
gitTag.message = UtilsGeneral.render(args.message, ruleResult);
} else {
gitTag.message = 'version ' + tag;
}
gitTag.tag = tag;
gitTag.sha = lastSha;
gitTag.type = 'commit';
if (gitApiInfos.git === GitTypeEnum.Github) {
const gitRef = new GitRef();
const sha = await this.githubService.createTag(gitTag);
gitRef.sha = sha;
gitRef.refName = 'refs/tags/' + gitTag.tag;
this.githubService.createRef(gitRef);
} else if (gitApiInfos.git === GitTypeEnum.Gitlab) {
this.gitlabService.createTag(gitTag);
}
}
}