
# 通过流水线自定义插件把控发版时间
#### 方案概述
自定义插件是流水线中用于实现特定业务逻辑的模块，通过定义输入、脚本、输出，将处理业务逻辑的过程封装为插件，方便在流水线内复用。流水线提供了许多官方插件供用户使用，同时也允许用户配置满足个性化新需求场景的自定义插件。本文介绍如何创建一个图形化自定义插件，用于把控发版时间，并介绍自定义插件内如何使用参数、如何定义和使用输入与输出，结合规则与策略将输出结果用于流水线准出条件。
流水线门禁是指在流水线执行过程中设置的检查点，用于确保只有满足特定条件的情况下，流水线才能继续执行。本文中创建的自定义插件通过与流水线门禁结合，实现对发版时间的控制，即如果手动执行本插件的时间早于安全发版时间，则门禁不通过。
 #### 准备工作
- 已[开通并授权使用CodeArts Pipeline](https://support.huaweicloud.com/usermanual-pipeline/pipeline_01_0033.html)。
- 已通过统一身份认证服务配置"CloudPipeline Tenant Rules FullAccess"、"CloudPipeline Tenant Rule Templates FullAccess"和"CloudPipeline Tenant Extensions FullAccess"系统策略。配置操作可参考[委托其他云服务管理资源](https://support.huaweicloud.com/usermanual-iam/iam_06_0004.html)。
- [新建项目](https://support.huaweicloud.com/qs-projectman/projectman_06_1000.html)（选择"Scrum"模板，命名为"Project_Test"）。
- [新建代码仓库](https://support.huaweicloud.com/usermanual-codeartsrepo/codeartsrepo_03_0077.html)（选择"Java Maven Demo"模板，命名为"Repo_Test"）。
- 基于已创建的代码仓库[新建流水线](https://support.huaweicloud.com/usermanual-pipeline/pipeline_01_0001.html)（模板选择"空模板"，命名为"Pipeline-Test"）。
 
 #### 步骤1：创建自定义插件
1. [登录华为云控制台页面](https://console.huaweicloud.com/console)。
2. 单击页面左上角![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000002515417269.png "点击放大")，在服务列表中选择"开发与运维 \> 流水线 CodeArts Pipeline"。
3. 单击"立即使用"，进入流水线服务首页。
4. 单击顶部导航栏"服务"，在下拉框中选择"扩展插件"，单击进入"扩展插件"页面。
5. 单击![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000002512077893.png "点击放大")，进入"基本信息"页面，参考[表1]填写基本信息。
   
    表1自定义插件基本信息 
   | 配置项  | 取值样例                 | 参数说明                                                            |
   |:---|:---|:---|
   | 图标   | -                    | 插件封面图，不上传将会自动生成系统图标。支持PNG、JPEG、JPG格式，文件大小不超过512KB，建议128\*128px。 |
   | 名称   | Release Time Control | 插件在插件市场和流水线显示的名称。仅支持空格、中文、大小写英文字母、数字、"-"、"_"、"."，长度不超过50字符。     |
   | 唯一标识 | ReleaseTimeControl   | 插件的唯一标识，设置后不可修改。                                                |
   | 插件类型 | 通用                   | 插件的类型。支持构建、代码检查、测试、部署、通用共5种类型，设置后不可修改。                          |
   | 插件描述 | -                    | 描述插件使用方法。                                                       |
      
   
   
6. 配置完基本信息后，单击"下一步"，进入"版本信息"页面，使用默认版本号。
7. 单击"下一步"，进入"输入配置"页面。从左侧组件库拖拽"单行输入"组件到画布中，参考[表2]配置组件信息。
   
    表2组件信息 
   | 配置项类别                                                | 配置项   | 说明                                               |
   |:---|:---|:---|
   | 基本                                                   | 唯一标识  | 输入"safe_release_time"。                           |
   | 基本                                                   | 组件标题  | 输入"安全发版时间"。                                      |
   | 基本                                                   | 提示信息  | 输入"24小时制，最早可发版的时间，例如193000，表示最早可发版的时间为19:30:00"。 |
   | 基本                                                   | 预设提示语 | 输入"24小时制，最早可发版的时间，例如193000"。                     |
   | 校验  | 必填    | 开启。                                              |
   | 校验  | 正则校验  | 输入"\^\\d{6}$"。                                   |
      
   
   
8. 单击"下一步"，进入"插件编排"页面，将鼠标移至"执行shell"插件，单击"添加"。根据以下示例，输入shell命令，生成标签名称。 
   ```
   # 提取安全时间的小时、分钟、秒
   safe_hour="${safe_release_time:0:2}"
   safe_minute="${safe_release_time:2:2}"
   safe_second="${safe_release_time:4:2}"
    
   # 验证时间有效性
   if [[ "$safe_hour" -gt 23 || "$safe_minute" -gt 59 || "$safe_second" -gt 59 ]]; then
       echo "错误：safe_time 包含无效的时间值"
       echo "ALLOW_RELEASE=false"
       exit 1
   fi
    
   # 获取当前时间（24小时制）
   current_time=$(date +%H%M%S)
   current_hour=$(date +%H)
   current_minute=$(date +%M)
   current_second=$(date +%S)
    
   echo "当前时间: $current_time"
   echo "安全时间: $safe_time"
   # PIPELINE_TRIGGER_TYPE 为系统预定义变量
   echo "流水线触发类型: $PIPELINE_TRIGGER_TYPE"
    
   # 判断逻辑
   if [[ "$PIPELINE_TRIGGER_TYPE" != "Manual" ]]; then
       # 自动触发 - 直接允许发版
       echo "自动触发模式，允许发版"
       ALLOW_RELEASE="true"
   else
       echo "手动触发模式，检查当前时间是否在安全发版时间之后..."
       
       # 将时间转换为秒数进行比较
       current_total_seconds=$((10#$current_hour * 3600 + 10#$current_minute * 60 + 10#$current_second))
       safe_total_seconds=$((10#$safe_hour * 3600 + 10#$safe_minute * 60 + 10#$safe_second))
       
       if [[ $current_total_seconds -ge $safe_total_seconds ]]; then
           echo "检查通过：当前时间已到达安全发版时间，允许发版"
           ALLOW_RELEASE="true"
       else
           echo "检查不通过：当前时间未到达安全发版时间，禁止发版"
           ALLOW_RELEASE="false"
       fi
   fi
    
   echo "ALLOW_RELEASE=$ALLOW_RELEASE"
   #将结果输出到插件的任务门禁输出
   echo ::set-metrics var=ALLOW_RELEASE:$ALLOW_RELEASE
   ```
   
   
9. 单击"下一步"，进入"输出信息"页面。单击"新增配置"，参考[表3]填写基本信息。
   
    表3输出配置信息 
   | 配置项  | 取值样例          | 参数说明                                                                 |
   |:---|:---|:---|
   | 标识   | ALLOW_RELEASE | 对应脚本里的输出，通过标识解析输出变量。                                                 |
   | 类型   | metric        | metric类型的输出在任务结果页面的"其他"卡片展示，可用于输出指标解析，输出信息可以在规则中通过该插件进行引用，并最终应用到流水线。 |
   | 描述   | 是否可以发版        | 描述会在配置规则时，展示在阈值配置的检查项。                                               |
   | 分组名称 | 发版时间          | 类别名称。                                                                |
      
   
   
10. 单击右上角"发布草稿"，弹出"插件发布草稿信息确认"弹窗，单击"发布草稿"。
11. 跳转至所创建插件的"版本管理"页面，单击![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000002479918030.png)，将草稿正式发布。
 
#### 步骤2：创建自定义插件对应的规则与策略
1. 单击右上角头像图标，在下拉菜单中选择"租户设置"，进入租户设置页面。
2. 在左侧导航栏选择"策略管理 \> 规则"，进入规则管理页面。
3. 单击"新建规则"，进入"新建规则"页面，参考下图填写规则配置信息。 
   ![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000002512084961.png "点击放大")
   
   
   
4. 单击"确定"，弹出"创建规则成功"提示，完成规则的创建。
5. 单击左侧导航栏"策略管理 \> 策略"，进入策略列表页面。
6. 单击"新建策略"，进入"新建策略"页面，参考下图填写策略配置信息。 
   ![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000002480089278.png "点击放大")
   
   
   
7. 单击"确定"，弹出"创建策略成功"提示，完成策略的创建。
 
 #### 步骤3：在流水线内使用自定义插件与准出策略
1. 单击顶部导航栏"首页"，返回华为云码道首页。
2. 找到[准备工作]中已创建的项目，单击项目名称，进入项目。
3. 在左侧导航栏中单击"持续交付 \> 流水线"，进入项目下流水线列表页面。
4. 找到[准备工作]中已创建好的流水线，单击![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000002480093690.png "点击放大")，单击"编辑"，进入"任务编排"页面。
5. 单击"阶段_1"的"新建任务"，搜索并选择[步骤1]所创建的"Release Time Control"插件，填写插件信息，单击"确定"。
   
   ![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000002480254470.png "点击放大")
   
   
   
6. 单击"阶段_1"下的"准出条件"，弹出"准出条件"侧滑框，将鼠标移动到标准策略准出条件卡片，单击"添加"。
7. 选择[步骤3]所创建的策略，单击"确定"。
8. 单击"保存并执行"，弹出"执行配置"弹窗，保持默认配置，单击"执行"。
9. 完成对自定义插件与策略的执行结果的验证。 
   ![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000002480100056.png "点击放大")
   
   
   
 
