Jenkins Slack 集成

Jenkins Slack integration

我想使用 Jenkins 中的 Slack 插件将通知 ping 到 Slack 频道。

当我测试连接时 Jenkins 说成功,但我没有在我的 Slack 频道中收到任何通知。

有什么已知问题吗?

如何让 Jenkins 向 Slack 发送通知?

我认为您应该在 Jenkins 中添加 post-build 操作 "Slack Notification"。请看下图

您确定配置正确吗? 在构建配置中(不要忘记#字符)

在常规配置中

将 Jenkins 作业配置为 post 在松弛通道上运行有两个步骤。

  1. 转到 jenkins 作业配置,并在您希望 ping 松弛通道的每个作业上添加一个 post-build 操作。

  1. 接下来,再次在作业配置下,您必须在每个作业上配置您希望在哪些情况下发送松弛通知:(true - false) f.e.

如果您必须配置大量的 Jenkins 作业,您可以只手动配置其中一个并验证它是否正常工作。然后检查此 Jenkins 作业的 config.xml 以查找自动生成的 xml 元素以用于 slack 插件首选项,并使用正则表达式或 xslt 将这些配置应用于所有 Jenkins 作业。 在这种情况下,您必须重新加载 Jenkins 配置才能应用作业配置更新。 ("Manage Jenkins" / "Reload Configuration from Disk")

先决条件:

  • 在 Jenkins 中安装 slack 插件。
  • 在您的松弛域中获取 Jenkins CI 集成令牌。
  • 进入 Jenkins "Manage Jenkins" / "Configure System"。在那里你必须配置 "Global Slack Notifier Setting".

我没有使用 Slack Notification,因为我想自定义 style/state/message,等等。所以我写了一个名为 send_slack_notificationjob。每次我想通知 slack API 我只是在构建后调用这个工作。

这是 "Execute Shell" 中的代码,我使用 curlsedjsawk 来完成这项工作:

# URL to get the built info json
# will get "http://JENKINS_PATH/job/JOB_NAME/97/api/json"
NEW_URL="http://jks_username:jks_password@"$(echo ${BUILD_URL} | sed -r 's/http:\/\///g')"/api/json"

# Cut the JOB_NAME part from BUILD_URL
JOB_NAME=$(echo ${BUILD_URL} | sed -n 's/.*\/job\/\(.*\)\/[0-9].*//p' | sed "s@+@ @g;s@%@\\x@g" | xargs -0 printf "%b")

# Get the built info json
JSON=$(curl $NEW_URL)

STATUS=$(echo $JSON | /usr/local/bin/jsawk "return this.result")
BUILD_INFO=$(echo $JSON | /usr/local/bin/jsawk "return this.displayName")
TIME=$(echo $JSON | /usr/local/bin/jsawk "return this.duration")
TIME=$(echo "scale=4; $TIME/1000" | bc -l)

# Cut the username
USER=$(echo $JSON | /usr/local/bin/jsawk "return this" | sed -n "s/.*Started\ by\ \([^\"]*\).*//p")

# Customize the message sending to slack
TEXT=$JOB_NAME" Built by "$USER", it took "$TIME" seconds."

# Send notification using Slack API
# will send to https://hooks.slack.com/services/BLABLABLA/BLABLABLA
curl -X POST -H 'Content-type: application/json' --data '{"channel": "#production_info","username": "jenkins-bot","icon_emoji": ":lol:","text": "'"$TEXT"' (<'"$BUILD_URL"'|Open>)", "attachments": [{"color": "#36a64f", "fields": [{"title":"UPDATE INFO","value":"'"$BUILD_INFO"'","short":true},{"title":"RESULT","value":"'"$STATUS"'","short":true}]}]}' https://hooks.slack.com/services/BLABLABLA/BLABLABLA/BLABLABLABLABLABLA
import os
import sys
from slacker import Slacker
import base64

def main():
    myPass=sys.argv[1]
    msgStr= sys.argv[2]
    channel = sys.argv[3]

    slack = Slacker(myPass)
    slack.chat.post_message(channel, msgStr)
    print msgStr

if __name__ == '__main__':
    main()    

python slack.py <token> < message str > <#channel>

除了 'failure' 配置中的松弛连接测试,我什么也得不到。我可以使用同一个框中的 python,所以我不知道问题出在哪里,所以我可能只使用这个简单的脚本。

我考虑将它添加到这里是为了社区的更大利益。这就是您获得集成令牌的方式

詹金斯说明

Get a Slack account: https://slack.com/
Configure the Jenkins integration: https://my.slack.com/services/new/jenkins-ci
Install this plugin on your Jenkins server
Configure it in your Jenkins job and add it as a Post-build action.

https://github.com/jenkinsci/slack-plugin

我遇到过类似的问题。

当我取消选中时它对我有用 "is Bot User?"

在控制台中使用 'jenkins' 启动 Jenkins,而不是使用 brew demon。

也许这有帮助:) 你好^__^

如果您想使用 Jenkins 声明式管道接收通知,可以安装 Slack 插件,然后在管道中使用它,方法如下:

    stage('Clone sources') {
        steps {
            slackSend (channel: "#mychannel", color: '#FFFF00', message: "STARTED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
            git credentialsId: 'git_credentials', poll: false, branch: 'develop', url: 'https://mysource.com/mysimplenodejsexample.git'
        }        
    }

结果:

您当然可以自定义消息。完整示例位于:

https://pillsfromtheweb.blogspot.com/2020/05/send-notifications-to-slack-from.html