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 diff --git a/README.md b/README.md index c30dbd75e..8dc5546a3 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", @@ -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| *返回参数说明:* @@ -2390,7 +2390,7 @@ https://localhost:3000/api/dev_ops/cloud_accounts.json | jq |redirect_url |string|重定向地址,请求成功后,需要调整到该地址进行认证| 返回值 -``` +```json { "status": 0, "message": "success", @@ -2399,6 +2399,40 @@ 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 "project_id=4844" \ +http://localhost:3000/api/dev_ops/builds/get_trustie_pipeline.json | jq +``` +*请求参数说明:* + +|参数名|必选|类型|说明| +|-|-|-|-| +|project_id |是|int |project's id | +|ref |否|string |分支名称、tag名称或是提交记录id,默认为master分支 | + + +*返回参数说明:* + +|参数名|类型|说明| +|-|-|-| +|name |string|文件夹或文件名称| +|path |string|文件夹或文件相对路径| +|content |string|文件内容,| + +``` +{ + "name": ".trustie-pipeline.yml", + "path": ".trustie-pipeline.yml", + "content": "..jsaf" +} +``` + #### 获取语言列表 ``` GET /api/dev_ops/languages @@ -2419,7 +2453,7 @@ curl -X GET http://localhost:3000/api/dev_ops/languages.json | jq |cover_url |string|语言的logo链接| 返回值 -``` +```json [ { "id": 114, @@ -2451,7 +2485,7 @@ curl -X GET http://localhost:3000/api/dev_ops/languages/common.json | jq |cover_url |string|语言的logo链接| 返回值 -``` +```json [ { "id": 114, @@ -2489,7 +2523,7 @@ curl -X GET http://localhost:3000/api/dev_ops/languages/114.json | jq |cover_url |string|语言的logo链接| 返回值 -``` +```json [ { "id": 114, @@ -2508,9 +2542,17 @@ GET /api/dev_ops/builds *示例* ``` -curl -X GET http://localhost:3000/api/dev_ops/builds | jq +curl -X GET \ +-d 'project_id=4844' \ +http://localhost:3000/api/dev_ops/builds | jq ``` +*请求参数说明:* + +|参数名|必选|类型|说明| +|-|-|-|-| +|project_id |是|int |project's id | + *返回参数说明:* |参数名|类型|说明| @@ -2521,32 +2563,34 @@ curl -X GET http://localhost:3000/api/dev_ops/builds | jq |event |string|build's event| 返回值 -``` +```json [ { - "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 } ] @@ -2560,13 +2604,16 @@ GET /api/dev_ops/builds/:number *示例* ``` -curl -X GET http://localhost:3000/api/dev_ops/builds/42 | jq +curl -X GET \ +-d 'project_id=4844' \ +http://ocalhost:3000/api/dev_ops/builds/1 | jq ``` *请求参数说明:* |参数名|必选|类型|说明| |-|-|-|-| +|project_id |int|project's id| |number |是|int |build's number | *返回参数说明:* @@ -2578,55 +2625,81 @@ curl -X GET http://localhost:3000/api/dev_ops/builds/42 | jq |event |string|build's event| 返回值 -``` +```json { - "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 + } + ] + } ] } ``` @@ -2639,13 +2712,16 @@ POST /api/dev_ops/builds/:number *示例* ``` -curl -X POST http://localhost:3000/api/dev_ops/builds/42 | jq +curl -X POST \ +-d 'project_id=4844' \ +http://localhost:3000/api/dev_ops/builds/1 | jq ``` *请求参数说明:* |参数名|必选|类型|说明| |-|-|-|-| +|project_id |int|project's id| |number |是|int |build's number | *返回参数说明:* @@ -2657,56 +2733,34 @@ curl -X POST http://localhost:3000/api/dev_ops/builds/42 | jq |event |string|build's event| 返回值 -``` +```json { - "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 } ``` --- @@ -2718,13 +2772,16 @@ DELETE /api/dev_ops/builds/:number *示例* ``` -curl -X DELETE http://localhost:3000/api/dev_ops/builds/42 | jq +curl -X DELETE \ +-d 'project_id=4844' \ +http://localhost:3000/api/dev_ops/builds/2 | jq ``` *请求参数说明:* |参数名|必选|类型|说明| |-|-|-|-| +|project_id |int|project's id| |number |是|int |build's number | *返回参数说明:* @@ -2736,7 +2793,83 @@ curl -X DELETE http://localhost:3000/api/dev_ops/builds/42 | jq |event |string|build's event| 返回值 -``` +```json +{ + "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 + } + ] + } + ] +} ``` --- @@ -2747,16 +2880,19 @@ 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 'project_id=4844' \ +http://localhost:3000/api/dev_ops/builds/2/logs/1/1 | jq ``` *请求参数说明:* |参数名|必选|类型|说明| |-|-|-|-| -|number |是|int |build's number | -|stage |是|int |build's stage id | -|step |是|int |build's step id | +|project_id |int|project's id| +|number |是|int |build's number | +|stage |是|int |build's stage number | +|step |是|int |build's step number | *返回参数说明:* @@ -2767,52 +2903,47 @@ curl -X GET http://localhost:3000/api/dev_ops/builds/42/logs/ | jq |event |string|build's event| 返回值 -``` +```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 } ] ``` 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 2474b1136..2c419ea7d 100644 --- a/app/controllers/dev_ops/builds_controller.rb +++ b/app/controllers/dev_ops/builds_controller.rb @@ -1,43 +1,59 @@ -class ::DevOps::BuildsController < ApplicationController +class DevOps::BuildsController < ApplicationController + include RepositoriesHelper + before_action :require_login - before_action :find_repo + before_action :find_project + before_action :devops_authorize! 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[:build], stage: params[:stage], step: sync_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 + # get .trustie-pipeline.yml file + def get_trustie_pipeline + file_path_uri = URI.parse('.trustie-pipeline.yml') + 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] + + 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] + 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 108e2fdc5..10cd67bbd 100644 --- a/app/controllers/dev_ops/cloud_accounts_controller.rb +++ b/app/controllers/dev_ops/cloud_accounts_controller.rb @@ -1,25 +1,21 @@ 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 = @repo.dev_ops_cloud_account - 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.repo_id = @project.repository.id + cloud_account.project_id = @project.id cloud_account.save! end @@ -31,11 +27,12 @@ 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: @project.id) oauth.save 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}" @@ -49,12 +46,14 @@ 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" 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 @@ -63,10 +62,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/libs/dev_ops/drone/api.rb b/app/libs/dev_ops/drone/api.rb index 860e54557..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).avtivate + # 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 540876bc6..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_RPC_SERVER=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_SERVER=drone-server-#{client_id}: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/request.rb b/app/libs/dev_ops/drone/request.rb index 6ce738a72..a59b515d2 100644 --- a/app/libs/dev_ops/drone/request.rb +++ b/app/libs/dev_ops/drone/request.rb @@ -38,6 +38,11 @@ request(:put, endpoint, path, options) end + def patch(endpoint, path, options={}) + validate_request_params!(endpoint) + request(:patch, endpoint, path, options) + end + def delete(endpoint, path, options={}) validate_request_params!(endpoint) request(:delete, endpoint, path, options) @@ -45,10 +50,21 @@ 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) do |req| + req.body = params.except(:drone_token).to_json + end json_response(response) end diff --git a/app/libs/dev_ops/drone/server.rb b/app/libs/dev_ops/drone/server.rb index 04c7a9cda..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 @@ -46,7 +26,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 5589b55b9..8064352bf 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -24,10 +24,11 @@ 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' - get ':number/logs/:stage/:step', to: 'builds#detail', as: 'logs' + get ':number/logs/:stage/:step', to: 'builds#logs', as: 'logs' end end end