# 维护流水线运行时

在开始本节之前,请确保您已阅读 主体流程 章节,了解执行流水线和部署应用的主体流程和相关术语。

流水线运行时定义了用于集成项目的流水线的配置声明,如:流水线配置的存储位置、流水线的触发方式、运行流水线的目标环境等。

支持通过 命令行 和 API 两种方式维护流水线运行时。

# 前提条件

# 创建 access token

您需要创建一个 access token,作为请求 API 的请求头。详情参考 创建 access token

# 导入证书

在使用 HTTPS 协议访问 Nautes API Server 之前,请先导入证书

# 创建产品

流水线运行时归属于项目,而项目归属于产品,您需要创建至少一个产品

# 创建项目

流水线运行时归属于项目,您需要创建至少一个属于指定产品的项目

# 创建代码库

流水线运行时需要监听存储流水线配置的代码库,您需要创建至少一个属于指定项目的代码库

# 创建环境

流水线运行时需要使用关联运行时集群的环境进行项目集成,您需要创建至少一个属于指定产品的环境

# 创建和更新流水线运行时(API)

# 生成创建/更新流水线运行时的 API 请求

通过接口定义 ProjectPipelineRuntime_SaveProjectPipelineRuntime 生成 API 请求示例,并添加 access token 作为请求头。

请求示例如下:

    # $api-server-address 指 Nautes API Server 的访问地址
    # $gitlab-access-token 指 GitLab access token
    # $product-name 指流水线运行时所属产品的名称
    # $project-pipeline-runtime-name 指流水线运行时的名称
    curl -X 'POST' \
        'HTTP://$api-server-address/api/v1/products/$product-name/projectpipelineruntimes/$project-pipeline-runtime-name' \
        -H 'accept: application/json' \
        -H 'Content-Type: application/json' \
        -H 'Authorization: Bearer $gitlab-access-token' \
        -d '{
                "project": "project-demo",
                "pipeline_source": "coderepo-sc-demo",
                "pipelines": [
                    {
                        "name": "pipeline-dev",
                        "label": "dev",
                        "path": "pipelines/dev.yaml"
                    },{
                        "name": "pipeline-main",
                        "label": "main",
                        "path": "pipelines/main.yaml"
                    },{
                        "name": "pipeline-release",
                        "label": "release",
                        "path": "pipelines/release.yaml"
                    }
                ],
                "event_sources": [
                    {
                        "name": "webhook-feature-push",
                        "gitlab": {
                            "repo_name": "coderepo-sc-demo",
                            "revision": "^refs/heads/feature%-",
                            "events": [
                                "push_events"
                            ]
                        }
                    },{
                        "name": "webhook-fix-push",
                        "gitlab": {
                            "repo_name": "coderepo-sc-demo",
                            "revision": "^refs/heads/fix%-",
                            "events": [
                                "push_events"
                            ]
                        }
                    },{
                        "name": "webhook-main-push",
                        "gitlab": {
                            "repo_name": "coderepo-sc-demo",
                            "revision": "refs/heads/main",
                            "events": [
                                "push_events"
                            ]
                        },
                        "calendar": {
                            "schedule": "0 17 * * 1-5" 
                        }
                    },{
                        "name": "webhook-main-tag",
                        "gitlab": {
                            "repo_name": "coderepo-sc-demo",
                            "revision": ".*",
                            "events": [
                                "tag_push_events"
                            ]
                        }
                    }
                ],
                "pipeline_triggers": [
                    {
                        "event_source": "webhook-feature-push",
                        "pipeline": "pipeline-dev"
                    },{
                        "event_source": "webhook-fix-push",
                        "pipeline": "pipeline-dev"
                    },{
                        "event_source": "webhook-main-push",
                        "pipeline": "pipeline-main"
                    },{
                        "event_source": "webhook-main-tag",
                        "pipeline": "pipeline-release"
                    }
                ],
                "destination": "env-dev-demo",
                "isolation": "exclusive"
            }'

请求体中属性的注释如下:

