config now in settings

This commit is contained in:
Sebastian Frank 2019-03-06 12:26:09 +01:00
parent 311e8e49ba
commit 71edd8bbf3
6 changed files with 197 additions and 18 deletions

42
Controller/Settings.php Normal file
View File

@ -0,0 +1,42 @@
<?php
namespace Drone\Controller;
use \Cockpit\AuthController;
/**
* Settings controller class.
*/
class Settings extends AuthController {
/**
* Default index controller.
*/
public function index() {
if (!$this->app->module('cockpit')->hasaccess('drone', 'manage.settings')) {
return FALSE;
}
$drone = $this->app->storage->findOne('drone/settings');
return $this->render('drone:views/settings/index.php', compact('drone'));
}
public function save() {
if ($data = $this->param('drone', false)) {
$data['_modified'] = time();
if (!isset($data['_id'])) {
$data['_created'] = $data['_modified'];
}
$this->app->storage->save('drone/settings', $data);
return json_encode($data);
}
return false;
}
}

View File

@ -13,20 +13,17 @@ It provides an integration with Drone CI promote feature to trigger a pipeline r
## Configuration
1. Ensure that from your Drone account you have an access token and permissions to promote a build for the project and branch, you want to use.
2. Edit Cockpit config/config.yaml and add a new entry for drone like below:
```yaml
drone:
url: https://YOUR.DRONE.SERVER
token: <your drone access token>
owner: <the owner of the git repository>
project: <the git project>
branch: <the branch in your git repository for the deployment>
target: <the target condition used in your drone pipeline>
build: <the build number used as base for deployment> # leave empty and the addon will use the latest successfull build based on a push event
```
2. Go to "Settings - Drone Deploys" and add a your drone configuration like below as following
| |
| --- | ---
| URL: | your drone server url, pe. https://YOUR.DRONE.SERVER
| Token: | your drone access token
| Owner: | the owner of the git repository
| Project: | the git project
| Branch: | the branch in your git repository for the deployment
| Target: | the target condition used in your drone pipeline
| Build: | the build number used as base for deployment, leave empty and the addon will use the latest successfull build based on a push event
### Permissions

View File

@ -9,10 +9,22 @@
$this("acl")->addResource('drone', [
'manage.view',
'manage.deploy',
'manage.settings'
]);
/*
* add menu entry to settings
*/
$this->on('cockpit.view.settings.item', function () {
if ($this->module('cockpit')->hasaccess('drone', 'manage.settings')) {
$this->renderView("drone:views/partials/settings.php");
}
});
$app->on('admin.init', function () use ($app) {
if ($app->config['drone']) {
$settings = $app->storage->findOne('drone/settings');
if ($settings && $settings['active']) {
// Bind admin routes.
$this->bindClass('Drone\\Controller\\Admin', 'drone/deploys');
@ -26,4 +38,9 @@ $app->on('admin.init', function () use ($app) {
]);
}
}
if ($app->module('cockpit')->hasaccess('drone', 'manage.settings')) {
// Add settings
$this->bindClass('Drone\\Controller\\Settings', 'drone/settings');
}
});

View File

