Merge branch 'dev_devops' of http://gitea.trustie.net/jasder/forgeplus into dev_devops

This commit is contained in:
sylor_huang@126.com 2020-07-22 16:43:09 +08:00
commit c45b8184c6
10 changed files with 366 additions and 218 deletions

13
.trustie-pipeline.yml Normal file
View File

@ -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

423
README.md
View File

@ -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
}
]
```

View File

@ -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")

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 \

View File

@ -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

View File

@ -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} \

View File

@ -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