{
    // project 指流水线运行时归属于哪个项目
    "project": "$project-name",
    // pipeline_source 指存储流水线配置的代码库的名称
    "pipeline_source": "$pipeline-coderepo-name",
    // pipelines 主要用于从代码库中获取流水线配置,请至少填写一组数据
    // 支持多分支流水线:如果代码库中有多条分支,流水线运行时将根据 pipelines 获取多个分支的流水线
    // 多分支流水线的示例:一个团队采用主干开发的分支策略,并且源码库中存在主干和多条短周期的功能分支
    // 在开发阶段,开发人员向功能分支推送代码,均触发开发流水线,流水线将执行静态代码检查、编译构建和单元测试等任务
    // 在集成阶段,开发人员提交 MR,该 MR 用于将功能分支向主干合并
    // 如果 MR 审核通过,将触发集成流水线,流水线将执行编译构建、部署和测试等任务
    // 在发布阶段,发布人员基于 main 分支打标签,将触发发布流水线,流水线将向生产态镜像仓库推送生产镜像
    // 为了实现多分支流水线的场景,您需要配置多组 pipeline(参见请求示例)
    "pipelines": [
        {
            // name 用于关联流水线和事件源
            "name": "$pipeline-name",
            // 选填项
            // label 表示流水线运行时给流水线打标签时的标签属性
            "label": "$pipeline-label",
            // path 指流水线配置在代码库中的相对路径,用于查询流水线配置
            "path": "$pipeline-path"
        }
    ],
    // event_sources 指触发流水线的事件源,目前支持 GitLab webhook 和 Calendar
    // 请至少填写一组事件源,每组事件源中至少定义一种类型的事件源
    "event_sources": [
        {
            "name": "$event-source-name",
            // 选填项
            // gitlab 用于生成 GitLab webhook 以触发流水线
            "gitlab": {
                // repo_name 指事件源所属的 Gitlab project 的名称
                "repo_name": "$repo-name",
                // revision 指需要被处理的分支,支持 Lua 正则表达式
                // Lua 正则表达式不同于标准正则表达式
                // 参见:http://lua-users.org/wiki/PatternsTutorial
                "revision": "$repo-revision",
                // events 指触发 webhook 的 Gitlab 事件,例如:push_events,tag_push_events 等
                // 参见:https://docs.gitlab.com/ee/api/projects.html#add-project-hook
                "events": [
                    "$webhook-events"
                ]
            },
            // 选填项
            // calendar 指 calendar 类型的事件源,将定时生成事件来触发流水线
            // 如果使用该类型的事件源,请至少填写“schedule、interval”属性中的一项 
            // 如果两者都被定义了,“schedule”属性的优先级更高
            "calendar": {
                // schedule 指定时调度规则,支持 cron 表达式,参见:https://en.wikipedia.org/wiki/Cron
                "schedule": "$cron-expression",
                // interval 指两个事件之间的时间间隔周期,例如:1s、30m、2h 等
                "interval": "$interval",
                // 选填项
                // exclusion_dates 指 calendar 类型事件源的例外日期和时间,这些时间内将不会触发事件
                // 日期时间格式遵循 ISO8601 格式,参见:https://en.wikipedia.org/wiki/ISO_8601
                "exclusion_dates": [
                    "$exclusion-date"
                ],
                // 选填项
                // timezone 指执行调度的时区,参见:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
                "timezone": "$timezone"
            }
        }
    ],
    // pipeline_triggers 表示待执行的流水线及其触发方式,请至少填写一组数据
    "pipeline_triggers": [
        {
            // event_source 需填写为 event_sources 中 name 的属性值
            "event_source": "$event-source-name",
            // pipeline 需填写为 pipelines 中 name 的属性值
            // 不同事件源可以和相同流水线组成多组数据,表示流水线可以被多个事件触发
            "pipeline": "$pipeline-name",
            // 选填项
            // revision 表示获取流水线配置的分支
            // 如果不填,将根据 event_sources 中 gitlab 的 revision 属性值决定获取流水线配置的分支
            "revision": "$pipeline-revision"
        }
    ],
    // destination 指执行流水线的目标环境
    "destination": "$destination",
    // isolation 指流水线运行时相关资源的隔离性,包括:shared 或者 exclusive
    // shared 表示多个 event_sources 共享资源。例如:当某个 event_source 需要重启时,将影响其他的 event_sources
    // shared 相较于 exclusive 模式,更节省资源
    // exclusive 表示每个 event_sources 独占资源,不同 event_sources 之间资源隔离互不影响
    // exclusive 相较于 shared 模式,将占用更多资源
    "isolation": "$isolation"
}

