使用预发电子邮件脚本在jenkins中创建日历条目

时间:2015-07-16 16:00:20

标签: groovy jenkins email-ext

我目前正在使用jenkins版本1.617和最新的可编辑电子邮件通知插件。

我们要做的是从构建中获取更改并将其放入会议通知(日历条目)。

我们目前使用莲花笔记8.5.3FP6。

以下是插件中的变量:

Project Recipient List = $SERVER_GROUP
Content Type = HTML(text/html)
Default Subject = $DEFAULT_SUBJECT
Default Content = 

       $DEFAULT_CONTENT

       Repo: myRepo
       Install Location: S:\Build\VAT - Visual Authoring Tool\SERVICELOGIQ  \GM\VAT_${ENV, var="miniVersion"}\VAT_${ENV,  var="releaseversion"}_SERVICELOGIQ [${ENV, var="BUILD_NUMBER"}]

       Change Log: 
       ${CHANGES_SINCE_LAST_SUCCESS, reverse=true, showPaths=true}

我们正在尝试使用以下presend脚本:

import javax.mail.Message
import javax.mail.Message.RecipientType
import javax.mail.Address
import javax.mail.Multipart
import javax.mail.BodyPart
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeMessage
import javax.mail.Session
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeBodyPart
import javax.mail.internet.MimeMessage
import javax.mail.internet.MimeMultipart
import javax.mail.util.ByteArrayDataSource
import java.util.Date
import java.util.Calendar
import java.util.TimeZone
import java.text.DateFormat
import java.text.SimpleDateFormat
import javax.activation.DataHandler
msg.addHeaderLine("method=REQUEST");
msg.addHeaderLine("charset=UTF-8");
msg.addHeaderLine("component=VEVENT");
final Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR, 1);
final Date start = cal.getTime();
cal.add(Calendar.HOUR, 1);
final Date end = cal.getTime();
SimpleDateFormat dateFmt = new SimpleDateFormat("yyyyMMdd'T'hhmmssZ");
String fmtStartDate = dateFmt.format(start);
String fmtEndDate  = dateFmt.format(end);

String subject = msg.getSubject()
Multipart multi = (Multipart)msg.getContent()
BodyPart part = multi.getBodyPart(0)
String body = part.getContent().toString()
String from = "jenkins@ignore.com"
Address[] toAddresses = msg.getAllRecipients()
String to = toAddresses.each{ it.toString() }.join(",")

String content =
            "BEGIN:VCALENDAR\n"+
            "PRODID:-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN\n"+ 
            "VERSION:2.0\n" +
            "METHOD:REQUEST\n" +
            "BEGIN:VEVENT\n" +
            "ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:" + to + "\n" +
            "ORGANIZER:MAILTO:" + from + "\n" +
            "DTSTART:" + fmtStartDate + "\n" +
            "DTEND:" + fmtEndDate + "\n" +
            "LOCATION:Jenkins Build\n" +
            "TRANSP:OPAQUE\n" +
            "SEQUENCE:0\n" +
            "UID:040000008200E00074C5B7101A82E00800000000002FF466CE3AC5010000000000000000100\n" +
            " 000004377FE5C37984842BF9440448399EB02\n" +
            "DTSTAMP:20051206T120102Z\n" +
            "CATEGORIES:Meeting\n" +
            "DESCRIPTION:" + body + "\n\n" +
            "SUMMARY:" + subject + "\n" +
            "PRIORITY:5\n" +
            "CLASS:PUBLIC\n" +
            "BEGIN:VALARM\n" +
            "TRIGGER:PT1440M\n" +
            "ACTION:DISPLAY\n" +
            "DESCRIPTION:Reminder\n" +
            "END:VALARM\n" +
            "END:VEVENT\n" +
            "END:VCALENDAR";

// Create the message part 
MimeBodyPart messageBodyPart = new MimeBodyPart();
// Fill the message 
messageBodyPart.setHeader("Content-Class", "urn:content-classes:calendarmessage");
messageBodyPart.setHeader("Content-ID","calendar_message");
messageBodyPart.setDataHandler(new DataHandler(
                new ByteArrayDataSource(content, "text/calendar")));//very important

// Create a Multipart 
MimeMultipart multipart = new MimeMultipart();
// Add part one 
multipart.addBodyPart(messageBodyPart);
// Put parts in message 
msg.setContent(multipart);

这是我们从这个脚本中理解的,看起来脚本正在接收已经创建的电子邮件,解析值并将其更改为日历条目。但是,当我们运行此脚本时,它会创建日历条目,但只获取电子邮件的默认内容部分中的第一行文本。

以下是创建的电子邮件的示例:

BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN
VERSION:2.0
METHOD:REQUEST
BEGIN:VEVENT
ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:myemail
ORGANIZER:MAILTO:jenkins@ignore.com
DTSTART:20150716T123802-0400
DTEND:20150716T013802-0400
LOCATION:Jenkins Build
TRANSP:OPAQUE
SEQUENCE:0
UID:040000008200E00074C5B7101A82E00800000000002FF466CE3AC5010000000000000000100
 000004377FE5C37984842BF9440448399EB02
DTSTAMP:20051206T120102Z
CATEGORIES:Meeting
DESCRIPTION:Check console output at http://usfhmtsapp09.na.global.mahle:8080/job/Test_Project_Sean2/77/ to view the results.

Repo: http://usnomtsapp01/hg/hgweb.cgi/GM%20ServiceLogiq
Install Location: S:\Build\VAT - Visual Authoring Tool\SERVICELOGIQ\GM\VAT_\VAT__SERVICELOGIQ [77]


Change Log: 
Changes for Build #77
No changes



SUMMARY:Test_Project_Sean2 Build Successful!
PRIORITY:5
CLASS:PUBLIC
BEGIN:VALARM
TRIGGER:PT1440M
ACTION:DISPLAY
DESCRIPTION:Reminder
END:VALARM
END:VEVENT
END:VCALENDAR

我们的实际会议通知显示如下:

  

检查控制台输出   http://servername来   查看结果。   附上上面列出的电子邮件文件。

请注意,输出的行是上面列出的DEFAULT_CONTENT变量。

我们已经尝试过以下方法:

def env = System.getenv()
def version = env['CHANGES_SINCE_LAST_SUCCESS']

但是,这返回了一个NULL值。 我将不胜感激,我们可以帮助解决问题。

1 个答案:

答案 0 :(得分:0)

对于日历文件中描述中的多行,您需要输入转义的\ n而不是真实的换行符。