I have problem using the library octokit for NodeJs.
What I'm trying to do is to loop the boards of a specific Azure DevOps project and create the relative columns and projects on GitHub. The application successfully create the projects, but sometimes the call to create the columns return the following exception:
invalid json response body at https://api.github.com/projects/14101058/columns reason: Unexpected end of JSON input
index.js
function migrateBoards() {
logService.info(`Migrating boards...`);
azureDevOpsService
.getRepos(azdoProject, true, true, false)
.then(async repos => {
logService.verbose(`Found ${repos.length} repos in Azure DevOps project ${azdoProject}: ${repos.map(repo => repo.name)}`);
await azureDevOpsService
.getTeams(azdoProject)
.then(teams => {
logService.verbose(`Found ${teams.length} teams in Azure DevOps project ${azdoProject}`);
teams.map(async team => {
const boards = await azureDevOpsService
.getBoards(team.projectId, team.projectName, team.id, team.name)
.catch(error => {
logService.error(`Error getting boards for team ${team.name}`, error);
});
logService.verbose(`Found ${boards.length} boards in Azure DevOps project ${azdoProject} and team ${team.name}`);
boards.map(async board => {
let boardDetails = await azureDevOpsService
.getBoard(team.projectId, team.projectName, team.id, team.name, board.id)
.catch(e => {
logService.error(`Error getting boards ${board.id} from project ${team.projectName}`, e);
});
let project = null;
if(repos.length > 1) {
logService.verbose(`Checking if project ${team.name} ${boardDetails.name} exists in the GitHub organization ${gitHubOrganizationName}`);
project = await gitHubService
.getProjectForOrganization(gitHubOrganizationName, boardDetails.name)
.catch(error => {
logService.error(`Error creating project ${boardDetails.name}`, error);
});
if(project == null) {
logService.verbose(`Project ${team.name} ${boardDetails.name} does not exist in GitHub. Creating...`);
project = await gitHubService
.createOrgProject(gitHubOrganizationName, `${team.name} ${boardDetails.name}`)
.catch(error => {
logService.error(`Error creating project ${team.name} ${boardDetails.name}`, error);
});
} else {
logService.verbose(`Project ${team.name} ${boardDetails.name} already exists in GitHub. Skipping...`);
return;
}
logService.verbose(`Linking project ${team.name} ${boardDetails.name} to the GitHub repository ${gitHubProject}`);
// TODO: Link repositories to the project
} else {
logService.verbose(`Checking if project ${team.name} exists in the GitHub repository ${gitHubProject}`);
project = await gitHubService
.getProject(gitHubProject, boardDetails.name)
.catch(error => {
logService.error(`Error getting project ${project.name}`, error);
});
if(project == null) {
logService.verbose(`Project ${team.name} does not exist in GitHub. Creating...`);
project = await gitHubService
.createProject(gitHubProject, `${team.name}`)
.catch(error => {
logService.error(`Error creating project ${team.name} ${boardDetails.name}`, error);
});
} else {
logService.verbose(`Project ${team.name} already exists in GitHub. Skipping...`);
return;
}
}
let columns = await gitHubService
.getColumns(project.id)
.catch(e => {
logService.error(`Error getting columns for project ${project.name}`, e);
});
logService.verbose(`Found ${columns.length} columns in GitHub project ${project.name}: ${columns.map(column => column.name)}`);
boardDetails.columns.map(async column => {
if(columns.find(c => c.name == column.name) == null) {
logService.verbose(`Creating a new column in GitHub project ${project.name}: ${column.name}`);
await gitHubService
.createProjectColumn(project.id, column.name)
.catch(error => {
logService.error(`Error creating column ${column.name} in GitHub project ${project.name}`, error);
});
} else {
logService.verbose(`Column ${column.name} already exists in GitHub project ${project.name}. Skipping...`);
}
// TODO create card to each column
});
});
});
})
.catch(error => {
logService.error(`Error getting teams in Azure DevOps project ${azdoProject}`, error);
});
gitHubService.js
async createProjectColumn(projectId, columnName) {
const { data } = await this.octokit.rest.projects.createColumn({
project_id: projectId,
name: columnName
});
return data;
}
Example execution
[Verbose] Creating a new column in GitHub project Project Management Team Backlog items: New
services/logService.js:16
[Verbose] Creating a new column in GitHub project Project Management Team Backlog items: Approved
services/logService.js:16
[Verbose] Creating a new column in GitHub project Project Management Team Backlog items: Committed
services/logService.js:16
[Verbose] Creating a new column in GitHub project Project Management Team Backlog items: Done
services/logService.js:16
[Error] Error creating column In Progress in GitHub project Marketing Team Features: invalid json response body at https://api.github.com/projects/14101052/columns reason: Unexpected end of JSON input
services/logService.js:23
[Error] Error creating column Done in GitHub project Support Team Backlog items: invalid json response body at https://api.github.com/projects/14101051/columns reason: Unexpected end of JSON input
References:
- Doc: https://docs.github.com/en/rest/reference/projects#list-project-columns
- Repository: https://github.com/GTRekter/Apodimo
- Code: index.js - row 187