You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:45:31