From e414960153b580fef5b1b9af36215c16e2ec7853 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Mon, 20 Jul 2020 15:38:12 +0800 Subject: [PATCH 01/20] Update drone request server --- app/libs/dev_ops/drone/request.rb | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/app/libs/dev_ops/drone/request.rb b/app/libs/dev_ops/drone/request.rb index 6ce738a72..6cc38174e 100644 --- a/app/libs/dev_ops/drone/request.rb +++ b/app/libs/dev_ops/drone/request.rb @@ -35,7 +35,12 @@ def put(endpoint, path, options={}) validate_request_params!(endpoint) - request(:put, endpoint, path, options) + + end + + def patch(url, params={}) + validate_request_params!(endpoint) + request(:patch, endpoint, path, options) end def delete(endpoint, path, options={}) @@ -45,10 +50,19 @@ private def request(method, endpoint, path, **params) - Rails.logger.info("[drone] request: #{method} #{path} #{params.except(:secret).inspect}") + Rails.logger.info("[drone] request: #{method} #{path} #{params.except(:drone_token).inspect}") - client = Faraday.new(url: endpoint) - response = client.public_send(method, path, params) + client ||= begin + Faraday.new(url: endpoint) do |req| + req.request :url_encoded + req.headers['Content-Type'] = 'application/json' + req.response :logger # 显示日志 + req.adapter Faraday.default_adapter + req.authorization :Bearer, params[:drone_token] + req.headers['Authorization'] + end + end + response = client.public_send(method, path, params.except(:drone_token)) json_response(response) end From 2633e65a6c0041ba65e96aabcd6670fafcbb409b Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Mon, 20 Jul 2020 15:39:12 +0800 Subject: [PATCH 02/20] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index c30dbd75e..38c681bd5 100644 --- a/README.md +++ b/README.md @@ -2511,6 +2511,12 @@ GET /api/dev_ops/builds curl -X GET http://localhost:3000/api/dev_ops/builds | jq ``` +*请求参数说明:* + +|参数名|必选|类型|说明| +|-|-|-|-| +|id |是|int |repository's id | + *返回参数说明:* |参数名|类型|说明| From 9cc2e80e9877ae7ad520ff10504cf9838cb1a550 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Mon, 20 Jul 2020 15:47:58 +0800 Subject: [PATCH 03/20] FIX bug --- app/libs/dev_ops/drone/request.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/libs/dev_ops/drone/request.rb b/app/libs/dev_ops/drone/request.rb index 6cc38174e..85420b7ab 100644 --- a/app/libs/dev_ops/drone/request.rb +++ b/app/libs/dev_ops/drone/request.rb @@ -35,10 +35,10 @@ def put(endpoint, path, options={}) validate_request_params!(endpoint) - + request(:put, endpoint, path, options) end - def patch(url, params={}) + def patch(endpoint, path, options={}) validate_request_params!(endpoint) request(:patch, endpoint, path, options) end From 1f54e02acece8882c6ff952277d56ca7a3d219a4 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Mon, 20 Jul 2020 16:12:37 +0800 Subject: [PATCH 04/20] ADD devops .trustie-pipeline.ym file --- .trustie-pipeline.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .trustie-pipeline.yml diff --git a/.trustie-pipeline.yml b/.trustie-pipeline.yml new file mode 100644 index 000000000..662261bb6 --- /dev/null +++ b/.trustie-pipeline.yml @@ -0,0 +1,13 @@ +kind: pipeline +name: default + +platform: + os: linux + arch: arm64 + +steps: +- name: test + image: ruby + commands: + - bundle install --jobs=3 --retry=3 + - rake From 5fcb4a55006b4b8eae1fea757995c7300b3b1af7 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Mon, 20 Jul 2020 16:52:26 +0800 Subject: [PATCH 05/20] FIX drone sever request params --- app/libs/dev_ops/drone/api.rb | 2 +- app/libs/dev_ops/drone/request.rb | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/libs/dev_ops/drone/api.rb b/app/libs/dev_ops/drone/api.rb index 860e54557..cf910fd63 100644 --- a/app/libs/dev_ops/drone/api.rb +++ b/app/libs/dev_ops/drone/api.rb @@ -39,7 +39,7 @@ class DevOps::Drone::API < DevOps::Drone::Request # Activate user's project with Drone CI # POST api/repos/{owner}/{name} # eq: - # DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.endpoint, project.owner.login, project.identifier).avtivate + # DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.endpoint, project.owner.login, project.identifier).activate def activate post(endpoint, "/api/repos/#{owner}/#{repo}", drone_token: drone_token) end diff --git a/app/libs/dev_ops/drone/request.rb b/app/libs/dev_ops/drone/request.rb index 85420b7ab..a59b515d2 100644 --- a/app/libs/dev_ops/drone/request.rb +++ b/app/libs/dev_ops/drone/request.rb @@ -62,7 +62,9 @@ req.headers['Authorization'] end end - response = client.public_send(method, path, params.except(:drone_token)) + response = client.public_send(method, path) do |req| + req.body = params.except(:drone_token).to_json + end json_response(response) end From 15fc5de3de3c53877ba6056a95a33c3b83648629 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 21 Jul 2020 12:35:26 +0800 Subject: [PATCH 06/20] =?UTF-8?q?FIX=20=E6=B5=8B=E8=AF=95giteawebhook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/dev_ops/builds_controller.rb | 9 +++++++-- app/forms/dev_ops/create_cloud_account_form.rb | 4 ++-- app/libs/dev_ops/drone/client.rb | 4 ++-- config/routes.rb | 1 + 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/controllers/dev_ops/builds_controller.rb b/app/controllers/dev_ops/builds_controller.rb index 2474b1136..98e82741a 100644 --- a/app/controllers/dev_ops/builds_controller.rb +++ b/app/controllers/dev_ops/builds_controller.rb @@ -1,6 +1,6 @@ class ::DevOps::BuildsController < ApplicationController - before_action :require_login - before_action :find_repo + before_action :require_login, except: :test_webhook + before_action :find_repo, except: :test_webhook def index cloud_account = @repo.dev_ops_cloud_account @@ -36,6 +36,11 @@ class ::DevOps::BuildsController < ApplicationController render json: result end + def test_webhook + logger.info "==============已经回调成功了....." + render_ok + end + private def find_repo @repo = ::Repository.find params[:id] diff --git a/app/forms/dev_ops/create_cloud_account_form.rb b/app/forms/dev_ops/create_cloud_account_form.rb index 2d1752b74..e17edc5ba 100644 --- a/app/forms/dev_ops/create_cloud_account_form.rb +++ b/app/forms/dev_ops/create_cloud_account_form.rb @@ -1,9 +1,9 @@ class DevOps::CreateCloudAccountForm include ActiveModel::Model - attr_accessor :project_id, :ip_num, :account, :secret + attr_accessor :repo_id, :ip_num, :account, :secret - validates :project_id, :account, :secret, presence: true + validates :repo_id, :account, :secret, presence: true validates :ip_num, presence: true, format: { with: CustomRegexp::IP, multiline: true, message: 'IP 地址格式不对' } end diff --git a/app/libs/dev_ops/drone/client.rb b/app/libs/dev_ops/drone/client.rb index 540876bc6..dfd68e5bd 100644 --- a/app/libs/dev_ops/drone/client.rb +++ b/app/libs/dev_ops/drone/client.rb @@ -14,7 +14,7 @@ class DevOps::Drone::Client def run `docker run -d \ -v /var/run/docker.sock:/var/run/docker.sock \ - -e DRONE_RPC_SERVER=drone-server-#{client_id}:9000 \ + -e DRONE_PRC_HOST=drone-server-#{client_id}:9000 \ -e DRONE_RPC_SECRET=#{rpc_secret} \ -e DRONE_RUNNER_NAME=#{drone_ip} \ --restart always \ @@ -27,7 +27,7 @@ class DevOps::Drone::Client def generate_cmd "docker run -d \ -v /var/run/docker.sock:/var/run/docker.sock \ - -e DRONE_RPC_SERVER=drone-server-#{client_id}:9000 \ + -e DRONE_PRC_HOST=#{drone_ip}-#{client_id}:9000 \ -e DRONE_RPC_SECRET=#{rpc_secret} \ -e DRONE_RUNNER_NAME=#{drone_ip} \ --restart always \ diff --git a/config/routes.rb b/config/routes.rb index 5589b55b9..cebbe8945 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -28,6 +28,7 @@ Rails.application.routes.draw do post ':number', to: 'builds#restart', as: 'restart' delete ':number', to: 'builds#delete', as: 'delete' get ':number/logs/:stage/:step', to: 'builds#detail', as: 'logs' + post 'test_webhook', to: 'builds#test_webhook', as: 'test_webhook' end end end From 5d34ac68d509b4361cdfd169cf59ede7dcb9583f Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 21 Jul 2020 14:17:19 +0800 Subject: [PATCH 07/20] FIX create oauth bug --- app/controllers/dev_ops/cloud_accounts_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/dev_ops/cloud_accounts_controller.rb b/app/controllers/dev_ops/cloud_accounts_controller.rb index 108e2fdc5..9be2d05d7 100644 --- a/app/controllers/dev_ops/cloud_accounts_controller.rb +++ b/app/controllers/dev_ops/cloud_accounts_controller.rb @@ -20,6 +20,7 @@ class DevOps::CloudAccountsController < ApplicationController cloud_account = DevOps::CloudAccount.new(create_params) cloud_account.user = current_user cloud_account.repo_id = @repo.id + cloud_account.project_id = @repo.project.id cloud_account.save! end @@ -31,7 +32,7 @@ class DevOps::CloudAccountsController < ApplicationController redirect_uri: gitea_oauth['redirect_uris'], gitea_oauth_id: gitea_oauth['id'], user_id: current_user.id, - project_id: devops_params[:project_id]) + project_id: @repo.project.id) oauth.save rpc_secret = SecureRandom.hex 16 From 236782eca8cd33a7ba71b311eff8bf731ecebc23 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 21 Jul 2020 15:07:42 +0800 Subject: [PATCH 08/20] FIX drone server command's bug --- app/libs/dev_ops/drone/api.rb | 2 +- app/libs/dev_ops/drone/client.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/libs/dev_ops/drone/api.rb b/app/libs/dev_ops/drone/api.rb index cf910fd63..c7d807860 100644 --- a/app/libs/dev_ops/drone/api.rb +++ b/app/libs/dev_ops/drone/api.rb @@ -39,7 +39,7 @@ class DevOps::Drone::API < DevOps::Drone::Request # Activate user's project with Drone CI # POST api/repos/{owner}/{name} # eq: - # DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.endpoint, project.owner.login, project.identifier).activate + # DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, project.owner.login, project.identifier).activate def activate post(endpoint, "/api/repos/#{owner}/#{repo}", drone_token: drone_token) end diff --git a/app/libs/dev_ops/drone/client.rb b/app/libs/dev_ops/drone/client.rb index dfd68e5bd..7f44f6e59 100644 --- a/app/libs/dev_ops/drone/client.rb +++ b/app/libs/dev_ops/drone/client.rb @@ -27,7 +27,7 @@ class DevOps::Drone::Client def generate_cmd "docker run -d \ -v /var/run/docker.sock:/var/run/docker.sock \ - -e DRONE_PRC_HOST=#{drone_ip}-#{client_id}:9000 \ + -e DRONE_PRC_HOST=#{drone_ip}:9000 \ -e DRONE_RPC_SECRET=#{rpc_secret} \ -e DRONE_RUNNER_NAME=#{drone_ip} \ --restart always \ From 20d8f21ebb03c0ef4193dcb6e7526034cebfb6b5 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 21 Jul 2020 15:19:43 +0800 Subject: [PATCH 09/20] FIX bug --- app/libs/dev_ops/drone/client.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/libs/dev_ops/drone/client.rb b/app/libs/dev_ops/drone/client.rb index 7f44f6e59..a7c69cfdf 100644 --- a/app/libs/dev_ops/drone/client.rb +++ b/app/libs/dev_ops/drone/client.rb @@ -27,7 +27,7 @@ class DevOps::Drone::Client def generate_cmd "docker run -d \ -v /var/run/docker.sock:/var/run/docker.sock \ - -e DRONE_PRC_HOST=#{drone_ip}:9000 \ + -e DRONE_RPC_HOST=#{drone_ip}:9000 \ -e DRONE_RPC_SECRET=#{rpc_secret} \ -e DRONE_RUNNER_NAME=#{drone_ip} \ --restart always \ From 0f92aa7981aa2d5e32a03db99d75bf7ef80591f2 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 21 Jul 2020 17:08:07 +0800 Subject: [PATCH 10/20] FIX test devops --- README.md | 318 ++++++++++++------ app/controllers/dev_ops/builds_controller.rb | 11 +- .../dev_ops/cloud_accounts_controller.rb | 2 +- app/libs/dev_ops/drone/client.rb | 15 +- app/libs/dev_ops/drone/server.rb | 1 - config/routes.rb | 3 +- 6 files changed, 213 insertions(+), 137 deletions(-) diff --git a/README.md b/README.md index 38c681bd5..9a8141ee0 100644 --- a/README.md +++ b/README.md @@ -2508,7 +2508,9 @@ GET /api/dev_ops/builds *示例* ``` -curl -X GET http://localhost:3000/api/dev_ops/builds | jq +curl -X GET \ +-d 'id=4844' \ +http://localhost:3000/api/dev_ops/builds | jq ``` *请求参数说明:* @@ -2530,29 +2532,31 @@ curl -X GET http://localhost:3000/api/dev_ops/builds | jq ``` [ { - "id": 100207, - "repo_id": 296163, - "number": 42, + "id": 1, + "repo_id": 8, + "trigger": "@hook", + "number": 1, "status": "success", - "event": "pull_request", - "action": "sync", - "link": "https://github.com/octoat/hello-world/compare/e3320539a4c0...9fc1ad6ebf12", - "message": "updated README", - "before": "e3320539a4c03ccfda992641646deb67d8bf98f3", - "after": "9fc1ad6ebf12462f3f9773003e26b4c6f54a772e", + "event": "push", + "action": "", + "link": "", + "timestamp": 0, + "message": "更新 '.trustie-pipeline.yml'\n", + "before": "5e7c6f7dfd5ce6cc6e287fcbc000dadd9992b324", + "after": "5e52ce51a239f5c8dd0b489a8a71e94f976179b4", "ref": "refs/heads/master", - "source_repo": "spaceghost/hello-world", - "source": "develop", + "source_repo": "", + "source": "master", "target": "master", - "author_login": "octocat", - "author_name": "The Octocat", - "author_email": "octocat@github.com", - "author_avatar": "http://www.gravatar.com/avatar/7194e8d48fa1d2b689f99443b767316c", - "sender": "bradrydzewski", - "started": 1564085874, - "finished": 1564086343, - "created": 1564085874, - "updated": 1564085874, + "author_login": "jasder", + "author_name": "jasder", + "author_email": "email.com", + "author_avatar": "", + "sender": "jasder", + "started": 1595317786, + "finished": 1595318426, + "created": 1595317786, + "updated": 1595317786, "version": 3 } ] @@ -2566,13 +2570,16 @@ GET /api/dev_ops/builds/:number *示例* ``` -curl -X GET http://localhost:3000/api/dev_ops/builds/42 | jq +curl -X GET \ +-d 'id=4844' \ +http://ocalhost:3000/api/dev_ops/builds/1 | jq ``` *请求参数说明:* |参数名|必选|类型|说明| |-|-|-|-| +|id |int|repository's id| |number |是|int |build's number | *返回参数说明:* @@ -2586,53 +2593,79 @@ curl -X GET http://localhost:3000/api/dev_ops/builds/42 | jq 返回值 ``` { - "id": 100207, - "repo_id": 296163, - "number": 42, - "status": "pending", - "event": "pull_request", - "action": "sync", - "link": "https://github.com/octoat/hello-world/compare/e3320539a4c0...9fc1ad6ebf12", - "message": "updated README", - "before": "e3320539a4c03ccfda992641646deb67d8bf98f3", - "after": "9fc1ad6ebf12462f3f9773003e26b4c6f54a772e", + "id": 1, + "repo_id": 8, + "trigger": "@hook", + "number": 1, + "status": "success", + "event": "push", + "action": "", + "link": "http://localhost:3000/jasder/forgeplus/compare/5e7c6f7dfd5ce6cc6e287fcbc000dadd9992b324...5e52ce51a239f5c8dd0b489a8a71e94f976179b4", + "timestamp": 0, + "message": "更新 '.trustie-pipeline.yml'\n", + "before": "5e7c6f7dfd5ce6cc6e287fcbc000dadd9992b324", + "after": "5e52ce51a239f5c8dd0b489a8a71e94f976179b4", "ref": "refs/heads/master", - "source_repo": "spaceghost/hello-world", - "source": "develop", + "source_repo": "", + "source": "master", "target": "master", - "author_login": "octocat", - "author_name": "The Octocat", - "author_email": "octocat@github.com", - "author_avatar": "http://www.gravatar.com/avatar/7194e8d48fa1d2b689f99443b767316c", - "sender": "bradrydzewski", - "started": 0, - "finished": 0, - "created": 1564085874, - "updated": 1564085874, - "version": 1, + "author_login": "jasder", + "author_name": "jasder", + "author_email": "2053003901@qq.com", + "author_avatar": "http://localhost:3000/user/avatar/jasder/-1", + "sender": "jasder", + "started": 1595317786, + "finished": 1595318426, + "created": 1595317786, + "updated": 1595317786, + "version": 3, "stages": [ - { - "id": 199937, - "repo_id": 296163, - "build_id": 100207, + { + "id": 1, + "repo_id": 8, + "build_id": 1, + "number": 1, + "name": "default", + "kind": "pipeline", + "type": "docker", + "status": "success", + "errignore": false, + "exit_code": 0, + "machine": "121.36.81.172", + "os": "linux", + "arch": "arm64", + "started": 1595317786, + "stopped": 1595318426, + "created": 1595317786, + "updated": 1595318426, + "version": 4, + "on_success": true, + "on_failure": false, + "steps": [ + { + "id": 1, + "step_id": 1, "number": 1, - "name": "default", - "kind": "pipeline", - "type": "docker", - "status": "pending", - "errignore": false, + "name": "clone", + "status": "success", "exit_code": 0, - "machine": "15e89c0f84f1", - "os": "linux", - "arch": "amd64", - "started": 0, - "stopped": 0, - "created": 1564085874, - "updated": 1564086343, - "version": 1, - "on_success": true, - "on_failure": false - } + "started": 1595317786, + "stopped": 1595318373, + "version": 4 + }, + { + "id": 2, + "step_id": 1, + "number": 2, + "name": "test", + "status": "success", + "exit_code": 0, + "started": 1595318373, + "stopped": 1595318426, + "version": 4 + } + ] + } ] } ``` @@ -2645,13 +2678,16 @@ POST /api/dev_ops/builds/:number *示例* ``` -curl -X POST http://localhost:3000/api/dev_ops/builds/42 | jq +curl -X POST \ +-d 'id=4844' \ +http://localhost:3000/api/dev_ops/builds/1 | jq ``` *请求参数说明:* |参数名|必选|类型|说明| |-|-|-|-| +|id |int|repository's id| |number |是|int |build's number | *返回参数说明:* @@ -2665,54 +2701,32 @@ curl -X POST http://localhost:3000/api/dev_ops/builds/42 | jq 返回值 ``` { - "id": 100207, - "repo_id": 296163, - "number": 42, + "id": 2, + "repo_id": 8, + "trigger": "jasder", + "number": 2, "status": "pending", - "event": "pull_request", - "action": "sync", - "link": "https://github.com/octoat/hello-world/compare/e3320539a4c0...9fc1ad6ebf12", - "message": "updated README", - "before": "e3320539a4c03ccfda992641646deb67d8bf98f3", - "after": "9fc1ad6ebf12462f3f9773003e26b4c6f54a772e", + "event": "push", + "action": "", + "link": "http://localhost:3000/jasder/forgeplus/compare/5e7c6f7dfd5ce6cc6e287fcbc000dadd9992b324...5e52ce51a239f5c8dd0b489a8a71e94f976179b4", + "timestamp": 0, + "message": "更新 '.trustie-pipeline.yml'\n", + "before": "5e7c6f7dfd5ce6cc6e287fcbc000dadd9992b324", + "after": "5e52ce51a239f5c8dd0b489a8a71e94f976179b4", "ref": "refs/heads/master", - "source_repo": "spaceghost/hello-world", - "source": "develop", + "source_repo": "", + "source": "master", "target": "master", - "author_login": "octocat", - "author_name": "The Octocat", - "author_email": "octocat@github.com", - "author_avatar": "http://www.gravatar.com/avatar/7194e8d48fa1d2b689f99443b767316c", - "sender": "bradrydzewski", + "author_login": "jasder", + "author_name": "jasder", + "author_email": "2053003901@qq.com", + "author_avatar": "http://localhost:3000/user/avatar/jasder/-1", + "sender": "jasder", "started": 0, "finished": 0, - "created": 1564085874, - "updated": 1564085874, - "version": 1, - "stages": [ - { - "id": 199937, - "repo_id": 296163, - "build_id": 100207, - "number": 1, - "name": "default", - "kind": "pipeline", - "type": "docker", - "status": "pending", - "errignore": false, - "exit_code": 0, - "machine": "15e89c0f84f1", - "os": "linux", - "arch": "amd64", - "started": 0, - "stopped": 0, - "created": 1564085874, - "updated": 1564086343, - "version": 1, - "on_success": true, - "on_failure": false - } - ] + "created": 1595321350, + "updated": 1595321350, + "version": 1 } ``` --- @@ -2724,13 +2738,16 @@ DELETE /api/dev_ops/builds/:number *示例* ``` -curl -X DELETE http://localhost:3000/api/dev_ops/builds/42 | jq +curl -X DELETE \ +-d 'id=4844' \ +http://localhost:3000/api/dev_ops/builds/42 | jq ``` *请求参数说明:* |参数名|必选|类型|说明| |-|-|-|-| +|id |int|repository's id| |number |是|int |build's number | *返回参数说明:* @@ -2743,6 +2760,82 @@ curl -X DELETE http://localhost:3000/api/dev_ops/builds/42 | jq 返回值 ``` +{ + "id": 2, + "repo_id": 8, + "trigger": "jasder", + "number": 2, + "status": "killed", + "event": "push", + "action": "", + "link": "http://localhost:3000/jasder/forgeplus/compare/5e7c6f7dfd5ce6cc6e287fcbc000dadd9992b324...5e52ce51a239f5c8dd0b489a8a71e94f976179b4", + "timestamp": 0, + "message": "更新 '.trustie-pipeline.yml'\n", + "before": "5e7c6f7dfd5ce6cc6e287fcbc000dadd9992b324", + "after": "5e52ce51a239f5c8dd0b489a8a71e94f976179b4", + "ref": "refs/heads/master", + "source_repo": "", + "source": "master", + "target": "master", + "author_login": "jasder", + "author_name": "jasder", + "author_email": "2053003901@qq.com", + "author_avatar": "http://localhost:3000/user/avatar/jasder/-1", + "sender": "jasder", + "started": 1595321352, + "finished": 1595321590, + "created": 1595321350, + "updated": 1595321352, + "version": 3, + "stages": [ + { + "id": 2, + "repo_id": 8, + "build_id": 2, + "number": 1, + "name": "default", + "kind": "pipeline", + "type": "docker", + "status": "killed", + "errignore": false, + "exit_code": 0, + "machine": "121.36.81.172", + "os": "linux", + "arch": "arm64", + "started": 1595321352, + "stopped": 1595321590, + "created": 1595321350, + "updated": 1595321352, + "version": 4, + "on_success": true, + "on_failure": false, + "steps": [ + { + "id": 3, + "step_id": 2, + "number": 1, + "name": "clone", + "status": "killed", + "exit_code": 130, + "started": 1595321353, + "stopped": 1595321590, + "version": 3 + }, + { + "id": 4, + "step_id": 2, + "number": 2, + "name": "test", + "status": "skipped", + "exit_code": 130, + "started": 1595321590, + "stopped": 1595321590, + "version": 2 + } + ] + } + ] +} ``` --- @@ -2753,14 +2846,17 @@ GET /api/dev_ops/builds/:number/logs/:stage/:step *示例* ``` -curl -X GET http://localhost:3000/api/dev_ops/builds/42/logs/ | jq +curl -X GET \ +-d 'id=4844' \ +http://localhost:3000/api/dev_ops/builds/42/logs/ | jq ``` *请求参数说明:* |参数名|必选|类型|说明| |-|-|-|-| -|number |是|int |build's number | +|id |int|repository's id| +|number |是|int |build's number | |stage |是|int |build's stage id | |step |是|int |build's step id | diff --git a/app/controllers/dev_ops/builds_controller.rb b/app/controllers/dev_ops/builds_controller.rb index 98e82741a..034555970 100644 --- a/app/controllers/dev_ops/builds_controller.rb +++ b/app/controllers/dev_ops/builds_controller.rb @@ -1,6 +1,6 @@ class ::DevOps::BuildsController < ApplicationController - before_action :require_login, except: :test_webhook - before_action :find_repo, except: :test_webhook + before_action :require_login + before_action :find_repo def index cloud_account = @repo.dev_ops_cloud_account @@ -31,16 +31,11 @@ class ::DevOps::BuildsController < ApplicationController def logs cloud_account = @repo.dev_ops_cloud_account - result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, build: params[:build], stage: params[:stage], step: sync_params[:step]).logs + result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, build: params[:build], stage: params[:stage], step: params[:step]).logs render json: result end - def test_webhook - logger.info "==============已经回调成功了....." - render_ok - end - private def find_repo @repo = ::Repository.find params[:id] diff --git a/app/controllers/dev_ops/cloud_accounts_controller.rb b/app/controllers/dev_ops/cloud_accounts_controller.rb index 9be2d05d7..614f9748d 100644 --- a/app/controllers/dev_ops/cloud_accounts_controller.rb +++ b/app/controllers/dev_ops/cloud_accounts_controller.rb @@ -50,7 +50,7 @@ class DevOps::CloudAccountsController < ApplicationController logger.info "######### result: #{result}" - redirect_url = "#{Gitea.gitea_config[:domain]}/login/oauth/authorize?client_id=#{oauth.client_id}&redirect_uri=#{cloud_account.drone_url}/login&response_type=code" + redirect_url = "#{cloud_account.drone_url}/login&response_type=code" logger.info "######### redirect_url: #{redirect_url}" if result render_ok(redirect_url: redirect_url) diff --git a/app/libs/dev_ops/drone/client.rb b/app/libs/dev_ops/drone/client.rb index a7c69cfdf..c427f79d8 100644 --- a/app/libs/dev_ops/drone/client.rb +++ b/app/libs/dev_ops/drone/client.rb @@ -11,23 +11,10 @@ class DevOps::Drone::Client @rpc_secret = rpc_secret end - def run - `docker run -d \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -e DRONE_PRC_HOST=drone-server-#{client_id}:9000 \ - -e DRONE_RPC_SECRET=#{rpc_secret} \ - -e DRONE_RUNNER_NAME=#{drone_ip} \ - --restart always \ - --name drone-agent--#{client_id} \ - --net="bridge" \ - drone/drone-runner-docker:1 - ` - end - def generate_cmd "docker run -d \ -v /var/run/docker.sock:/var/run/docker.sock \ - -e DRONE_RPC_HOST=#{drone_ip}:9000 \ + -e DRONE_RPC_HOST=#{drone_ip}:80 \ -e DRONE_RPC_SECRET=#{rpc_secret} \ -e DRONE_RUNNER_NAME=#{drone_ip} \ --restart always \ diff --git a/app/libs/dev_ops/drone/server.rb b/app/libs/dev_ops/drone/server.rb index 04c7a9cda..e4bbe9da5 100644 --- a/app/libs/dev_ops/drone/server.rb +++ b/app/libs/dev_ops/drone/server.rb @@ -46,7 +46,6 @@ class DevOps::Drone::Server -e DRONE_SERVER_HOST=#{drone_host} \ -e DRONE_SERVER_PROTO=http \ -p '80:80' \ - -p '9000:9000' \ --restart=always \ --detach=true \ --name=drone-server-#{client_id} \ diff --git a/config/routes.rb b/config/routes.rb index cebbe8945..64ada7e8d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -27,8 +27,7 @@ Rails.application.routes.draw do get ':number', to: 'builds#detail', as: 'detail' post ':number', to: 'builds#restart', as: 'restart' delete ':number', to: 'builds#delete', as: 'delete' - get ':number/logs/:stage/:step', to: 'builds#detail', as: 'logs' - post 'test_webhook', to: 'builds#test_webhook', as: 'test_webhook' + get ':number/logs/:stage/:step', to: 'builds#logs', as: 'logs' end end end From 794f28178709c6613419819ce85bf809216aa0e0 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 21 Jul 2020 17:11:28 +0800 Subject: [PATCH 11/20] FIX bug --- app/libs/dev_ops/drone/api.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/libs/dev_ops/drone/api.rb b/app/libs/dev_ops/drone/api.rb index c7d807860..bc22d63d2 100644 --- a/app/libs/dev_ops/drone/api.rb +++ b/app/libs/dev_ops/drone/api.rb @@ -68,6 +68,6 @@ class DevOps::Drone::API < DevOps::Drone::Request # eq: # DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, build: build, stage: stage, step: step).logs def logs - get(endpoint, "/api/repos/#{owner}/#{repo}/builds/#{options[:build]}/logs/#{options[:stage]}/#{options[:step]}", drone_token: drone_token) + get(endpoint, "/api/repos/#{owner}/#{repo}/builds/#{options[:number]}/logs/#{options[:stage]}/#{options[:step]}", drone_token: drone_token) end end From cf244390ef3f25885dc36ee0af9dad0426765876 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 21 Jul 2020 17:13:15 +0800 Subject: [PATCH 12/20] FIX git drone logs api params's bug --- app/controllers/dev_ops/builds_controller.rb | 2 +- app/libs/dev_ops/drone/api.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/dev_ops/builds_controller.rb b/app/controllers/dev_ops/builds_controller.rb index 034555970..8870ec4b3 100644 --- a/app/controllers/dev_ops/builds_controller.rb +++ b/app/controllers/dev_ops/builds_controller.rb @@ -31,7 +31,7 @@ class ::DevOps::BuildsController < ApplicationController def logs cloud_account = @repo.dev_ops_cloud_account - result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, build: params[:build], stage: params[:stage], step: params[:step]).logs + result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, build: params[:number], stage: params[:stage], step: params[:step]).logs render json: result end diff --git a/app/libs/dev_ops/drone/api.rb b/app/libs/dev_ops/drone/api.rb index bc22d63d2..c7d807860 100644 --- a/app/libs/dev_ops/drone/api.rb +++ b/app/libs/dev_ops/drone/api.rb @@ -68,6 +68,6 @@ class DevOps::Drone::API < DevOps::Drone::Request # eq: # DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, build: build, stage: stage, step: step).logs def logs - get(endpoint, "/api/repos/#{owner}/#{repo}/builds/#{options[:number]}/logs/#{options[:stage]}/#{options[:step]}", drone_token: drone_token) + get(endpoint, "/api/repos/#{owner}/#{repo}/builds/#{options[:build]}/logs/#{options[:stage]}/#{options[:step]}", drone_token: drone_token) end end From 77b55daf04b7bc1964629546789c8696f3e2aed2 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 21 Jul 2020 17:24:30 +0800 Subject: [PATCH 13/20] Update README.md --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 9a8141ee0..02cbf6a07 100644 --- a/README.md +++ b/README.md @@ -2332,7 +2332,7 @@ http://localhost:3000/api//api/repositories/3868/delete_file | jq 返回值 -``` +```json { "commit": { "sha": "7b70509105b587e71f5692b9e8ab70851e321f64", @@ -2390,7 +2390,7 @@ https://localhost:3000/api/dev_ops/cloud_accounts.json | jq |redirect_url |string|重定向地址,请求成功后,需要调整到该地址进行认证| 返回值 -``` +```json { "status": 0, "message": "success", @@ -2419,7 +2419,7 @@ curl -X GET http://localhost:3000/api/dev_ops/languages.json | jq |cover_url |string|语言的logo链接| 返回值 -``` +```json [ { "id": 114, @@ -2451,7 +2451,7 @@ curl -X GET http://localhost:3000/api/dev_ops/languages/common.json | jq |cover_url |string|语言的logo链接| 返回值 -``` +```json [ { "id": 114, @@ -2489,7 +2489,7 @@ curl -X GET http://localhost:3000/api/dev_ops/languages/114.json | jq |cover_url |string|语言的logo链接| 返回值 -``` +```json [ { "id": 114, @@ -2529,7 +2529,7 @@ http://localhost:3000/api/dev_ops/builds | jq |event |string|build's event| 返回值 -``` +```json [ { "id": 1, @@ -2591,7 +2591,7 @@ http://ocalhost:3000/api/dev_ops/builds/1 | jq |event |string|build's event| 返回值 -``` +```json { "id": 1, "repo_id": 8, @@ -2699,7 +2699,7 @@ http://localhost:3000/api/dev_ops/builds/1 | jq |event |string|build's event| 返回值 -``` +```json { "id": 2, "repo_id": 8, @@ -2759,7 +2759,7 @@ http://localhost:3000/api/dev_ops/builds/42 | jq |event |string|build's event| 返回值 -``` +```json { "id": 2, "repo_id": 8, @@ -2848,7 +2848,7 @@ GET /api/dev_ops/builds/:number/logs/:stage/:step ``` curl -X GET \ -d 'id=4844' \ -http://localhost:3000/api/dev_ops/builds/42/logs/ | jq +http://localhost:3000/api/dev_ops/builds/2/logs/1/3 | jq ``` *请求参数说明:* @@ -2869,7 +2869,7 @@ http://localhost:3000/api/dev_ops/builds/42/logs/ | jq |event |string|build's event| 返回值 -``` +```json [ { "proc": "clone", From 07dfc06c9f580e205fcb980a4f38863d613dd6ac Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 21 Jul 2020 17:27:57 +0800 Subject: [PATCH 14/20] FIX code review --- app/libs/dev_ops/drone/server.rb | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/app/libs/dev_ops/drone/server.rb b/app/libs/dev_ops/drone/server.rb index e4bbe9da5..cb08ca271 100644 --- a/app/libs/dev_ops/drone/server.rb +++ b/app/libs/dev_ops/drone/server.rb @@ -13,26 +13,6 @@ class DevOps::Drone::Server @client_secret = client_secret end - def run - ` - docker run \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -e DRONE_GITEA_SERVER=#{gitea_url} \ - -e DRONE_GITEA_CLIENT_ID=#{client_id} \ - -e DRONE_GITEA_CLIENT_SECRET=#{client_secret} \ - -e DRONE_RPC_SECRET=#{rpc_secret} \ - -e DRONE_SERVER_HOST=#{drone_host} \ - -e DRONE_SERVER_PROTO=http \ - -p "80:80" \ - -p "9000:9000" \ - --restart=always \ - --detach=true \ - --name=drone-server-#{client_id} \ - --net="bridge" \ - drone/drone:1 - ` - end - # TODO 一下代码方便测试,正式环境请移除 # docker rm -f `docker ps -qa` def generate_cmd From a22bd280bcef61f1e8a67b006d0764917a8060d5 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 21 Jul 2020 17:34:47 +0800 Subject: [PATCH 15/20] Update api document --- README.md | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 02cbf6a07..3ed28e687 100644 --- a/README.md +++ b/README.md @@ -2740,7 +2740,7 @@ DELETE /api/dev_ops/builds/:number ``` curl -X DELETE \ -d 'id=4844' \ -http://localhost:3000/api/dev_ops/builds/42 | jq +http://localhost:3000/api/dev_ops/builds/2 | jq ``` *请求参数说明:* @@ -2848,7 +2848,7 @@ GET /api/dev_ops/builds/:number/logs/:stage/:step ``` curl -X GET \ -d 'id=4844' \ -http://localhost:3000/api/dev_ops/builds/2/logs/1/3 | jq +http://localhost:3000/api/dev_ops/builds/2/logs/1/1 | jq ``` *请求参数说明:* @@ -2857,8 +2857,8 @@ http://localhost:3000/api/dev_ops/builds/2/logs/1/3 | jq |-|-|-|-| |id |int|repository's id| |number |是|int |build's number | -|stage |是|int |build's stage id | -|step |是|int |build's step id | +|stage |是|int |build's stage number | +|step |是|int |build's step number | *返回参数说明:* @@ -2872,49 +2872,44 @@ http://localhost:3000/api/dev_ops/builds/2/logs/1/3 | jq ```json [ { - "proc": "clone", "pos": 0, - "out": "+ git init\n" + "out": "+ git fetch origin +refs/heads/master:\n", + "time": 1 }, { - "proc": "clone", "pos": 1, - "out": "Initialized empty Git repository in /drone/src/github.com/octocat/hello-world/.git/\n" + "out": "Initialized empty Git repository in /drone/src/.git/\n", + "time": 1 }, { - "proc": "clone", "pos": 2, - "out": "+ git remote add origin https://github.com/octocat/hello-world.git\n" + "out": "warning: redirecting to https://testgitea2.trustie.net/jasder/forgeplus.git/\n", + "time": 1 }, { - "proc": "clone", "pos": 3, - "out": "+ git fetch --no-tags origin +refs/heads/master:\n" + "out": "From http://testgitea2.trustie.net/jasder/forgeplus\n", + "time": 493 }, { - "proc": "clone", "pos": 4, - "out": "From https://github.com/octocat/hello-world\n" + "out": " * branch master -> FETCH_HEAD\n", + "time": 493 }, { - "proc": "clone", "pos": 5, - "out": " * branch master -> FETCH_HEAD\n" + "out": " * [new branch] master -> origin/master\n", + "time": 493 }, { - "proc": "clone", "pos": 6, - "out": " * [new branch] master -> origin/master\n" + "out": "+ git checkout 5e52ce51a239f5c8dd0b489a8a71e94f976179b4 -b master\n", + "time": 493 }, { - "proc": "clone", "pos": 7, - "out": "+ git reset --hard -q 62126a02ffea3dabd7789e5c5407553490973665\n" - }, - { - "proc": "clone", - "pos": 8, - "out": "+ git submodule update --init --recursive\n" + "out": "Already on 'master'\n", + "time": 496 } ] ``` From 1c2264f7216358b6328e76953b1ed3ed27293555 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Wed, 22 Jul 2020 11:18:02 +0800 Subject: [PATCH 16/20] ADD get .trustie-pipeline.yml file api with devops --- README.md | 35 ++++++++++++++++++++ app/controllers/dev_ops/builds_controller.rb | 15 +++++++++ config/routes.rb | 1 + 3 files changed, 51 insertions(+) diff --git a/README.md b/README.md index 3ed28e687..e98789b26 100644 --- a/README.md +++ b/README.md @@ -2399,6 +2399,41 @@ https://localhost:3000/api/dev_ops/cloud_accounts.json | jq ``` --- +#### 获取仓库的.trustie-pipeline.yml +``` +GET /api/dev_ops/builds/get_trustie_pipeline +``` +*示例* +``` +curl -X GET \ +-d "id=4844" \ +http://localhost:3000/api/dev_ops/builds/get_trustie_pipeline.json | jq +``` +*请求参数说明:* + +|参数名|必选|类型|说明| +|-|-|-|-| +|id |是|int |repository's id | +|ref |否|string |分支名称、tag名称或是提交记录id,默认为master分支 | + + +*返回参数说明:* + +|参数名|类型|说明| +|-|-|-| +|id |int |id | +|name |string|文件夹或文件名称| +|path |string|文件夹或文件相对路径| +|content |string|文件内容,| + +``` +{ + "name": ".trustie-pipeline.yml", + "path": ".trustie-pipeline.yml", + "content": "..jsaf" +} +``` + #### 获取语言列表 ``` GET /api/dev_ops/languages diff --git a/app/controllers/dev_ops/builds_controller.rb b/app/controllers/dev_ops/builds_controller.rb index 8870ec4b3..b7829c634 100644 --- a/app/controllers/dev_ops/builds_controller.rb +++ b/app/controllers/dev_ops/builds_controller.rb @@ -1,4 +1,6 @@ class ::DevOps::BuildsController < ApplicationController + include RepositoriesHelper + before_action :require_login before_action :find_repo @@ -36,6 +38,19 @@ class ::DevOps::BuildsController < ApplicationController render json: result end + # get .trustie-pipeline.yml file + def get_trustie_pipeline + file_path_uri = URI.parse('.trustie-pipeline.yml') + interactor = Repositories::EntriesInteractor.call(@repo.user, @repo.identifier, file_path_uri, ref: params[:ref] || "master") + if interactor.success? + file = interactor.result + return render json: {} if file[:status] + + json = {name: file['name'], path: file['path'], content: render_decode64_content(file['content'])} + render json: json + end + end + private def find_repo @repo = ::Repository.find params[:id] diff --git a/config/routes.rb b/config/routes.rb index 64ada7e8d..8064352bf 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -24,6 +24,7 @@ Rails.application.routes.draw do end resources :builds, only: :index do collection do + get 'get_trustie_pipeline', to: 'builds#get_trustie_pipeline', as: 'get_trustie_pipeline' get ':number', to: 'builds#detail', as: 'detail' post ':number', to: 'builds#restart', as: 'restart' delete ':number', to: 'builds#delete', as: 'delete' From 8b5c3797e97529140a2b94f93e6b2a60835fc6cf Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Wed, 22 Jul 2020 11:27:30 +0800 Subject: [PATCH 17/20] FIX devops ucloud account --- app/controllers/dev_ops/cloud_accounts_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/dev_ops/cloud_accounts_controller.rb b/app/controllers/dev_ops/cloud_accounts_controller.rb index 614f9748d..7514a2e0e 100644 --- a/app/controllers/dev_ops/cloud_accounts_controller.rb +++ b/app/controllers/dev_ops/cloud_accounts_controller.rb @@ -15,7 +15,7 @@ class DevOps::CloudAccountsController < ApplicationController if cloud_account = @repo.dev_ops_cloud_account - cloud_account + return render_error('该仓库已绑定了云帐号.') else cloud_account = DevOps::CloudAccount.new(create_params) cloud_account.user = current_user From 3d99dee31bde3c9b59f6651775212e21a948b6f6 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Wed, 22 Jul 2020 11:44:42 +0800 Subject: [PATCH 18/20] Update devops redirect_url --- app/controllers/dev_ops/cloud_accounts_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/dev_ops/cloud_accounts_controller.rb b/app/controllers/dev_ops/cloud_accounts_controller.rb index 7514a2e0e..3d3663cf6 100644 --- a/app/controllers/dev_ops/cloud_accounts_controller.rb +++ b/app/controllers/dev_ops/cloud_accounts_controller.rb @@ -50,7 +50,7 @@ class DevOps::CloudAccountsController < ApplicationController logger.info "######### result: #{result}" - redirect_url = "#{cloud_account.drone_url}/login&response_type=code" + redirect_url = "#{cloud_account.drone_url}/login" logger.info "######### redirect_url: #{redirect_url}" if result render_ok(redirect_url: redirect_url) From 3c7b25746202d1772222a297f0216d16b5c801e5 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Wed, 22 Jul 2020 14:28:54 +0800 Subject: [PATCH 19/20] =?UTF-8?q?FIX=20devops=20=E6=89=80=E6=9C=89?= =?UTF-8?q?=E4=BB=93=E5=BA=93=E7=9B=B8=E5=85=B3=E7=9A=84=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=8F=82=E6=95=B0repo=5Fid=20=E6=94=B9=E4=B8=BAproject=5Fid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 29 +++++++++--------- app/controllers/dev_ops/builds_controller.rb | 30 +++++++++---------- .../dev_ops/cloud_accounts_controller.rb | 12 ++++---- .../dev_ops/create_cloud_account_form.rb | 4 +-- 4 files changed, 37 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index e98789b26..8dc5546a3 100644 --- a/README.md +++ b/README.md @@ -2368,7 +2368,7 @@ curl -X POST \ -d "account=xx" \ -d "secret=xxx" \ -d "ip_num=xx.xx.xx.xx" \ --d "repo_id=5988" \ +-d "project_id=5988" \ https://localhost:3000/api/dev_ops/cloud_accounts.json | jq ``` @@ -2379,7 +2379,7 @@ https://localhost:3000/api/dev_ops/cloud_accounts.json | jq |account |是|string |云服务器ssh连接登录用户名 | |secret |是|string |云服务器ssh连接登录秘密 | |ip_num |否|string |云服务器公网IP | -|repo_id |否|string |repository id| +|project_id |否|string |project's id| *返回参数说明:* @@ -2406,14 +2406,14 @@ GET /api/dev_ops/builds/get_trustie_pipeline *示例* ``` curl -X GET \ --d "id=4844" \ +-d "project_id=4844" \ http://localhost:3000/api/dev_ops/builds/get_trustie_pipeline.json | jq ``` *请求参数说明:* |参数名|必选|类型|说明| |-|-|-|-| -|id |是|int |repository's id | +|project_id |是|int |project's id | |ref |否|string |分支名称、tag名称或是提交记录id,默认为master分支 | @@ -2421,7 +2421,6 @@ http://localhost:3000/api/dev_ops/builds/get_trustie_pipeline.json | jq |参数名|类型|说明| |-|-|-| -|id |int |id | |name |string|文件夹或文件名称| |path |string|文件夹或文件相对路径| |content |string|文件内容,| @@ -2544,7 +2543,7 @@ GET /api/dev_ops/builds *示例* ``` curl -X GET \ --d 'id=4844' \ +-d 'project_id=4844' \ http://localhost:3000/api/dev_ops/builds | jq ``` @@ -2552,7 +2551,7 @@ http://localhost:3000/api/dev_ops/builds | jq |参数名|必选|类型|说明| |-|-|-|-| -|id |是|int |repository's id | +|project_id |是|int |project's id | *返回参数说明:* @@ -2606,7 +2605,7 @@ GET /api/dev_ops/builds/:number *示例* ``` curl -X GET \ --d 'id=4844' \ +-d 'project_id=4844' \ http://ocalhost:3000/api/dev_ops/builds/1 | jq ``` @@ -2614,7 +2613,7 @@ http://ocalhost:3000/api/dev_ops/builds/1 | jq |参数名|必选|类型|说明| |-|-|-|-| -|id |int|repository's id| +|project_id |int|project's id| |number |是|int |build's number | *返回参数说明:* @@ -2714,7 +2713,7 @@ POST /api/dev_ops/builds/:number *示例* ``` curl -X POST \ --d 'id=4844' \ +-d 'project_id=4844' \ http://localhost:3000/api/dev_ops/builds/1 | jq ``` @@ -2722,7 +2721,7 @@ http://localhost:3000/api/dev_ops/builds/1 | jq |参数名|必选|类型|说明| |-|-|-|-| -|id |int|repository's id| +|project_id |int|project's id| |number |是|int |build's number | *返回参数说明:* @@ -2774,7 +2773,7 @@ DELETE /api/dev_ops/builds/:number *示例* ``` curl -X DELETE \ --d 'id=4844' \ +-d 'project_id=4844' \ http://localhost:3000/api/dev_ops/builds/2 | jq ``` @@ -2782,7 +2781,7 @@ http://localhost:3000/api/dev_ops/builds/2 | jq |参数名|必选|类型|说明| |-|-|-|-| -|id |int|repository's id| +|project_id |int|project's id| |number |是|int |build's number | *返回参数说明:* @@ -2882,7 +2881,7 @@ GET /api/dev_ops/builds/:number/logs/:stage/:step *示例* ``` curl -X GET \ --d 'id=4844' \ +-d 'project_id=4844' \ http://localhost:3000/api/dev_ops/builds/2/logs/1/1 | jq ``` @@ -2890,7 +2889,7 @@ http://localhost:3000/api/dev_ops/builds/2/logs/1/1 | jq |参数名|必选|类型|说明| |-|-|-|-| -|id |int|repository's id| +|project_id |int|project's id| |number |是|int |build's number | |stage |是|int |build's stage number | |step |是|int |build's step number | diff --git a/app/controllers/dev_ops/builds_controller.rb b/app/controllers/dev_ops/builds_controller.rb index b7829c634..72943d7e7 100644 --- a/app/controllers/dev_ops/builds_controller.rb +++ b/app/controllers/dev_ops/builds_controller.rb @@ -1,39 +1,39 @@ -class ::DevOps::BuildsController < ApplicationController +class DevOps::BuildsController < ApplicationController include RepositoriesHelper before_action :require_login - before_action :find_repo + before_action :find_project def index - cloud_account = @repo.dev_ops_cloud_account - result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier).builds + cloud_account = @project.dev_ops_cloud_account + result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @project.owner.login, @project.identifier).builds render json: result end def detail - cloud_account = @repo.dev_ops_cloud_account - result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, number: params[:number]).build + cloud_account = @project.dev_ops_cloud_account + result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @project.owner.login, @project.identifier, number: params[:number]).build render json: result end def restart - cloud_account = @repo.dev_ops_cloud_account - result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, number: params[:number]).restart + cloud_account = @project.dev_ops_cloud_account + result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @project.owner.login, @project.identifier, number: params[:number]).restart render json: result end def delete - cloud_account = @repo.dev_ops_cloud_account - result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, number: params[:number]).stop + cloud_account = @project.dev_ops_cloud_account + result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @project.owner.login, @project.identifier, number: params[:number]).stop render json: result end def logs - cloud_account = @repo.dev_ops_cloud_account - result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, build: params[:number], stage: params[:stage], step: params[:step]).logs + cloud_account = @project.dev_ops_cloud_account + result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @project.owner.login, @project.identifier, build: params[:number], stage: params[:stage], step: params[:step]).logs render json: result end @@ -41,7 +41,7 @@ class ::DevOps::BuildsController < ApplicationController # get .trustie-pipeline.yml file def get_trustie_pipeline file_path_uri = URI.parse('.trustie-pipeline.yml') - interactor = Repositories::EntriesInteractor.call(@repo.user, @repo.identifier, file_path_uri, ref: params[:ref] || "master") + interactor = Repositories::EntriesInteractor.call(@project.owner, @project.identifier, file_path_uri, ref: params[:ref] || "master") if interactor.success? file = interactor.result return render json: {} if file[:status] @@ -52,7 +52,7 @@ class ::DevOps::BuildsController < ApplicationController end private - def find_repo - @repo = ::Repository.find params[:id] + def find_project + @project = Project.find params[:project_id] end end diff --git a/app/controllers/dev_ops/cloud_accounts_controller.rb b/app/controllers/dev_ops/cloud_accounts_controller.rb index 3d3663cf6..c7c445d88 100644 --- a/app/controllers/dev_ops/cloud_accounts_controller.rb +++ b/app/controllers/dev_ops/cloud_accounts_controller.rb @@ -14,13 +14,13 @@ class DevOps::CloudAccountsController < ApplicationController logger.info "######### create_params: #{create_params}" - if cloud_account = @repo.dev_ops_cloud_account + if cloud_account = @project.dev_ops_cloud_account return render_error('该仓库已绑定了云帐号.') else cloud_account = DevOps::CloudAccount.new(create_params) cloud_account.user = current_user - cloud_account.repo_id = @repo.id - cloud_account.project_id = @repo.project.id + cloud_account.repo_id = @project.repository.id + cloud_account.project_id = @project.id cloud_account.save! end @@ -32,7 +32,7 @@ class DevOps::CloudAccountsController < ApplicationController redirect_uri: gitea_oauth['redirect_uris'], gitea_oauth_id: gitea_oauth['id'], user_id: current_user.id, - project_id: @repo.project.id) + project_id: @project.id) oauth.save rpc_secret = SecureRandom.hex 16 @@ -64,10 +64,10 @@ class DevOps::CloudAccountsController < ApplicationController private def devops_params - params.permit(:account, :secret, :ip_num, :repo_id) + params.permit(:account, :secret, :ip_num, :project_id) end def find_project - @repo = Repository.find params[:repo_id] + @project = Project.find params[:project_id] end end diff --git a/app/forms/dev_ops/create_cloud_account_form.rb b/app/forms/dev_ops/create_cloud_account_form.rb index e17edc5ba..2d1752b74 100644 --- a/app/forms/dev_ops/create_cloud_account_form.rb +++ b/app/forms/dev_ops/create_cloud_account_form.rb @@ -1,9 +1,9 @@ class DevOps::CreateCloudAccountForm include ActiveModel::Model - attr_accessor :repo_id, :ip_num, :account, :secret + attr_accessor :project_id, :ip_num, :account, :secret - validates :repo_id, :account, :secret, presence: true + validates :project_id, :account, :secret, presence: true validates :ip_num, presence: true, format: { with: CustomRegexp::IP, multiline: true, message: 'IP 地址格式不对' } end From b7b3751d431c587169a34fd894efdb07b959f611 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Wed, 22 Jul 2020 15:16:01 +0800 Subject: [PATCH 20/20] ADD devops authorize --- app/controllers/application_controller.rb | 10 ++++++++-- app/controllers/dev_ops/builds_controller.rb | 1 + .../dev_ops/cloud_accounts_controller.rb | 16 +++++++--------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 68f0b2a48..e97c8ec08 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -342,7 +342,8 @@ class ApplicationController < ActionController::Base elsif params[:debug] == 'student' User.current = User.find 8686 elsif params[:debug] == 'admin' - user = User.find 1 + logger.info "@@@@@@@@@@@@@@@@@@@@@@ debug mode....." + user = User.find 36480 User.current = user cookies.signed[:user_id] = user.id end @@ -384,7 +385,7 @@ class ApplicationController < ActionController::Base def current_user if Rails.env.development? - User.current = User.find 1 + User.current = User.find 36480 else User.current end @@ -743,6 +744,11 @@ class ApplicationController < ActionController::Base interactor.success? ? render_ok : render_error(interactor.error) end + # devops 权限验证 + def devops_authorize! + render_forbidden unless @project.owner?(current_user) + end + private def object_not_found uid_logger("Missing template or cant't find record, responding with 404") diff --git a/app/controllers/dev_ops/builds_controller.rb b/app/controllers/dev_ops/builds_controller.rb index 72943d7e7..2c419ea7d 100644 --- a/app/controllers/dev_ops/builds_controller.rb +++ b/app/controllers/dev_ops/builds_controller.rb @@ -3,6 +3,7 @@ class DevOps::BuildsController < ApplicationController before_action :require_login before_action :find_project + before_action :devops_authorize! def index cloud_account = @project.dev_ops_cloud_account diff --git a/app/controllers/dev_ops/cloud_accounts_controller.rb b/app/controllers/dev_ops/cloud_accounts_controller.rb index c7c445d88..10cd67bbd 100644 --- a/app/controllers/dev_ops/cloud_accounts_controller.rb +++ b/app/controllers/dev_ops/cloud_accounts_controller.rb @@ -1,19 +1,14 @@ class DevOps::CloudAccountsController < ApplicationController before_action :require_login before_action :find_project + before_action :devops_authorize! def create ActiveRecord::Base.transaction do DevOps::CreateCloudAccountForm.new(devops_params).validate! - logger.info "######### devops_params: #{devops_params}" - logger.info "######### ......: #{(IPAddr.new devops_params[:ip_num]).to_i}" - logger.info "######### ......: #{DevOps::CloudAccount.encrypted_secret(devops_params[:secret])}" + # 1. 保存华为云服务器帐号 - logger.info "######### ......ff: #{devops_params.merge(ip_num: IPAddr.new(devops_params[:ip_num]).to_i, secret: DevOps::CloudAccount.encrypted_secret(devops_params[:secret]))}" create_params = devops_params.merge(ip_num: IPAddr.new(devops_params[:ip_num]).to_i, secret: DevOps::CloudAccount.encrypted_secret(devops_params[:secret])) - logger.info "######### create_params: #{create_params}" - - if cloud_account = @project.dev_ops_cloud_account return render_error('该仓库已绑定了云帐号.') else @@ -37,6 +32,7 @@ class DevOps::CloudAccountsController < ApplicationController rpc_secret = SecureRandom.hex 16 logger.info "######### rpc_secret: #{rpc_secret}" + # 3. 创建drone server drone_server_cmd = DevOps::Drone::Server.new(oauth.client_id, oauth.client_secret, cloud_account.drone_host, rpc_secret).generate_cmd logger.info "######### drone_server_cmd: #{drone_server_cmd}" @@ -52,10 +48,12 @@ class DevOps::CloudAccountsController < ApplicationController redirect_url = "#{cloud_account.drone_url}/login" logger.info "######### redirect_url: #{redirect_url}" - if result + + if result && !result.blank? render_ok(redirect_url: redirect_url) else - render_error('激活失败') + render_error('激活失败, 请检查你的云服务器信息是否正确.') + raise ActiveRecord::Rollback end end rescue Exception => ex