# 执行创建/更新流水线运行时的 API 请求

使用 curl 命令或者其他工具执行 API 请求,以新增流水线运行时。

请求成功后,将在指定产品的 default.project 代码库中生成流水线运行时的资源文件。流水线运行时的资源文件示例如下:

    apiVersion: nautes.resource.nautes.io/v1alpha1
    kind: ProjectPipelineRuntime
    metadata:
        name: pr-demo
        namespace: product-xxxx
    spec:
        destination: env-dev-demo
        eventSources:
        - gitlab:
            events:
            - push_events
            repoName: repo-3
            revision: ^refs/heads/feature%-
          name: webhook-feature-push
        - gitlab:
            events:
            - push_events
            repoName: repo-3
            revision: ^refs/heads/fix%-
          name: webhook-fix-push
        - calendar:
            schedule: '0 17 * * 1-5'
          gitlab:
            events:
            - push_events
            repoName: repo-3
            revision: refs/heads/main
          name: webhook-main-push
        - gitlab:
            events:
            - tag_push_events
            repoName: repo-3
            revision: .*
          name: webhook-main-tag
        isolation: exclusive
        pipelineSource: repo-3
        pipelineTriggers:
        - eventSource: webhook-feature-push
          pipeline: pipeline-dev
        - eventSource: webhook-fix-push
          pipeline: pipeline-dev
        - eventSource: webhook-main-push
          pipeline: pipeline-main
        - eventSource: webhook-main-tag
          pipeline: pipeline-release
        pipelines:
        - label: dev
          name: pipeline-dev
          path: pipelines/dev.yaml
        - label: main
          name: pipeline-main
          path: pipelines/main.yaml
        - label: release
          name: pipeline-release
          path: pipelines/release.yaml
        project: project-demo

请求 API 更新流水线运行时也将更新流水线运行时的资源文件。

只有当您的账号是 GitLab 的 group 成员,并且具备对 default.project 代码库的 main 分支的写入权限,才可以创建或者更新流水线运行时。

# 删除流水线运行时(API)

# 生成删除流水线运行时的 API 请求

通过接口定义 ProjectPipelineRuntime_DeleteProjectPipelineRuntime 生成 API 请求示例,并添加 access token 作为请求头。

    curl -X 'DELETE' \
        'HTTP://$api-server-address/api/v1/products/$product-name/projectpipelineruntimes/$project-pipeline-runtime-name' \
        -H 'accept: application/json' \
        -H 'Authorization: Bearer $gitlab-access-token'

替换变量后的请求示例如下:

    curl -X 'DELETE' \
        'HTTP://xxx.xxx.xxx.xxx:xxxxx/api/v1/products/nautes-labs/projectpipelineruntimes/pr-demo' \
        -H 'accept: application/json' \
        -H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxx'

# 执行删除流水线运行时的 API 请求

使用 curl 命令或者其他工具执行 API 请求,以删除流水线运行时。

请求成功后,将删除在指定产品的 default.project 代码库中的流水线运行时的资源文件,并且销毁运行时集群中的流水线运行时。

只有当您的账号是 GitLab 的 group 成员,并且具备对 default.project 代码库的 main 分支的写入权限,才可以删除流水线运行时。

# 查询流水线运行时列表(API)

# 生成查询流水线运行时列表的 API 请求

通过接口定义 ProjectPipelineRuntime_ListProjectPipelineRuntimes 生成 API 请求示例,并添加 access token 作为请求头。

    curl -X 'GET' \
        'HTTP://$api-server-address/api/v1/products/$product-name/projectpipelineruntimes' \
        -H 'accept: application/json' \
        -H 'Authorization: Bearer $gitlab-access-token'

替换变量后的请求示例如下:

    curl -X 'GET' \
        'HTTP://xxx.xxx.xxx.xxx:xxxxx/api/v1/products/nautes-labs/projectpipelineruntimes' \
        -H 'accept: application/json' \
        -H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxx'

# 执行查询流水线运行时列表的 API 请求

使用 curl 命令或者其他工具执行 API 请求,以查询流水线运行时列表。流水线运行时列表的返回值示例如下:

