| @@ -3865,6 +3865,48 @@ http://localhost:3000/api/users/ci/cloud_account | jq | |||
| } | |||
| } | |||
| ``` | |||
| ------ | |||
| #### 绑定CI服务器-Trustie提供服务器 | |||
| ``` | |||
| POST /api/users/ci/cloud_account/trustie_bind | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl -X POST \ | |||
| -d "account=xx" \ | |||
| https://localhost:3000/api/users/ci/cloud_account/trustie_bind.json | jq | |||
| ``` | |||
| *请求参数说明:* | |||
| | 参数名 | 必选 | 类型 | 说明 | | |||
| | ------- | ---- | ------ | ---------- | | |||
| | account | 是 | string | 登录用户名 | | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ------------ | ------ | --------------------------------------- | | |||
| | step | int | 0: 未绑定;1: 未认证(已绑定),2: 已认证 | | |||
| | ip | string | ci服务器ip | | |||
| | redirect_url | string | 认证地址 | | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "step": 0, | |||
| "cloud_account": { | |||
| "ip": "xxx.xxx.xxx.x", | |||
| "redirect_url": "http://localhost:3000/login" | |||
| } | |||
| } | |||
| ``` | |||
| --- | |||
| #### 绑定CI服务器 | |||
| @@ -3907,10 +3949,697 @@ https://localhost:3000/api/users/ci/cloud_account/bind.json | jq | |||
| } | |||
| } | |||
| ``` | |||
| ------ | |||
| #### 流水线查询 | |||
| ``` | |||
| GET /api/ci/pipelines/list | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl -X GET \ | |||
| http://localhost:3000/api/ci/pipelines/list.json | jq | |||
| ``` | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ------------- | ------ | ---------------------------------------------- | | |||
| | id | int | 流水线id | | |||
| | pipeline_name | string | 流水线名称 | | |||
| | file_name | string | 流水线文件名 | | |||
| | created_at | string | 创建时间 | | |||
| | stages | arr | 流水线包含的阶段数组(字段详情看阶段查询接口) | | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "pipelines": [ | |||
| { | |||
| "id": 1, | |||
| "pipeline_name": "2020-01-08 流水线", | |||
| "file_name": ".trustie.pipeline.yaml", | |||
| "created_at": "2021-01-08 04:16:24", | |||
| "updated_at": "2021-01-08 04:16:24", | |||
| "stages": [ | |||
| { | |||
| "id": 1, | |||
| "stage_name": "初始化", | |||
| "stage_type": "init", | |||
| "pipeline_id": 1, | |||
| "show_index": 0, | |||
| "created_at": "2021-01-08 04:16:24", | |||
| "updated_at": "2021-01-08 04:16:24" | |||
| }, | |||
| { | |||
| "id": 2, | |||
| "stage_name": "编译构建", | |||
| "stage_type": "build", | |||
| "pipeline_id": 1, | |||
| "show_index": 1, | |||
| "created_at": "2021-01-08 04:16:24", | |||
| "updated_at": "2021-01-11 04:16:24" | |||
| } | |||
| ] | |||
| } | |||
| ] | |||
| } | |||
| ``` | |||
| --- | |||
| #### 流水线新增 | |||
| 点击"新增流水线"按钮时调用。 | |||
| ``` | |||
| POST /api/ci/pipelines | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl --location --request POST 'http://localhost:3000/api/ci/pipelines' \ | |||
| --header 'Content-Type: application/json' \ | |||
| --data-raw ' { | |||
| "pipeline_name": "流水线 2021-01-12", | |||
| "file_name": ".trustie.pipeline.yaml" | |||
| }' | |||
| ``` | |||
| *请求参数说明:* | |||
| | 参数名 | 必选 | 类型 | 说明 | | |||
| | ------------- | ---- | ------ | ---------------------------------------------- | | |||
| | pipeline_name | 是 | string | 流水线名称(默认初始值:流水线 yyyy-mm-dd) | | |||
| | file_name | 是 | string | 文件名称(默认初始值:.trustie.pipeline.yaml) | | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ------- | ------ | ------------ | | |||
| | status | int | 状态码 0成功 | | |||
| | message | string | 返回消息 | | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "status": 0, | |||
| "message": "success" | |||
| } | |||
| ``` | |||
| ------ | |||
| #### 流水线更新 | |||
| 修改流水线名称时调用。 | |||
| ``` | |||
| PUT /api/ci/pipelines/{id} | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl --location --request PUT 'http://localhost:3000/api/ci/pipelines/3' \ | |||
| --header 'Content-Type: application/json' \ | |||
| --data-raw ' { | |||
| "pipeline_name": "2020-01-11 流水线" | |||
| }' | |||
| ``` | |||
| *请求参数说明:* | |||
| | 参数名 | 必选 | 类型 | 说明 | | |||
| | ------------- | ---- | ------ | ---------- | | |||
| | id | 是 | id | 流水线id | | |||
| | pipeline_name | 是 | string | 流水线名称 | | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ------- | ------ | ------------ | | |||
| | status | int | 状态码 0成功 | | |||
| | message | string | 返回消息 | | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "status": 0, | |||
| "message": "success" | |||
| } | |||
| ``` | |||
| ------ | |||
| #### 流水线删除 | |||
| ``` | |||
| DELETE /api/ci/pipelines/{id} | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl -X DELETE \ | |||
| https://localhost:3000/api/ci/pipelines/1 | jq | |||
| ``` | |||
| *请求参数说明:* | |||
| | 参数名 | 必选 | 类型 | 说明 | | |||
| | ------ | ---- | ---- | -------- | | |||
| | id | 是 | int | 流水线id | | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ------- | ------ | ------------ | | |||
| | status | int | 状态码 0成功 | | |||
| | message | string | 返回消息 | | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "status": 0, | |||
| "message": "success" | |||
| } | |||
| ``` | |||
| ------ | |||
| #### 流水线阶段排序 | |||
| 当新增阶段或者删除阶段时重新给受影响的stage设置show_index。 | |||
| ``` | |||
| PUT /api/ci/pipelines/{id}/sort_stage | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl --location --request PUT 'http://localhost:3000/api/ci/pipelines/1/sort_stage.json' \ | |||
| --header 'Content-Type: application/json' \ | |||
| --data-raw ' {"stage_index":[ | |||
| {"id": 1,"show_index": 0}, | |||
| {"id": 2,"show_index": 1}, | |||
| {"id": 3,"show_index": 2}, | |||
| {"id": 4,"show_index": 3}, | |||
| {"id": 7,"show_index": 4} | |||
| ] | |||
| }' | |||
| ``` | |||
| *请求参数说明:* | |||
| | 参数名 | 必选 | 类型 | 说明 | | |||
| | ----------- | ---- | ---- | ---------- | | |||
| | stage_index | 是 | arr | 参数数组 | | |||
| | id | 是 | int | 阶段id | | |||
| | show_index | 是 | int | 阶段的序号 | | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ------- | ------ | ------------ | | |||
| | status | int | 状态码 0成功 | | |||
| | message | string | 返回消息 | | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "status": 0, | |||
| "message": "success" | |||
| } | |||
| ``` | |||
| ------ | |||
| #### 确认阶段流水线内容查询 | |||
| ``` | |||
| GET /api/ci/pipelines/{id}/content | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl -X GET \ | |||
| http://localhost:3000/api/ci/pipelines/1/content.json | jq | |||
| ``` | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ------ | ---- | -------- | | |||
| | id | int | 流水线id | | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "content": "#pipeline \nkind: pipeline\r\nname: maven项目-镜像仓库\r\n\r\nplatform:\r\n os: linux\r\n arch: arm64\nsteps:\n- name: Maven编译\r\n image: arm64v8/maven\r\n commands:\r\n - mvn install\n- name: 编译镜像-推送到仓库\r\n image: plugins/docker\r\n settings:\r\n username: moshenglv\r\n password: RL9UB5P7Jtzukka\r\n repo: docker.io/moshenglv/demo\r\n tags: latest\n" | |||
| } | |||
| ``` | |||
| ------ | |||
| #### 流水线阶段新增 | |||
| ``` | |||
| POST /api/ci/pipelines/{id}/create_stage | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl --location --request POST 'http://localhost:3000/api/ci/pipelines/14/create_stage.json' \ | |||
| --header 'Content-Type: application/json' \ | |||
| --data-raw ' {"stages":[{ | |||
| "stage_name": "新阶段1", | |||
| "stage_type": "customize", | |||
| "show_index": 5 | |||
| }, | |||
| { | |||
| "stage_name": "新阶段2", | |||
| "stage_type": "customize", | |||
| "show_index": 5 | |||
| } | |||
| ] | |||
| }' | |||
| ``` | |||
| *请求参数说明:* | |||
| | 参数名 | 必选 | 类型 | 说明 | | |||
| | ---------- | ---- | ------ | -------------------------------- | | |||
| | stages | 是 | arr | 新增的阶段数组 | | |||
| | id | 是 | int | 流水线id | | |||
| | stage_name | 是 | string | 阶段名称(默认为 阶段名-模板名) | | |||
| | show_index | 是 | int | 阶段排序 | | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ------- | ------ | ------------ | | |||
| | status | int | 状态码 0成功 | | |||
| | message | string | 返回消息 | | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "status": 0, | |||
| "message": "success" | |||
| } | |||
| ``` | |||
| ------ | |||
| #### 流水线阶段更新 | |||
| ``` | |||
| PUT /api/ci/pipelines/{id}/update_stage | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl --location --request PUT 'http://localhost:3000/api/ci/pipelines/1/5/update_stage.json' \ | |||
| --header 'Content-Type: application/json' \ | |||
| --data-raw ' { | |||
| "stage_name": "新阶段-更新", | |||
| "stage_type": "customize", | |||
| "show_index": 10 | |||
| }' | |||
| ``` | |||
| *请求参数说明:* | |||
| | 参数名 | 必选 | 类型 | 说明 | | |||
| | ---------- | ---- | ------ | -------------------------------- | | |||
| | id | 是 | int | 流水线id | | |||
| | stage_name | 是 | string | 阶段名称(默认为 阶段名-模板名) | | |||
| | show_index | 是 | int | 阶段排序 | | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ------- | ------ | ------------ | | |||
| | status | int | 状态码 0成功 | | |||
| | message | string | 返回消息 | | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "status": 0, | |||
| "message": "success" | |||
| } | |||
| ``` | |||
| ------ | |||
| #### 流水线阶段删除 | |||
| ``` | |||
| DELETE /api/ci/pipelines/{id}/{stage_id}/delete_stage | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl -X DELETE \ | |||
| https://localhost:3000/api/ci/pipelines/1/6/delete_stage.json | jq | |||
| ``` | |||
| *请求参数说明:* | |||
| | 参数名 | 必选 | 类型 | 说明 | | |||
| | -------- | ---- | ---- | -------- | | |||
| | id | 是 | int | 流水线id | | |||
| | stage_id | 是 | int | 阶段id | | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ------- | ------ | ------------ | | |||
| | status | int | 状态码 0成功 | | |||
| | message | string | 返回消息 | | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "status": 0, | |||
| "message": "success" | |||
| } | |||
| ``` | |||
| ------ | |||
| #### 流水线阶段步骤查询 | |||
| ``` | |||
| GET /api/ci/pipelines/{id}/{stage_id}/steps.json | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl -X GET \ | |||
| http://localhost:3000/api/ci/pipelines/1/2/steps.json | jq | |||
| ``` | |||
| *请求参数说明:* | |||
| | 参数名 | 必选 | 类型 | 说明 | | |||
| | -------- | ---- | ---- | -------- | | |||
| | id | 是 | int | 流水线id | | |||
| | stage_id | 是 | int | 阶段id | | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ----------- | ------ | ---------- | | |||
| | id | int | 步骤id | | |||
| | step_name | string | 步骤名称 | | |||
| | stage_id | int | 所属阶段id | | |||
| | template_id | int | 模板id | | |||
| | show_index | int | 显示顺序 | | |||
| | content | String | 步骤内容 | | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "steps": [ | |||
| { | |||
| "id": 1, | |||
| "step_name": "编译构建-maven", | |||
| "stage_id": 2, | |||
| "template_id": null, | |||
| "show_index": 0, | |||
| "content": "xxxxxxxxxxx", | |||
| "created_at": "2021-01-11T09:57:17.000+08:00", | |||
| "updated_at": "2021-01-11T09:57:17.000+08:00" | |||
| }, | |||
| { | |||
| "id": 2, | |||
| "step_name": "编译构建-maven-更新", | |||
| "stage_id": 2, | |||
| "template_id": 2, | |||
| "show_index": 2, | |||
| "content": "xxxx====xxxxxxx", | |||
| "created_at": "2021-01-11T10:12:58.000+08:00", | |||
| "updated_at": "2021-01-11T10:40:54.000+08:00" | |||
| } | |||
| ] | |||
| } | |||
| ``` | |||
| ------ | |||
| #### 流水线阶段步骤新增 | |||
| ``` | |||
| POST /api/ci/pipelines/{id}/{stage_id}/create_step | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl --location --request POST 'http://localhost:3000/api/ci/pipelines/14/20/create_step.json' \ | |||
| --header 'Content-Type: application/json' \ | |||
| --data-raw ' {"steps":[{ | |||
| "step_name": "编译构建-gradle", | |||
| "show_index": 1, | |||
| "content": "xxxxxxxxxxx", | |||
| "template_id":1 | |||
| }, | |||
| { | |||
| "step_name": "编译构建-maven", | |||
| "show_index": 1, | |||
| "content": "xxxxxxxxxxx", | |||
| "template_id":1 | |||
| } | |||
| ] | |||
| }' | |||
| ``` | |||
| *请求参数说明:* | |||
| | 参数名 | 必选 | 类型 | 说明 | | |||
| | ----------- | ---- | ------ | ------------------------- | | |||
| | steps | 是 | arr | 需要新增的步骤数组 | | |||
| | id | 是 | int | 流水线id | | |||
| | stage_id | 是 | int | 阶段id | | |||
| | step_name | 是 | string | 阶段名称(阶段名-模板名) | | |||
| | content | 是 | string | 步骤内容 | | |||
| | template_id | 是 | int | 模板id | | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ------- | ------ | ------------ | | |||
| | status | int | 状态码 0成功 | | |||
| | message | string | 返回消息 | | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "status": 0, | |||
| "message": "success" | |||
| } | |||
| ``` | |||
| ------ | |||
| #### 流水线阶段步骤更新 | |||
| ``` | |||
| PUT /api/ci/pipelines/{id}/{stage_id}/update_step | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl --location --request PUT 'http://localhost:3000/api/ci/pipelines/1/2/update_step.json' \ | |||
| --header 'Content-Type: application/json' \ | |||
| --data-raw ' {"steps":[{ | |||
| "id":7, | |||
| "step_name": "编译构建11-gradle", | |||
| "show_index": 1, | |||
| "content": "xxxxxxxxxxx", | |||
| "template_id":2 | |||
| }, | |||
| { | |||
| "id":8, | |||
| "step_name": "编译构建22-maven", | |||
| "show_index": 1, | |||
| "content": "xxxxxxxxxxx", | |||
| "template_id":2 | |||
| } | |||
| ] | |||
| }' | |||
| ``` | |||
| *请求参数说明:* | |||
| | 参数名 | 必选 | 类型 | 说明 | | |||
| | ----------- | ---- | ------ | ------------------------- | | |||
| | steps | 是 | arr | 需要更新step数组 | | |||
| | id | 是 | int | 流水线id | | |||
| | stage_id | 是 | int | 阶段id | | |||
| | step_name | 是 | string | 阶段名称(阶段名-模板名) | | |||
| | content | 是 | string | 步骤内容 | | |||
| | template_id | 是 | int | 模板id | | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ------- | ------ | ------------ | | |||
| | status | int | 状态码 0成功 | | |||
| | message | string | 返回消息 | | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "status": 0, | |||
| "message": "success" | |||
| } | |||
| ``` | |||
| ------ | |||
| #### 流水线阶段步骤删除 | |||
| ``` | |||
| DELETE /api/ci/pipelines/{id}/{stage_id}/{step_id}/delete_step | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl -X DELETE \ | |||
| https://localhost:3000/api/ci/pipelines/1/6/2/delete_stage.json | jq | |||
| ``` | |||
| *请求参数说明:* | |||
| | 参数名 | 必选 | 类型 | 说明 | | |||
| | -------- | ---- | ---- | -------- | | |||
| | id | 是 | int | 流水线id | | |||
| | stage_id | 是 | int | 阶段id | | |||
| | step_id | 是 | int | 步骤id | | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ------- | ------ | ------------ | | |||
| | status | int | 状态码 0成功 | | |||
| | message | string | 返回消息 | | |||
| 返回值 | |||
| ```json | |||
| { | |||
| "status": 0, | |||
| "message": "success" | |||
| } | |||
| ``` | |||
| ------ | |||
| #### 阶段模板查询 | |||
| ``` | |||
| GET /api/ci/templates/templates_by_stage?stage_type={stage_type} | |||
| ``` | |||
| *示例* | |||
| ```bash | |||
| curl -X GET \ | |||
| http://localhost:3000/api/ci/templates/templates_by_stage.json?stage_type=build | jq | |||
| ``` | |||
| *请求参数说明:* | |||
| | 参数名 | 必选 | 类型 | 说明 | | |||
| | ---------- | ---- | ------ | --------------------------------------------- | | |||
| | stage_type | 是 | string | 阶段类型:init/build/deploy/customize/confirm | | |||
| *返回参数说明:* | |||
| | 参数名 | 类型 | 说明 | | |||
| | ------------- | ------ | ---------------- | | |||
| | category | string | 分类名称 | | |||
| | templates | arr | 分类下的模板列表 | | |||
| | id | int | 模板id | | |||
| | template_name | string | 模板名称 | | |||
| | content | String | 模板内容 | | |||
| 返回值 | |||
| ```json | |||
| [ | |||
| { | |||
| "category": "java", | |||
| "templates": [ | |||
| { | |||
| "id": 3, | |||
| "template_name": "maven", | |||
| "stage_type": "build", | |||
| "category": "java", | |||
| "content": "#maven", | |||
| "created_at": "2021-01-11T17:28:34.000+08:00", | |||
| "updated_at": "2021-01-11T17:28:36.000+08:00" | |||
| }, | |||
| { | |||
| "id": 4, | |||
| "template_name": "gradle", | |||
| "stage_type": "build", | |||
| "category": "java", | |||
| "content": "#gradle", | |||
| "created_at": "2021-01-11T17:28:34.000+08:00", | |||
| "updated_at": "2021-01-11T17:28:36.000+08:00" | |||
| } | |||
| ] | |||
| }, | |||
| { | |||
| "category": "c++", | |||
| "templates": [ | |||
| { | |||
| "id": 5, | |||
| "template_name": "make", | |||
| "stage_type": "build", | |||
| "category": "c++", | |||
| "content": "#make", | |||
| "created_at": "2021-01-11T17:29:17.000+08:00", | |||
| "updated_at": "2021-01-11T17:29:18.000+08:00" | |||
| } | |||
| ] | |||
| } | |||
| ] | |||
| ``` | |||
| ------ | |||
| ### 解除CI服务器绑定 | |||
| #### 解除CI服务器绑定 | |||
| ``` | |||
| DELETE /api/users/ci/cloud_account/unbind | |||
| ``` | |||
| @@ -0,0 +1,175 @@ | |||
| class Ci::PipelinesController < ApplicationController | |||
| # ======流水线相关接口========== # | |||
| def list | |||
| @pipelines = Ci::Pipeline.all | |||
| end | |||
| def create | |||
| ActiveRecord::Base.transaction do | |||
| pipeline = Ci::Pipeline.new(pipeline_name: params[:pipeline_name], file_name: params[:file_name]) | |||
| pipeline.save! | |||
| # 默认创建四个初始阶段 | |||
| init_stages = Ci::PipelineStage::INIT_STAGES | |||
| index = 0 | |||
| init_stages.each do |type, name| | |||
| pipeline.pipeline_stages.build( | |||
| stage_name: name, | |||
| stage_type: type, | |||
| show_index: index | |||
| ).save! | |||
| index += 1 | |||
| end | |||
| render_ok | |||
| end | |||
| rescue Exception => ex | |||
| render_error(ex.message) | |||
| end | |||
| def update | |||
| pipeline = Ci::Pipeline.find(params[:id]) | |||
| if pipeline | |||
| pipeline.update!(pipeline_name: params[:pipeline_name]) | |||
| end | |||
| render_ok | |||
| rescue Exception => ex | |||
| render_error(ex.message) | |||
| end | |||
| def destroy | |||
| pipeline = Ci::Pipeline.find(params[:id]) | |||
| if pipeline | |||
| pipeline.destroy! | |||
| end | |||
| render_ok | |||
| rescue Exception => ex | |||
| render_error(ex.message) | |||
| end | |||
| def content | |||
| @yaml = "#pipeline \n" | |||
| stages = Ci::Pipeline.find(params[:id]).pipeline_stages | |||
| if stages && !stages.empty? | |||
| init_step = stages.first.pipeline_stage_steps.first | |||
| @yaml += init_step.content + "\n" + "steps:\n" | |||
| stages = stages.slice(1, stages.size - 1) | |||
| unless stages.empty? | |||
| stages.each do |stage| | |||
| steps = stage.pipeline_stage_steps | |||
| next unless steps && !steps.empty? | |||
| steps.each do |step| | |||
| @yaml += step.content + "\n" | |||
| end | |||
| end | |||
| end | |||
| end | |||
| end | |||
| # =========阶段相关接口========= # | |||
| def stages | |||
| pipeline_id = params[:id] | |||
| @pipeline_stages = Ci::PipelineStage.where('pipeline_id=?', pipeline_id).order('show_index asc') | |||
| end | |||
| def create_stage | |||
| ActiveRecord::Base.transaction do | |||
| stages = params[:stages] | |||
| unless stages.empty? | |||
| stages.each do |stage| | |||
| pipeline_stage = Ci::PipelineStage.new(stage_name: stage[:stage_name], | |||
| stage_type: stage[:stage_type].blank? ? 'customize' : stage[:stage_type], | |||
| pipeline_id: params[:id], show_index: stage[:show_index]) | |||
| pipeline_stage.save! | |||
| end | |||
| end | |||
| render_ok | |||
| end | |||
| rescue Exception => ex | |||
| render_error(ex.message) | |||
| end | |||
| def update_stage | |||
| pipeline_stage = Ci::PipelineStage.find(params[:stage_id]) | |||
| if pipeline_stage | |||
| pipeline_stage.update!(stage_name: params[:stage_name], show_index: params[:show_index]) | |||
| end | |||
| render_ok | |||
| rescue Exception => ex | |||
| render_error(ex.message) | |||
| end | |||
| def delete_stage | |||
| pipeline_stage = Ci::PipelineStage.find(params[:stage_id]) | |||
| if pipeline_stage | |||
| pipeline_stage.destroy! | |||
| end | |||
| render_ok | |||
| rescue Exception => ex | |||
| render_error(ex.message) | |||
| end | |||
| def sort_stage | |||
| stages = params[:stage_index] | |||
| if stages && !stages.empty? | |||
| stages.each do |stage| | |||
| pipeline_stage = Ci::PipelineStage.find(stage[:id]) | |||
| if pipeline_stage | |||
| pipeline_stage.update!(show_index: stage[:show_index]) | |||
| end | |||
| end | |||
| end | |||
| render_ok | |||
| rescue Exception => ex | |||
| render_error(ex.message) | |||
| end | |||
| # ========步骤相关接口========= # | |||
| def steps | |||
| @pipeline_stage_steps = Ci::PipelineStageStep.where('stage_id=?', params[:stage_id]).order('show_index asc') | |||
| end | |||
| def create_stage_step | |||
| ActiveRecord::Base.transaction do | |||
| steps = params[:steps] | |||
| unless steps.empty? | |||
| steps.each do |step| | |||
| step = Ci::PipelineStageStep.new(step_name: step[:step_name], stage_id: params[:stage_id], | |||
| template_id: step[:template_id], content: step[:content], show_index: step[:show_index]) | |||
| step.save! | |||
| end | |||
| end | |||
| render_ok | |||
| end | |||
| rescue Exception => ex | |||
| render_error(ex.message) | |||
| end | |||
| def update_stage_step | |||
| ActiveRecord::Base.transaction do | |||
| steps = params[:steps] | |||
| unless steps.empty? | |||
| steps.each do |step| | |||
| pipeline_stage_step = Ci::PipelineStageStep.find(step[:id]) | |||
| if pipeline_stage_step | |||
| pipeline_stage_step.update(step_name: step[:step_name], content: step[:content], | |||
| show_index: step[:show_index], template_id: step[:template_id]) | |||
| end | |||
| end | |||
| end | |||
| render_ok | |||
| end | |||
| rescue Exception => ex | |||
| render_error(ex.message) | |||
| end | |||
| def delete_stage_step | |||
| pipeline_stage_step = Ci::PipelineStageStep.find(params[:step_id]) | |||
| if pipeline_stage_step | |||
| pipeline_stage_step.destroy! | |||
| end | |||
| render_ok | |||
| rescue Exception => ex | |||
| render_error(ex.message) | |||
| end | |||
| end | |||
| @@ -0,0 +1,26 @@ | |||
| class Ci::TemplatesController < ApplicationController | |||
| def list | |||
| @templates = Ci::Template.all | |||
| end | |||
| def templates_by_stage | |||
| stage_type = params[:stage_type] | |||
| @templates = Ci::Template.where("stage_type = ?", stage_type) | |||
| #根据模板类别分组 | |||
| @category_templates = @templates.group_by{ |template| template.category } | |||
| end | |||
| def create | |||
| template = Ci::Template.new(template_name: params[:template_name], | |||
| stage_type: params[:stage_type], | |||
| category: params[:category], | |||
| content: params[:content] | |||
| ) | |||
| template.save! | |||
| render_ok | |||
| rescue Exception => ex | |||
| render_error(ex.message) | |||
| end | |||
| end | |||
| @@ -0,0 +1,19 @@ | |||
| # == Schema Information | |||
| # | |||
| # Table name: ci_pipelines | |||
| # | |||
| # id :integer not null, primary key | |||
| # pipeline_name :string(255) not null | |||
| # pipeline_status :integer default("0"), not null | |||
| # file_name :string(255) not null | |||
| # created_at :datetime not null | |||
| # updated_at :datetime not null | |||
| # | |||
| class Ci::Pipeline < Ci::LocalBase | |||
| validates :pipeline_name, presence: {message: "流水线名称不能为空"} | |||
| validates :file_name, presence: {message: "流水线文件名称不能为空"} | |||
| has_many :pipeline_stages, -> { reorder(show_index: :asc) }, foreign_key: "pipeline_id", :class_name => 'Ci::PipelineStage', dependent: :destroy | |||
| end | |||
| @@ -0,0 +1,24 @@ | |||
| # == Schema Information | |||
| # | |||
| # Table name: ci_pipeline_stages | |||
| # | |||
| # id :integer not null, primary key | |||
| # stage_name :string(255) not null | |||
| # stage_type :string(255) not null | |||
| # pipeline_id :integer not null | |||
| # show_index :integer default("0"), not null | |||
| # created_at :datetime not null | |||
| # updated_at :datetime not null | |||
| # | |||
| class Ci::PipelineStage < Ci::LocalBase | |||
| validates :stage_name, presence: {message: "阶段名称不能为空"} | |||
| validates :stage_type, presence: {message: "阶段类型不能为空"} | |||
| belongs_to :pipeline, foreign_key: :pipeline_id, :class_name => 'Ci::Pipeline' | |||
| has_many :pipeline_stage_steps, -> { reorder(show_index: :asc) }, foreign_key: "stage_id", :class_name => 'Ci::PipelineStageStep', dependent: :destroy | |||
| INIT_STAGES = {init:"初始化", build:"编译构建", deploy:"部署", confirm:"确认"}.freeze | |||
| end | |||
| @@ -0,0 +1,22 @@ | |||
| # == Schema Information | |||
| # | |||
| # Table name: ci_pipeline_stage_steps | |||
| # | |||
| # id :integer not null, primary key | |||
| # step_name :string(255) not null | |||
| # stage_id :integer not null | |||
| # template_id :integer | |||
| # content :text(65535) | |||
| # show_index :integer | |||
| # created_at :datetime not null | |||
| # updated_at :datetime not null | |||
| # | |||
| class Ci::PipelineStageStep < Ci::LocalBase | |||
| validates :step_name, presence: {message: "步骤名称不能为空"} | |||
| validates :stage_id, presence: {message: "阶段id不能为空"} | |||
| belongs_to :pipeline_stage, foreign_key: :stage_id, :class_name => 'Ci::PipelineStage' | |||
| has_one :template, :class_name => 'Ci::Template', foreign_key: :template_id | |||
| end | |||
| @@ -0,0 +1,22 @@ | |||
| # == Schema Information | |||
| # | |||
| # Table name: ci_templates | |||
| # | |||
| # id :integer not null, primary key | |||
| # template_name :string(255) not null | |||
| # stage_type :string(255) not null | |||
| # category :string(255) not null | |||
| # content :text(65535) not null | |||
| # created_at :datetime not null | |||
| # updated_at :datetime not null | |||
| # | |||
| # Indexes | |||
| # | |||
| # index_ci_templates_on_stage_type (stage_type) | |||
| # | |||
| class Ci::Template < Ci::LocalBase | |||
| validates :template_name, presence: {message: "模板名称不能为空"} | |||
| validates :stage_type, presence: {message: "阶段类型不能为空"} | |||
| validates :category, presence: {message: "模板类型不能为空"} | |||
| end | |||
| @@ -0,0 +1,9 @@ | |||
| json.id pipeline_stage_step.id | |||
| json.step_name pipeline_stage_step.step_name | |||
| json.stage_id pipeline_stage_step.stage_id | |||
| json.template_id pipeline_stage_step.template_id | |||
| json.show_index pipeline_stage_step.show_index | |||
| json.content pipeline_stage_step.content | |||
| json.created_at pipeline_stage_step.created_at | |||
| json.updated_at pipeline_stage_step.updated_at | |||
| @@ -0,0 +1,8 @@ | |||
| json.id pipeline_stage.id | |||
| json.stage_name pipeline_stage.stage_name | |||
| json.stage_type pipeline_stage.stage_type | |||
| json.pipeline_id pipeline_stage.pipeline_id | |||
| json.show_index pipeline_stage.show_index | |||
| json.created_at pipeline_stage.created_at | |||
| json.updated_at pipeline_stage.updated_at | |||
| @@ -0,0 +1,9 @@ | |||
| json.id pipeline.id | |||
| json.pipeline_name pipeline.pipeline_name | |||
| json.pipeline_status pipeline.pipeline_status | |||
| json.file_name pipeline.file_name | |||
| json.created_at pipeline.created_at | |||
| json.updated_at pipeline.updated_at | |||
| json.stages pipeline.pipeline_stages do |pipeline_stage| | |||
| json.partial! "/ci/pipeline_stages/list", pipeline_stage: pipeline_stage | |||
| end | |||
| @@ -0,0 +1 @@ | |||
| json.content @yaml | |||
| @@ -0,0 +1,3 @@ | |||
| json.pipelines @pipelines do |pipeline| | |||
| json.partial! "/ci/pipelines/list", pipeline: pipeline | |||
| end | |||
| @@ -0,0 +1,3 @@ | |||
| json.stages @pipeline_stages do |pipeline_stage| | |||
| json.partial! "/ci/pipeline_stages/list", pipeline_stage: pipeline_stage | |||
| end | |||
| @@ -0,0 +1,3 @@ | |||
| json.steps @pipeline_stage_steps do |pipeline_stage_step| | |||
| json.partial! "/ci/pipeline_stage_steps/list", pipeline_stage_step: pipeline_stage_step | |||
| end | |||
| @@ -0,0 +1,8 @@ | |||
| json.id template.id | |||
| json.template_name template.template_name | |||
| json.stage_type template.stage_type | |||
| json.category template.category | |||
| json.content template.content | |||
| json.created_at template.created_at | |||
| json.updated_at template.updated_at | |||
| @@ -0,0 +1,4 @@ | |||
| json.category category | |||
| json.templates templates do |template| | |||
| json.partial! "/ci/templates/list", template: template | |||
| end | |||
| @@ -0,0 +1,3 @@ | |||
| json.templates @templates do |template| | |||
| json.partial! "/ci/templates/list", template: template | |||
| end | |||
| @@ -0,0 +1,3 @@ | |||
| json.array! @category_templates do |category, templates| | |||
| json.partial! "/ci/templates/templates_by_stage", category: category, templates: templates | |||
| end | |||
| @@ -31,6 +31,31 @@ Rails.application.routes.draw do | |||
| end | |||
| end | |||
| resources :templates, only: [:list,:templates_by_stage,:create] do | |||
| collection do | |||
| get :list | |||
| get :templates_by_stage | |||
| end | |||
| end | |||
| resources :pipelines do | |||
| collection do | |||
| get :list | |||
| end | |||
| member do | |||
| get :content | |||
| get :stages | |||
| post :create_stage | |||
| put :sort_stage | |||
| delete :delete_stage, :path => ":stage_id/delete_stage", to: 'pipelines#delete_stage' | |||
| put :update_stage, :path => ":stage_id/update_stage", to: 'pipelines#update_stage' | |||
| get :stage_steps, :path => ":stage_id/steps", to: 'pipelines#steps' | |||
| post :create_stage_step, :path => ":stage_id/create_step", to: 'pipelines#create_stage_step' | |||
| delete :delete_stage_step, :path => ":stage_id/:step_id/delete_step", to: 'pipelines#delete_stage_step' | |||
| put :update_stage_step, :path => ":stage_id/update_step", to: 'pipelines#update_stage_step' | |||
| end | |||
| end | |||
| # resources :repos, only: :index do | |||
| # collection do | |||
| # get 'get_trustie_pipeline', to: 'builds#get_trustie_pipeline', as: 'get_trustie_pipeline' | |||
| @@ -0,0 +1,14 @@ | |||
| class CreateCiTemplates < ActiveRecord::Migration[5.2] | |||
| def change | |||
| create_table :ci_templates do |t| | |||
| t.string :template_name, null: false, comment: '模板名称' | |||
| t.string :stage_type, null: false, comment: '模板所属阶段类型:init/build/deploy/customize/confirm' | |||
| t.string :category, null: false, comment: '模板分类' | |||
| t.text :content, null: false, comment: '模板yml内容' | |||
| t.timestamps | |||
| end | |||
| add_index :ci_templates, [:stage_type] | |||
| end | |||
| end | |||
| @@ -0,0 +1,11 @@ | |||
| class CreateCiPipelines < ActiveRecord::Migration[5.2] | |||
| def change | |||
| create_table :ci_pipelines do |t| | |||
| t.string :pipeline_name, null: false, comment: '流水线名称' | |||
| t.string :pipeline_status, null: false, comment: 'successed/failed/running/errored/pending/killed/unknown' , default: 'unknown' | |||
| t.string :file_name, null: false, comment: '文件名称' | |||
| t.timestamps | |||
| end | |||
| end | |||
| end | |||
| @@ -0,0 +1,12 @@ | |||
| class CreateCiPipelineStages < ActiveRecord::Migration[5.2] | |||
| def change | |||
| create_table :ci_pipeline_stages do |t| | |||
| t.string :stage_name, null: false, comment: '阶段名称' | |||
| t.string :stage_type, null: false, comment: '阶段类型:init/build/deploy/customize/confirm' | |||
| t.integer :pipeline_id, null: false, comment: '阶段所属流水线id' | |||
| t.integer :show_index, null: false, comment: '阶段排序', default: 0 | |||
| t.timestamps | |||
| end | |||
| end | |||
| end | |||
| @@ -0,0 +1,13 @@ | |||
| class CreateCiPipelineStageSteps < ActiveRecord::Migration[5.2] | |||
| def change | |||
| create_table :ci_pipeline_stage_steps do |t| | |||
| t.string :step_name, null: false, comment: '步骤名称' | |||
| t.integer :stage_id, null: false, comment: '阶段id' | |||
| t.integer :template_id, comment: '模板id' | |||
| t.text :content | |||
| t.integer :show_index, null: false, comment: '阶段排序', default: 0 | |||
| t.timestamps | |||
| end | |||
| end | |||
| end | |||