azdev-automation
Version:
Azure DevOps automation framework enables access control automation of projects, pipelines and repositories configuration in Azure DevOps Services
76 lines (75 loc) • 3.81 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProjectUpdater = void 0;
const CoreInterfaces_1 = require("azure-devops-node-api/interfaces/CoreInterfaces");
class ProjectUpdater {
constructor(projectHelper, securityHelper, commonHelper, logger) {
this.logger = logger;
this.debugLogger = logger.extend(this.constructor.name);
this.projectHelper = projectHelper;
this.securityHelper = securityHelper;
this.commonHelper = commonHelper;
}
async getProject(name) {
const debug = this.debugLogger.extend(this.getProject.name);
const targetProject = await this.projectHelper.findProject(name);
return targetProject;
}
async getProjects(name) {
const debug = this.debugLogger.extend(this.getProject.name);
const targetProjects = await this.projectHelper.findProjects(name);
return targetProjects;
}
async createProject(project) {
this.logger.log(`Creating new <${project.name}> team project`);
const sourceControlType = "Git";
const projectVisibility = CoreInterfaces_1.ProjectVisibility.Private;
const processTemplate = await this.projectHelper.getDefaultTemplate();
const result = await this.projectHelper.createProject(project.name, project.description, processTemplate, sourceControlType, projectVisibility);
await this.commonHelper.wait(5000, 5000);
const targetProject = await this.projectHelper.findProject(project.name);
return targetProject;
}
async updateProject(project) {
this.logger.log(`Updating existing <${project.name}> team project`);
const targetProject = await this.projectHelper.findProject(project.name);
if (!targetProject) {
throw new Error(`Project <${project.name}> not found`);
}
targetProject.description = project.description;
// Update settings
await this.projectHelper.updateProject(targetProject);
return targetProject;
}
async updatePermissions(project, policy) {
const debug = this.debugLogger.extend(this.updatePermissions.name);
this.logger.log(`Applying <${policy.name}> project permissions policy`);
await Promise.all(policy.definition.map(async (group) => {
const groupName = `[${project.name}]\\${group.name}`;
debug(`Updating <${groupName}> group configuration`);
// Slow down parallel calls to address
// Intermittent API connectivity issues
await this.commonHelper.wait(500, 3000);
let targetGroup = await this.projectHelper.getProjectGroup(groupName, project.id);
// Create group
if (!targetGroup) {
this.logger.log(`Creating new <${groupName}> group`);
targetGroup = await this.projectHelper.createProjectGroup(group.name, "Members of this group have custom access to the project.", project.id);
// It may take up to a few seconds before
// New group identity becomes available
await this.commonHelper.wait(5000, 5000);
}
// Update permissions
if (group.permissions && group.permissions.length) {
this.logger.log(`Updating <${groupName}> group permissions`);
await this.securityHelper.updateGroupPermissions(project.name, targetGroup, group.permissions);
}
// Update members
if (group.members && group.members.length) {
this.logger.log(`Updating <${groupName}> group members`);
await this.securityHelper.updateGroupMembers(group.members, targetGroup);
}
}));
}
}
exports.ProjectUpdater = ProjectUpdater;