UNPKG

@timebyping/semantic-release-slack-bot

Version:

A slack bot for semantic-release notifying release statuses

126 lines (109 loc) 3.19 kB
import slackifyMarkdown from 'slackify-markdown' import postMessage from './postMessage.js' import template from './template.js' import truncate from './truncate.js' import getRepoInfo from './getRepoInfo.js' import getConfigToUse from './getConfigToUse.js' import getSlackVars from './getSlackVars.js' // 2900 is the limit for a message block of type 'section'. const MAX_LENGTH = 2900 export default async (pluginConfig, context) => { const { logger, nextRelease, options, env: { SEMANTIC_RELEASE_PACKAGE, npm_package_name } } = context const configToUse = getConfigToUse(pluginConfig, context) const { unsafeMaxLength = MAX_LENGTH, packageName } = configToUse const { slackWebhook, slackToken, slackChannel, slackIcon, slackName } = getSlackVars(configToUse) const package_name = SEMANTIC_RELEASE_PACKAGE || packageName || npm_package_name if (!configToUse.notifyOnSuccess) { logger.log('Notifying on success skipped') return } logger.log('Sending slack notification on success') const repo = getRepoInfo(options.repositoryUrl) let releaseNotes = nextRelease.notes if (configToUse.markdownReleaseNotes) { // Creating slack format from the markdown notes. releaseNotes = slackifyMarkdown(releaseNotes) } // truncate long messages if (unsafeMaxLength > 0) { releaseNotes = truncate(releaseNotes, unsafeMaxLength) } let slackMessage = {} // Override default success message if (configToUse.onSuccessFunction) { slackMessage = configToUse.onSuccessFunction(configToUse, context) } else if (configToUse.onSuccessTemplate) { slackMessage = template(configToUse.onSuccessTemplate, { package_name, npm_package_version: nextRelease.version, repo_path: repo.path, repo_url: repo.URL, release_notes: releaseNotes }) } else { let messageBlocks = [ { type: 'section', text: { type: 'mrkdwn', text: `A new version of \`${package_name}\` has been released!\nCurrent version is *${nextRelease.version}*` } } ] if (releaseNotes !== '') { messageBlocks.push({ type: 'section', text: { type: 'mrkdwn', text: `${releaseNotes}` } }) } slackMessage = { blocks: messageBlocks, text: `A new version of ${package_name} has been released!` } if (repo.path) { const gitTag = nextRelease.gitTag const gitTagPrefix = repo.hostname.startsWith('gitlab') ? '/-/releases/' : '/releases/tag/' const gitTagUrl = repo.URL + gitTagPrefix + gitTag slackMessage.attachments = [ { color: '#2cbe4e', blocks: [ { type: 'context', elements: [ { type: 'mrkdwn', text: `:package: *<${repo.URL}|${repo.path}>:* <${gitTagUrl}|${gitTag}>` } ] } ] } ] } } await postMessage(slackMessage, logger, { slackWebhook, slackChannel, slackToken, slackIcon, slackName }) }