@ -10,13 +10,13 @@ if (COCKPIT_ADMIN && !COCKPIT_API_REQUEST) {
// Extend addon functions.
$this->module('drone')->extend([
'fetchDeploys' => function ($limit = 50) {
$settings = $this->app->config['drone'] ?? FALSE;
$settings = $this->app->storage->findOne('drone/settings') ?? FALSE;
if (!$settings || !isset($settings['url'],
$settings['owner'],
$settings['project'],
$settings['target'],
$settings['token'])) {
$settings['token']) || !$settings['active']) {
return [];
}
@ -85,13 +85,13 @@ if (COCKPIT_ADMIN && !COCKPIT_API_REQUEST) {
},
'createDeploy' => function ($fromBuild) {
$settings = $this->app->config['drone'];
$settings = $this->app->storage->findOne('drone/settings');
if (!$fromBuild || !$settings || !isset($settings['url'],
$settings['owner'],
$settings['project'],
$settings['target'],
$settings['token'])) {
$settings['token']) || !$settings['active']) {
return array(
"error" => "missing settings"

View File

@ -0,0 +1,18 @@
<?php
/**
* @file
* Drone Aside settings entry view.
*/
?>
<div>
<div class="uk-panel uk-panel-space uk-panel-box uk-panel-card">
<img src="@url('drone:icon.svg')" width="50" height="50" alt="@lang('Drone Deploys')" />
<div class="uk-text-truncate uk-margin">
@lang('Drone Deploys')
</div>
<a class="uk-position-cover" href="@route('/drone/settings')"></a>
</div>
</div>

105
views/settings/index.php Normal file
View File

@ -0,0 +1,105 @@
<div>
<ul class="uk-breadcrumb">
<li><a href="@route('/settings')">@lang('Settings')</a></li>
<li class="uk-active"><span>@lang('Drone Deploys')</span></li>
</ul>
</div>
<div class="uk-margin-top" riot-view>
<form class="uk-form" onsubmit="{ submit }">
<div class="uk-grid">
<div class="uk-grid-margin uk-width-medium-2-3">
<div class="uk-form-row">
<label class="uk-text-small">@lang('URL')</label>
<input class="uk-width-1-1 uk-form-large" type="text" bind="drone.url" required>
</div>
<div class="uk-form-row">
<label class="uk-text-small">@lang('Token')</label>
<input class="uk-width-1-1 uk-form-large" type="text" bind="drone.token" required>
</div>
<div class="uk-form-row">
<label class="uk-text-small">@lang('Owner')</label>
<input class="uk-width-1-1 uk-form-large" type="text" bind="drone.owner" required>
</div>
<div class="uk-form-row">
<label class="uk-text-small">@lang('Project')</label>
<input class="uk-width-1-1 uk-form-large" type="text" bind="drone.project" required>
</div>
<div class="uk-form-row">
<label class="uk-text-small">@lang('Branch')</label>
<input class="uk-width-1-1 uk-form-large" type="text" bind="drone.branch" placeholder="@lang('Default'): master">
</div>
<div class="uk-form-row">
<label class="uk-text-small">@lang('Target')</label>
<input class="uk-width-1-1 uk-form-large" type="text" bind="drone.target" required>
</div>
<div class="uk-form-row">
<label class="uk-text-small">@lang('Build')</label>
<input class="uk-width-1-1 uk-form-large" type="text" bind="drone.build" placeholder="@lang('Default'): @lang('empty for last successfull build')">
</div>
<cp-actionbar>
<div class="uk-container uk-container-center">
<button class="uk-button uk-button-large uk-button-primary">@lang('Save')</button>
<a class="uk-button uk-button-large uk-button-link" href="@route('/settings')">@lang('Cancel')</a>
</div>
</cp-actionbar>
</div>
<div class="uk-grid-margin uk-width-medium-1-3">
<div class="uk-panel">
<div class="uk-margin">
<label class="uk-text-small">@lang('Status')</label>
<div class="uk-margin-small-top">
<field-boolean bind="drone.active" label="false"></field-boolean>
</div>
</div>
<div class="uk-margin" if="{drone._id}">
<label class="uk-text-small">@lang('Last Modified')</label>
<div class="uk-margin-small-top uk-text-muted"><i class="uk-icon-calendar uk-margin-small-right"></i> { App.Utils.dateformat( new Date( 1000 * drone._modified )) }</div>
</div>
</div>
</div>
</div>
</form>
<script type="view/script">
var $this = this;
this.mixin(RiotBindMixin);
this.drone = {{ json_encode($drone) }};
submit(e) {
if(e) e.preventDefault();
App.request('/drone/settings/save', {drone: this.drone}).then(function(data) {
if (data) {
App.ui.notify("Saving successful", "success");
$this.drone = data;
$this.update();
} else {
App.ui.notify("Saving failed.", "danger");
}
});
}
</script>
</div>