如何在Azure DevOps流水线中实现JFrog SSL证书到期智能邮件通知
解决方案
1. 替换证书检查脚本,精准计算剩余有效期
原curl+grep的方式只能拿到到期日期,无法自动判断剩余时间。改用openssl解析证书并计算剩余天数,结果更可靠,还能输出流水线变量供后续步骤使用:
- job: ssl_cert workspace: clean: all pool: name: linux-spoke variables: jfrogUrl: 'myjfrog instance' # 替换为你的JFrog实例地址 warnThresholdDays: 60 # 2个月的天数阈值 steps: - script: | # 获取证书到期时间(UTC格式) expire_date=$(echo | openssl s_client -connect $(jfrogUrl):443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2) # 转换为时间戳以便计算 expire_timestamp=$(date -d "$expire_date" +%s) current_timestamp=$(date +%s) # 计算剩余天数 remaining_days=$(( (expire_timestamp - current_timestamp) / 86400 )) # 将结果写入流水线变量 echo "##vso[task.setvariable variable=remainingDays;]$remaining_days" echo "JFrog SSL证书剩余有效期:$remaining_days 天" # 判断是否触发告警 if [ $remaining_days -le $(warnThresholdDays) ]; then echo "##vso[task.setvariable variable=certificateExpiring;]true" echo "⚠️ 警告:证书将在$remaining_days天后到期" else echo "##vso[task.setvariable variable=certificateExpiring;]false" fi displayName: '检查SSL证书有效期'
2. 设置每周定时执行触发器
在流水线根节点添加schedules配置,指定每周执行的时间(示例为每周一凌晨2点,可按需调整):
trigger: none # 关闭代码提交触发,仅保留定时执行 schedules: - cron: '0 2 * * 1' displayName: 每周一凌晨执行证书检查 branches: include: - main # 替换为你的流水线分支 always: true # 即使没有代码变更也执行检查
3. 配置邮件通知逻辑
3.1 到期告警邮件(仅当剩余天数≤60天时发送)
使用Azure DevOps市场的Send Email扩展(需提前在组织内安装),或者用bash脚本通过SMTP发送:
方式1:使用Send Email任务
- task: SendEmail@1 displayName: '发送证书到期告警邮件' condition: eq(variables.certificateExpiring, 'true') inputs: To: 'admin@yourdomain.com' # 替换为收件人邮箱 Subject: '⚠️ JFrog SSL证书即将到期告警' Body: | <h3>JFrog SSL证书到期告警</h3> <p>实例地址:$(jfrogUrl)</p> <p>剩余有效期:$(remainingDays) 天</p> <p>请及时更新证书,避免影响服务正常运行。</p>
方式2:bash脚本发送(无需扩展)
如果无法安装扩展,可直接用sendmail或curl调用SMTP服务器发送,示例如下(需替换为你的SMTP信息):
- script: | # 构造邮件内容 email_content="Subject: ⚠️ JFrog SSL证书即将到期告警\n\nJFrog实例地址:$(jfrogUrl)\n剩余有效期:$(remainingDays) 天\n请及时更新证书,避免服务受影响。" # 通过SMTP发送(示例用Gmail,需开启应用密码) echo -e "$email_content" | sendmail -S smtp.gmail.com:587 -t admin@yourdomain.com -u your-account@gmail.com -p your-app-password displayName: '发送告警邮件(脚本方式)' condition: eq(variables.certificateExpiring, 'true')
3.2 每周定期汇总邮件
无论证书是否即将到期,每周执行后发送一份检查结果汇总:
- task: SendEmail@1 displayName: '发送每周证书检查汇总邮件' inputs: To: 'admin@yourdomain.com' # 替换为收件人邮箱 Subject: '📅 JFrog SSL证书每周检查汇总' Body: | <h3>JFrog SSL证书每周检查结果</h3> <p>实例地址:$(jfrogUrl)</p> <p>剩余有效期:$(remainingDays) 天</p> <p>状态:$(if [ $(remainingDays) -le $(warnThresholdDays) ]; then echo "⚠️ 即将到期(需处理)"; else echo "✅ 状态正常"; fi)</p>
完整流水线示例
整合所有配置后的完整yaml:
trigger: none schedules: - cron: '0 2 * * 1' displayName: 每周一凌晨执行证书检查 branches: include: - main always: true jobs: - job: ssl_cert workspace: clean: all pool: name: linux-spoke variables: jfrogUrl: 'myjfrog instance' warnThresholdDays: 60 steps: - script: | expire_date=$(echo | openssl s_client -connect $(jfrogUrl):443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2) expire_timestamp=$(date -d "$expire_date" +%s) current_timestamp=$(date +%s) remaining_days=$(( (expire_timestamp - current_timestamp) / 86400 )) echo "##vso[task.setvariable variable=remainingDays;]$remaining_days" echo "JFrog SSL证书剩余有效期:$remaining_days 天" if [ $remaining_days -le $(warnThresholdDays) ]; then echo "##vso[task.setvariable variable=certificateExpiring;]true" echo "⚠️ 警告:证书将在$remaining_days天后到期" else echo "##vso[task.setvariable variable=certificateExpiring;]false" fi displayName: '检查SSL证书有效期' # 告警邮件 - task: SendEmail@1 displayName: '发送证书到期告警邮件' condition: eq(variables.certificateExpiring, 'true') inputs: To: 'admin@yourdomain.com' Subject: '⚠️ JFrog SSL证书即将到期告警' Body: | <h3>JFrog SSL证书到期告警</h3> <p>实例地址:$(jfrogUrl)</p> <p>剩余有效期:$(remainingDays) 天</p> <p>请及时更新证书,避免服务受影响。</p> # 每周汇总邮件 - task: SendEmail@1 displayName: '发送每周证书检查汇总邮件' inputs: To: 'admin@yourdomain.com' Subject: '📅 JFrog SSL证书每周检查汇总' Body: | <h3>JFrog SSL证书每周检查结果</h3> <p>实例地址:$(jfrogUrl)</p> <p>剩余有效期:$(remainingDays) 天</p> <p>状态:$(if [ $(remainingDays) -le $(warnThresholdDays) ]; then echo "⚠️ 即将到期(需处理)"; else echo "✅ 状态正常"; fi)</p>
内容的提问来源于stack exchange,提问作者Vowneee
相关产品推荐
相关产品推荐

