1

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:

1 Answer 1

1

can you please check the following code? I was testing something similar to what you're mentioning, creating a project column using Octokit, in my case, it's working all the time, I'm not able to reproduce your issue, can you spot any difference from what you're doing in your side?

Create GitHub Project Column                                                                                 View in Fusebit

const owner = 'stack-overflow-demos';
const projectId = 14105747;
const columns = await installationClient.rest.projects.listColumns({ project_id: projectId });
const columnName = 'Test';
const column = columns.data.find(column => column.name === columnName);

if (column) {
  console.log('Column already exists, recreating column . . .');
  await installationClient.rest.projects.deleteColumn({ column_id: column.id });
}
console.log('Creating new column');
const { data } = await installationClient.rest.projects.createColumn({ project_id: projectId, name: columnName });
console.log('Column created', data);

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.