{
    "items": [
        {
            "name": "pr-demo",
            "project": "project-demo",
            "pipeline_source": "coderepo-sc-demo",
            "event_sources": [
                {
                    "name": "webhook-feature-push",
                    "gitlab": {
                        "repo_name": "coderepo-sc-demo",
                        "revision": "^refs/heads/feature%-",
                        "events": [
                            "push_events"
                        ]
                    }
                },
                {
                    "name": "webhook-fix-push",
                    "gitlab": {
                        "repo_name": "coderepo-sc-demo",
                        "revision": "^refs/heads/fix%-",
                        "events": [
                            "push_events"
                        ]
                    }
                },
                {
                    "name": "webhook-main-push",
                    "gitlab": {
                        "repo_name": "coderepo-sc-demo",
                        "revision": "refs/heads/main",
                        "events": [
                            "push_events"
                        ]
                    },
                    "calendar": "0 17 * * 1-5"
                },
                {
                    "name": "webhook-main-tag",
                    "gitlab": {
                        "repo_name": "coderepo-sc-demo",
                        "revision": ".*",
                        "events": [
                            "tag_push_events"
                        ]
                    }
                }
            ],
            "pipelines": [
                {
                    "name": "pipeline-dev",
                    "label": "dev",
                    "path": "pipelines/dev.yaml"
                },
                {
                    "name": "pipeline-main",
                    "label": "main",
                    "path": "pipelines/main.yaml"
                },
                {
                    "name": "pipeline-release",
                    "label": "release",
                    "path": "pipelines/release.yaml"
                }
            ],
            "pipeline_triggers": [
                {
                    "event_source": "webhook-feature-push",
                    "pipeline": "pipeline-dev"
                },
                {
                    "event_source": "webhook-fix-push",
                    "pipeline": "pipeline-dev"
                },
                {
                    "event_source": "webhook-main-push",
                    "pipeline": "pipeline-main"
                },
                {
                    "event_source": "webhook-main-tag",
                    "pipeline": "pipeline-release"
                }
            ],
            "destination": "env-dev-demo",
            "isolation": "exclusive"
        }
    ]
}

只有当您的账号是 GitLab 的 group 成员,并且具备对 default.project 代码库的读取权限,才可以查询流水线运行时列表。

# 查看流水线运行时详情(API)

# 生成查看流水线运行时详情的 API 请求

通过接口定义 ProjectPipelineRuntime_GetProjectPipelineRuntime 生成 API 请求示例,并添加 access token 作为请求头。

    curl -X 'GET' \
        'HTTP://$api-server-address/api/v1/products/$product-name/projectpipelineruntimes/$project-pipeline-runtime-name' \
        -H 'accept: application/json' \
        -H 'Authorization: Bearer $gitlab-access-token'

替换变量后的请求示例如下:

    curl -X 'GET' \
        'HTTP://xxx.xxx.xxx.xxx:xxxxx/api/v1/products/nautes-labs/projectpipelineruntimes/pr-demo' \
        -H 'accept: application/json' \
        -H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxx'

# 执行查看流水线运行时详情的 API 请求

使用 curl 命令或者其他工具执行 API 请求,以查看流水线运行时详情。流水线运行时详情的返回值示例与查询流水线运行时列表类似。

只有当您的账号是 GitLab 的 group 成员,并且具备对 default.project 代码库的读取权限,才可以查看流水线运行时详情。

# 强制创建/更新/删除流水线运行时(API)

适用于需要跳过 API 校验的特殊场景,详情参见初始化产品

以创建流水线运行时为例,将 destination 属性设置为不合规的 environment,启用 insecure-skip-check 查询参数并设置其值为 true,可以强制提交流水线运行时的资源文件。请求示例的片段如下:

    curl -X 'POST' \
        'HTTP://xxx.xxx.xxx.xxx:xxxxx/api/v1/products/nautes-labs/projectpipelineruntimes/api-server-pr?insecure-skip-check=true' \
        -H 'accept: application/json' \
        -H 'Content-Type: application/json' \
        -H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxx' \
        -d '{
                "project": "api-server",
                "pipeline-source": "api-server",
                ...
                "destination": "env-invalid",
                "isolation": "shared"
            }'