流程大致如下
获取Jenkins的控制台输出
sonarqube结果会打印在jenkins的console中,所以前期把console结果全部以文本发邮件给代码提交者,后面再进行文本提取。
这一步的原理是使用Jenkins Command Line的console命令获取控制台输出结果。需要使用jenkins-cli.jar文件。在Jenkins的节点上不能确保这个文件的存在,所以约定将这个文件放在/opt目录下。
在Sonar分析完成之后,执行以下命令
JENKINS_CLI=/opt/jenkins-cli.jar USERNAME=jenkins PASSWORD=admin echo `java -jar $JENKINS_CLI -s $JENKINS_URL console ${JOB_NAME} $BUILD_ID` --username $USERNAME --password $PASSWORD
在这里可能出现 Failed to authenticate with your SSH keys. Proceeding as anonymous。被这个问题坑了很久,解决方法是将Jenkins节点的ssh key添加至Jenkins的配置中。配置地址为 http://[yourjenkinsserver]/user/[username]/configure
生成SSH公钥:
ssh-keygen -t rsa -C "youremail@example.com"
然后在home目录下看有没有.ssh目录,cat里面的id_rsa.pub文件就能得到公钥了。
发送邮件
git log -1 --pretty=format:"%ce" #获取当前分支最新代码提交者的邮箱
发送邮件这里使用swaks工具,没有安装的使用apt-get或者yum等命令安装。
具体用法 man swaks 里面写得很详细。列几个常用的
swaks --to $CE --from ldeng@example.com --server mail.example.com --tlsc -au sender@example.com -ap [yourpassword] --d "Date: %DATE%\nTo: %TO_ADDRESS%\nFrom: %FROM_ADDRESS%\nSubject: $SUBJECT\nX-Mailer: swaks v$p_version jetmore.org/john/code/swaks/\n%NEW_HEADERS%\n%BODY%\n" --body "$BODY" --header "$HEADER"
一般,配置SMTP服务器会有以下几个参数:host:服务主机,ip服务端口:25是默认端口,465是TLS安全链接的默认端口,用户名,密码。
以上几个参数
--to 收信人的邮箱
--from 发信人的邮箱,用于显示
--server SMTP邮箱地址
--tlsc 使用TLS连接,默认465端口,可以通过--port参数指定其它端口
--au 用户名
--ap 密码
--body 发送邮件的内容
--header 邮件头,依然在正文中
-d -d参数比较复杂,默认是"Date: %DATE%\nTo: %TO_ADDRESS%\nFrom: %FROM_ADDRESS%\nSubject: test %DATE%\nX-Mailer: swaks v$p_version jetmore.org/john/code/swaks/\n%NEW_HEADERS%\n%BODY%\n"
这个值是几个键值对以\n的形式连接起来的,里面的参数都是字面意思,主要要用到的是Subject(主题)这个参数,要是不指定这个发送邮件的主题就是“test日期”。
配置Jenkins发送邮件
点击“增加构建步骤”=>Excute Shell,即可。完整的实例如下:
CE=$(git log -1 --pretty=format:"%ce") #获取收件人的邮箱地址
CN=$(git log -1 --pretty=format:"%cn") #收件人的姓名
SUBJECT="SonarQube Analysis Result Of Your Branch '$BRANCH_NAME' on Project Test"
JENKINS_CLI=/opt/jenkins-cli.jar
USERNAME=jenkins
PASSWORD=admin
BODY=`java -jar $JENKINS_CLI -s $JENKINS_URL console ${JOB_NAME} $BUILD_ID --username $USERNAME --password $PASSWORD`
HEADER="hello,dear $CN"
swaks --to $CE --from ldeng@example.com --server mail.example.com --tlsc -au sender@example.com -ap [yourpassword] --d "Date: %DATE%\nTo: %TO_ADDRESS%\nFrom: %FROM_ADDRESS%\nSubject: $SUBJECT\nX-Mailer: swaks v$p_version jetmore.org/john/code/swaks/\n%NEW_HEADERS%\n%BODY%\n" --body "$BODY" --header "$HEADER"