Xcode Server Bot 未发送电子邮件报告
Xcode Server Bot not sending email reports
我是 运行 Xcode 我本地 iMac 上的服务器机器人,但没有发送电子邮件通知。
我已经学习了很多教程并且 postfix
已经设置好并开始工作了。我可以使用命令成功发送电子邮件
sudo echo "Test sending email from Postfix" | mail -s "Test Postfix" xxxxxx@me.com
我的电子邮件已收到。
在 Xcode
> Preferences
> Server & Bots
> Mail
下,我按照所有教程将所有内容留空。
对于我的机器人,在 Triggers
下我有一个 Periodic Email Report
,Schedule
设置为 After each integration
并设置我的 from
,reply-to
和 To
字段并勾选每个 Notify On
。
我使用命令
监控 smtp
和 smtp
进程
sudo log stream --predicate '(process == "smtpd") || (process == "smtp")' --info
当我使用上述测试发送电子邮件时,我会看到一条日志行。
然而,当我的 Xcode Bot 完成时,我什么也得不到。
Bot 日志显示
Feb 2 13:47:16 [596] <Info>: Executing trigger 'Periodic Email Report'
Feb 2 13:47:16 [596] <Info>: Executing trigger 'New Issue Email'
所以电子邮件报告没有触发任何类型的 smtp
。它甚至使用后缀吗?我可以记录其他内容以查看它是否完全达到 postfix
吗?
编辑 ------
我发现一些 sendmail
日志似乎显示 Xcode 没有使用 postdrop
:
的正确权限
kernel Sandbox: sendmail(48548) deny(1) forbidden-exec-sugid
sendmail fatal: execvp /usr/sbin/postdrop: Operation not permitted
sendmail warning: command "/usr/sbin/postdrop -r" exited with status 1
sendmail fatal: xcode@<redacted>.com(450): unable to execute /usr/sbin/postdrop -r: Undefined error: 0
我的 postdrop
权限与我在网上找到的权限相比似乎是正确的:
-rwxr-xr-x 1 root wheel 570448 1 Jan 2020 postalias
-rwxr-xr-x 1 root wheel 466416 1 Jan 2020 postcat
-rwxr-xr-x 1 root wheel 823488 1 Jan 2020 postconf
-rwxr-sr-x 1 root _postdrop 588624 1 Jan 2020 postdrop
-rwxr-xr-x 1 root wheel 431904 1 Jan 2020 postfix
-rwxr-xr-x 1 root wheel 432032 1 Jan 2020 postkick
-rwxr-xr-x 1 root wheel 449424 1 Jan 2020 postlock
-rwxr-xr-x 1 root wheel 431872 1 Jan 2020 postlog
-rwxr-xr-x 1 root wheel 569632 1 Jan 2020 postmap
-rwxr-xr-x 1 root wheel 465872 1 Jan 2020 postmulti
-rwxr-sr-x 1 root _postdrop 588448 1 Jan 2020 postqueue
-rwxr-xr-x 1 root wheel 466784 1 Jan 2020 postsuper
我的 /etc/group
文件中有 _postdrop
用户:
_postdrop:*:28:
还是我读错了? sendmail
用户是否需要权限才能使用 postdrop
?
编辑 2 ------
这似乎是 Big Sur
使根分区只读的问题。 sudo postfix set-permissions
做不到。
所以我想现在的问题是,如何install/use Xcode 服务器发送电子邮件的不同方法?
我对 Xcode 不是很熟悉,但是您描述的问题显然是 Xcode 应用程序和您的 Postfix SMTP 服务器之间的通信问题。
我会尝试以下操作:
获取Xcode个日志。
- 我在下面找到的 post 说明这可以通过 (a) 使用 Console.app、(b) 通过 Terminal.app 开始 Xcode 或 (c) 来完成检查诊断报告
获取 Postfix 日志。
- 同样,这些可以在 Console.app 中找到,因为它们应该由 ASL(即 macOS 的系统日志)创建
- 此外,您可以指定自己的日志文件,如 Postfix 网站上的文档所述:http://www.postfix.org/MAILLOG_README.html
希望通过这样做,您能够看到您配置的邮件更新是否正在 Xcode 并到达您的 Postfix 服务器。
你的过程是完全正确的,但只有一个例外。正如您所指和日志所说,权限存在问题。
最好通过 rpm -qV postfix
或 postfix check
完整日志共享以深入找出问题,但您已经有一些声明 Xcode 没有权限的日志。
您还可以使用您的电子邮件机器人找出“在 Xcode 报告导航器中管理机器人”。这是 Apple Document.
我认为这可以设置权限:
sudo mkdir -p /Library/Server/Mail/Data/Spool
sudo /usr/sbin/postfix set-permissions
sudo /usr/sbin/postfix start
在 运行 之后清除 postprop 以进行双重检查
$ sudo killall postdrop
编辑1:
或者,如果仍然无效,最好尝试此命令
sudo /etc/init.d/postfix stop
sudo killall -9 postdrop
设置权限:
sudo chown postfix:postdrop /var/spool/postfix/maildrop
sudo chmod 1730 /var/spool/postfix/maildrop
重启后缀:
sudo /etc/init.d/postfix start
在最后阶段,应该会收到这样一封电子邮件:
最终编辑:
我的第一个和 Edit1 答案不适用于 PO。
有一些旧线程表明这可能是不同 MacOS 版本的错误。就后缀而言,Big Sur 似乎存在问题。
经过大量研究、在别处提问和反复试验后,它似乎行不通。在某处,Xcode 服务器没有自动发送电子邮件的正确权限。这可能是 Xcode 服务器甚至 Big Sur 中的错误。
sendmail
本身就很难设置,但是如果您按照许多教程中的建议从命令行让它工作,那么您可以通过一种方法从 Xcode服务器。
经过Apple forums上一位会员的建议,看来使用Post Integration Script
实际上可以直接调用sendmail
。所以我想出了以下脚本:
将其添加为 Post 集成脚本: 将路径更改为您保存以下 2 个文件的位置。
#!/bin/sh
SCRIPT="/Users/darren/Desktop/mail.sh"
echo "Executing script $SCRIPT"
source $SCRIPT
email.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-GB">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>%%XCS_BOT_NAME%%</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<style type="text/css">
a[x-apple-data-detectors] {color: inherit !important;}
</style>
</head>
<body style="margin: 0; padding: 0;">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td style="padding: 20px 0 30px 0;">
<table align="center" border="0" cellpadding="0" cellspacing="0" width="600" style="border-collapse: collapse; border: 1px solid #cccccc;">
<tr>
<td align="center" bgcolor="%%COLOUR%%" style="padding: 40px 0 30px 0;">
Integration #%%XCS_INTEGRATION_NUMBER%% of %%XCS_BOT_NAME%% Bot %%RESULT%%
</td>
</tr>
<tr>
<td bgcolor="#ffffff" style="padding: 40px 30px 40px 30px;">
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;">
<tr>
<td style="color: #153643; font-family: Arial, sans-serif;">
<h1 style="font-size: 24px; margin: 0;">Latest commit</h1>
</td>
</tr>
<tr>
<td style="color: #153643; font-family: Arial, sans-serif; font-size: 16px; line-height: 24px; padding: 20px 0 30px 0;">
<p style="margin: 0;">%%LATESTMERGE%%</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
mail.sh 根据需要编辑 4 个变量。您可能需要 chmod +x mail.sh
此文件。
#!/bin/sh
# Customise these fields
TO_EMAIL="youremail@me.com"
FROM_EMAIL="xcode@whatever_you_setup_in_sendmail.com"
EMAILTEMPLATE=$(</Users/darren/Desktop/email.html) # $(<path/to/email.html) don't forget the < before the path
EMAIL_AFTER_EVERY_INTEGRATION=1 # true=1/false=0 | 0 will only email on failures/warnings
# Result colour
COLOUR='#888881'
if [[ $XCS_INTEGRATION_RESULT == 'warnings' ]] || [[ $XCS_INTEGRATION_RESULT == 'analyzer-warnings' ]]; then
COLOUR='#D9CE1F'
elif [[ $XCS_INTEGRATION_RESULT == 'test-failures' ]] || [[ $XCS_INTEGRATION_RESULT == 'build-errors' ]]; then
COLOUR='#C03636'
elif [[ $XCS_INTEGRATION_RESULT == 'succeeded' ]]; then
if [ $EMAIL_AFTER_EVERY_INTEGRATION == 0 ]; then
exit 0
fi
COLOUR='#83BC39'
elif [[ $XCS_INTEGRATION_RESULT == 'canceled' ]]; then
COLOUR='#888881'
fi
# Result
RESULT="Unknown result ${XCS_INTEGRATION_RESULT}"
if [[ ${XCS_INTEGRATION_RESULT} == "succeeded" ]]; then
RESULT="Succeeded"
elif [[ ${XCS_INTEGRATION_RESULT} == "canceled" ]]; then
RESULT="was Cancelled"
elif [[ ${XCS_INTEGRATION_RESULT} == "warnings" ]]; then
if [[ ${XCS_WARNING_COUNT} == 1 ]]; then
RESULT="Has 1 Warning"
else
RESULT="Has ${XCS_WARNING_COUNT} Warnings"
fi
elif [[ ${XCS_INTEGRATION_RESULT} == "analyzer-warnings" ]]; then
if [[ ${XCS_ANALYZER_WARNING_COUNT} == 1 ]]; then
RESULT="Has 1 Warning"
else
RESULT="Has ${XCS_ANALYZER_WARNING_COUNT} Warnings"
fi
elif [[ ${XCS_INTEGRATION_RESULT} == "test-failures" ]]; then
if [[ ${XCS_TEST_FAILURE_COUNT} == 1 ]]; then
RESULT="Failed 1 Test"
else
RESULT="Failed ${XCS_TEST_FAILURE_COUNT} Tests"
fi
elif [[ ${XCS_INTEGRATION_RESULT} == "build-errors" ]]; then
if [[ ${XCS_ERROR_COUNT} == 1 ]]; then
RESULT="Failed with 1 Error"
else
RESULT="Failed with ${XCS_ERROR_COUNT} Errors"
fi
fi
SUBJECT="$RESULT"
# If not null/empty
if [ -n "${XCS_PRIMARY_REPO_DIR}" ]; then
LATESTMERGE="$(cd $XCS_PRIMARY_REPO_DIR && git log -1)"
else
LATESTMERGE="Invalid repo $XCS_PRIMARY_REPO_DIR"
fi
# Replace contents of email
EMAILTEMPLATE="${EMAILTEMPLATE//%%COLOUR%%/$COLOUR}"
EMAILTEMPLATE="${EMAILTEMPLATE//%%XCS_BOT_NAME%%/${XCS_BOT_NAME}}"
EMAILTEMPLATE="${EMAILTEMPLATE//%%XCS_INTEGRATION_NUMBER%%/${XCS_INTEGRATION_NUMBER}}"
EMAILTEMPLATE="${EMAILTEMPLATE//%%RESULT%%/$RESULT}"
EMAILTEMPLATE="${EMAILTEMPLATE//%%LATESTMERGE%%/$LATESTMERGE}"
# echo $EMAILTEMPLATE
echo "Sending report to $TO_EMAIL"
# Send email directly through sendmail
(
echo "From: $FROM_EMAIL"
echo "To: $TO_EMAIL"
echo "MIME-Version: 1.0"
echo "Subject: $SUBJECT"
echo "Content-Type: text/html"
echo $EMAILTEMPLATE
) | /usr/sbin/sendmail -t
您现在将收到如下电子邮件:
如果有人知道他,我们可以添加实际的失败原因或错误,那会很棒。有一个我们可以使用的变量列表 here,我认为它可能涉及查看实际构建路径。
我是 运行 Xcode 我本地 iMac 上的服务器机器人,但没有发送电子邮件通知。
我已经学习了很多教程并且 postfix
已经设置好并开始工作了。我可以使用命令成功发送电子邮件
sudo echo "Test sending email from Postfix" | mail -s "Test Postfix" xxxxxx@me.com
我的电子邮件已收到。
在 Xcode
> Preferences
> Server & Bots
> Mail
下,我按照所有教程将所有内容留空。
对于我的机器人,在 Triggers
下我有一个 Periodic Email Report
,Schedule
设置为 After each integration
并设置我的 from
,reply-to
和 To
字段并勾选每个 Notify On
。
我使用命令
监控smtp
和 smtp
进程
sudo log stream --predicate '(process == "smtpd") || (process == "smtp")' --info
当我使用上述测试发送电子邮件时,我会看到一条日志行。
然而,当我的 Xcode Bot 完成时,我什么也得不到。 Bot 日志显示
Feb 2 13:47:16 [596] <Info>: Executing trigger 'Periodic Email Report'
Feb 2 13:47:16 [596] <Info>: Executing trigger 'New Issue Email'
所以电子邮件报告没有触发任何类型的 smtp
。它甚至使用后缀吗?我可以记录其他内容以查看它是否完全达到 postfix
吗?
编辑 ------
我发现一些 sendmail
日志似乎显示 Xcode 没有使用 postdrop
:
kernel Sandbox: sendmail(48548) deny(1) forbidden-exec-sugid
sendmail fatal: execvp /usr/sbin/postdrop: Operation not permitted
sendmail warning: command "/usr/sbin/postdrop -r" exited with status 1
sendmail fatal: xcode@<redacted>.com(450): unable to execute /usr/sbin/postdrop -r: Undefined error: 0
我的 postdrop
权限与我在网上找到的权限相比似乎是正确的:
-rwxr-xr-x 1 root wheel 570448 1 Jan 2020 postalias
-rwxr-xr-x 1 root wheel 466416 1 Jan 2020 postcat
-rwxr-xr-x 1 root wheel 823488 1 Jan 2020 postconf
-rwxr-sr-x 1 root _postdrop 588624 1 Jan 2020 postdrop
-rwxr-xr-x 1 root wheel 431904 1 Jan 2020 postfix
-rwxr-xr-x 1 root wheel 432032 1 Jan 2020 postkick
-rwxr-xr-x 1 root wheel 449424 1 Jan 2020 postlock
-rwxr-xr-x 1 root wheel 431872 1 Jan 2020 postlog
-rwxr-xr-x 1 root wheel 569632 1 Jan 2020 postmap
-rwxr-xr-x 1 root wheel 465872 1 Jan 2020 postmulti
-rwxr-sr-x 1 root _postdrop 588448 1 Jan 2020 postqueue
-rwxr-xr-x 1 root wheel 466784 1 Jan 2020 postsuper
我的 /etc/group
文件中有 _postdrop
用户:
_postdrop:*:28:
还是我读错了? sendmail
用户是否需要权限才能使用 postdrop
?
编辑 2 ------
这似乎是 Big Sur
使根分区只读的问题。 sudo postfix set-permissions
做不到。
所以我想现在的问题是,如何install/use Xcode 服务器发送电子邮件的不同方法?
我对 Xcode 不是很熟悉,但是您描述的问题显然是 Xcode 应用程序和您的 Postfix SMTP 服务器之间的通信问题。 我会尝试以下操作:
获取Xcode个日志。
- 我在下面找到的 post 说明这可以通过 (a) 使用 Console.app、(b) 通过 Terminal.app 开始 Xcode 或 (c) 来完成检查诊断报告
获取 Postfix 日志。
- 同样,这些可以在 Console.app 中找到,因为它们应该由 ASL(即 macOS 的系统日志)创建
- 此外,您可以指定自己的日志文件,如 Postfix 网站上的文档所述:http://www.postfix.org/MAILLOG_README.html
希望通过这样做,您能够看到您配置的邮件更新是否正在 Xcode 并到达您的 Postfix 服务器。
你的过程是完全正确的,但只有一个例外。正如您所指和日志所说,权限存在问题。
最好通过 rpm -qV postfix
或 postfix check
完整日志共享以深入找出问题,但您已经有一些声明 Xcode 没有权限的日志。
您还可以使用您的电子邮件机器人找出“在 Xcode 报告导航器中管理机器人”。这是 Apple Document.
我认为这可以设置权限:
sudo mkdir -p /Library/Server/Mail/Data/Spool
sudo /usr/sbin/postfix set-permissions
sudo /usr/sbin/postfix start
在 运行 之后清除 postprop 以进行双重检查
$ sudo killall postdrop
编辑1: 或者,如果仍然无效,最好尝试此命令
sudo /etc/init.d/postfix stop
sudo killall -9 postdrop
设置权限:
sudo chown postfix:postdrop /var/spool/postfix/maildrop
sudo chmod 1730 /var/spool/postfix/maildrop
重启后缀:
sudo /etc/init.d/postfix start
在最后阶段,应该会收到这样一封电子邮件:
最终编辑:
我的第一个和 Edit1 答案不适用于 PO。
有一些旧线程表明这可能是不同 MacOS 版本的错误。就后缀而言,Big Sur 似乎存在问题。
经过大量研究、在别处提问和反复试验后,它似乎行不通。在某处,Xcode 服务器没有自动发送电子邮件的正确权限。这可能是 Xcode 服务器甚至 Big Sur 中的错误。
sendmail
本身就很难设置,但是如果您按照许多教程中的建议从命令行让它工作,那么您可以通过一种方法从 Xcode服务器。
经过Apple forums上一位会员的建议,看来使用Post Integration Script
实际上可以直接调用sendmail
。所以我想出了以下脚本:
将其添加为 Post 集成脚本: 将路径更改为您保存以下 2 个文件的位置。
#!/bin/sh
SCRIPT="/Users/darren/Desktop/mail.sh"
echo "Executing script $SCRIPT"
source $SCRIPT
email.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-GB">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>%%XCS_BOT_NAME%%</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<style type="text/css">
a[x-apple-data-detectors] {color: inherit !important;}
</style>
</head>
<body style="margin: 0; padding: 0;">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td style="padding: 20px 0 30px 0;">
<table align="center" border="0" cellpadding="0" cellspacing="0" width="600" style="border-collapse: collapse; border: 1px solid #cccccc;">
<tr>
<td align="center" bgcolor="%%COLOUR%%" style="padding: 40px 0 30px 0;">
Integration #%%XCS_INTEGRATION_NUMBER%% of %%XCS_BOT_NAME%% Bot %%RESULT%%
</td>
</tr>
<tr>
<td bgcolor="#ffffff" style="padding: 40px 30px 40px 30px;">
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;">
<tr>
<td style="color: #153643; font-family: Arial, sans-serif;">
<h1 style="font-size: 24px; margin: 0;">Latest commit</h1>
</td>
</tr>
<tr>
<td style="color: #153643; font-family: Arial, sans-serif; font-size: 16px; line-height: 24px; padding: 20px 0 30px 0;">
<p style="margin: 0;">%%LATESTMERGE%%</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
mail.sh 根据需要编辑 4 个变量。您可能需要 chmod +x mail.sh
此文件。
#!/bin/sh
# Customise these fields
TO_EMAIL="youremail@me.com"
FROM_EMAIL="xcode@whatever_you_setup_in_sendmail.com"
EMAILTEMPLATE=$(</Users/darren/Desktop/email.html) # $(<path/to/email.html) don't forget the < before the path
EMAIL_AFTER_EVERY_INTEGRATION=1 # true=1/false=0 | 0 will only email on failures/warnings
# Result colour
COLOUR='#888881'
if [[ $XCS_INTEGRATION_RESULT == 'warnings' ]] || [[ $XCS_INTEGRATION_RESULT == 'analyzer-warnings' ]]; then
COLOUR='#D9CE1F'
elif [[ $XCS_INTEGRATION_RESULT == 'test-failures' ]] || [[ $XCS_INTEGRATION_RESULT == 'build-errors' ]]; then
COLOUR='#C03636'
elif [[ $XCS_INTEGRATION_RESULT == 'succeeded' ]]; then
if [ $EMAIL_AFTER_EVERY_INTEGRATION == 0 ]; then
exit 0
fi
COLOUR='#83BC39'
elif [[ $XCS_INTEGRATION_RESULT == 'canceled' ]]; then
COLOUR='#888881'
fi
# Result
RESULT="Unknown result ${XCS_INTEGRATION_RESULT}"
if [[ ${XCS_INTEGRATION_RESULT} == "succeeded" ]]; then
RESULT="Succeeded"
elif [[ ${XCS_INTEGRATION_RESULT} == "canceled" ]]; then
RESULT="was Cancelled"
elif [[ ${XCS_INTEGRATION_RESULT} == "warnings" ]]; then
if [[ ${XCS_WARNING_COUNT} == 1 ]]; then
RESULT="Has 1 Warning"
else
RESULT="Has ${XCS_WARNING_COUNT} Warnings"
fi
elif [[ ${XCS_INTEGRATION_RESULT} == "analyzer-warnings" ]]; then
if [[ ${XCS_ANALYZER_WARNING_COUNT} == 1 ]]; then
RESULT="Has 1 Warning"
else
RESULT="Has ${XCS_ANALYZER_WARNING_COUNT} Warnings"
fi
elif [[ ${XCS_INTEGRATION_RESULT} == "test-failures" ]]; then
if [[ ${XCS_TEST_FAILURE_COUNT} == 1 ]]; then
RESULT="Failed 1 Test"
else
RESULT="Failed ${XCS_TEST_FAILURE_COUNT} Tests"
fi
elif [[ ${XCS_INTEGRATION_RESULT} == "build-errors" ]]; then
if [[ ${XCS_ERROR_COUNT} == 1 ]]; then
RESULT="Failed with 1 Error"
else
RESULT="Failed with ${XCS_ERROR_COUNT} Errors"
fi
fi
SUBJECT="$RESULT"
# If not null/empty
if [ -n "${XCS_PRIMARY_REPO_DIR}" ]; then
LATESTMERGE="$(cd $XCS_PRIMARY_REPO_DIR && git log -1)"
else
LATESTMERGE="Invalid repo $XCS_PRIMARY_REPO_DIR"
fi
# Replace contents of email
EMAILTEMPLATE="${EMAILTEMPLATE//%%COLOUR%%/$COLOUR}"
EMAILTEMPLATE="${EMAILTEMPLATE//%%XCS_BOT_NAME%%/${XCS_BOT_NAME}}"
EMAILTEMPLATE="${EMAILTEMPLATE//%%XCS_INTEGRATION_NUMBER%%/${XCS_INTEGRATION_NUMBER}}"
EMAILTEMPLATE="${EMAILTEMPLATE//%%RESULT%%/$RESULT}"
EMAILTEMPLATE="${EMAILTEMPLATE//%%LATESTMERGE%%/$LATESTMERGE}"
# echo $EMAILTEMPLATE
echo "Sending report to $TO_EMAIL"
# Send email directly through sendmail
(
echo "From: $FROM_EMAIL"
echo "To: $TO_EMAIL"
echo "MIME-Version: 1.0"
echo "Subject: $SUBJECT"
echo "Content-Type: text/html"
echo $EMAILTEMPLATE
) | /usr/sbin/sendmail -t
您现在将收到如下电子邮件:
如果有人知道他,我们可以添加实际的失败原因或错误,那会很棒。有一个我们可以使用的变量列表 here,我认为它可能涉及查看实际构建路径。