In Yaydoc, I added the feature to show build status of the Pull Request. But there was no way for the user to see the reason for build failure, hence I decided to show the build log in the Pull Request similar to that of TRAVIS CI. For this, I had to save the build log into the database, then use GitHub status API to show the build log url in the Pull Request which redirects to Yaydoc website where we render the build log.
StatusLog.storeLog(name, repositoryName, metadata, `temp/admin@fossasia.org/generate_${uniqueId}.txt`, function(error, data) { if (error) { status = "failure"; } else { targetBranch = `https://${process.env.HOSTNAME}/prstatus/${data._id}` } github.createStatus(commitId, req.body.repository.full_name, status, description, targetBranch, repositoryData.accessToken, function(error, data) { if (error) { console.log(error); } else { console.log(data); } }); });
In the above snippet, I’m storing the build log which is generated from the build script to the mongodb and I’m appending the mongodb unqiueID to the `prstatus` url so that we can use that id to retrieve build log from the database.
exports.createStatus = function(commitId, name, state, description, targetURL, accessToken, callback) { request.post({ url: `https://api.github.com/repos/${name}/statuses/${commitId}`, headers: { 'User-Agent': 'Yaydoc', 'Authorization': 'token ' + crypter.decrypt(accessToken) }, "content-type": "application/json", body: JSON.stringify({ state: state, target_url: targetURL, description: description, context: "Yaydoc CI" }) }, function(error, response, body) { if (error!== null) { return callback({description: 'Unable to create status'}, null); } callback(null, JSON.parse(body)); }); };
After saving the build log, I’m sending the request to GitHub for showing the status of the build along with build log url where user can click the detail link and can see the build log.
Resources: