mirror of
https://github.com/grafana/grafana.git
synced 2025-12-20 19:44:55 +08:00
Compare commits
19 Commits
docs/updat
...
v6.1.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eff01d2b54 | ||
|
|
cbc515b22c | ||
|
|
638d49dd6e | ||
|
|
9d452256bf | ||
|
|
f941f25831 | ||
|
|
b585fdec6f | ||
|
|
e6c639f6f0 | ||
|
|
03346b6f6f | ||
|
|
9a575f93ad | ||
|
|
21957ad515 | ||
|
|
bd93aad63d | ||
|
|
8ae5980c23 | ||
|
|
eb38581dc1 | ||
|
|
be217d8c0e | ||
|
|
dfbc3bfb1f | ||
|
|
a6c8cd7f3a | ||
|
|
56e4032db3 | ||
|
|
944e526eb9 | ||
|
|
0d6db7e6b8 |
4
.browserslistrc
Normal file
4
.browserslistrc
Normal file
@@ -0,0 +1,4 @@
|
||||
>1%,
|
||||
Chrome > 20
|
||||
last 4 versions,
|
||||
Firefox ESR
|
||||
@@ -322,7 +322,7 @@ jobs:
|
||||
|
||||
deploy-enterprise-master:
|
||||
docker:
|
||||
- image: grafana/grafana-ci-deploy:1.2.1
|
||||
- image: grafana/grafana-ci-deploy:1.2.2
|
||||
steps:
|
||||
- attach_workspace:
|
||||
at: .
|
||||
@@ -347,7 +347,7 @@ jobs:
|
||||
|
||||
deploy-enterprise-release:
|
||||
docker:
|
||||
- image: grafana/grafana-ci-deploy:1.2.1
|
||||
- image: grafana/grafana-ci-deploy:1.2.2
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
@@ -380,7 +380,7 @@ jobs:
|
||||
|
||||
deploy-master:
|
||||
docker:
|
||||
- image: grafana/grafana-ci-deploy:1.2.1
|
||||
- image: grafana/grafana-ci-deploy:1.2.2
|
||||
steps:
|
||||
- attach_workspace:
|
||||
at: .
|
||||
@@ -411,7 +411,7 @@ jobs:
|
||||
|
||||
deploy-release:
|
||||
docker:
|
||||
- image: grafana/grafana-ci-deploy:1.2.1
|
||||
- image: grafana/grafana-ci-deploy:1.2.2
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
|
||||
1
build.go
1
build.go
@@ -361,6 +361,7 @@ func createPackage(options linuxPackageOptions) {
|
||||
fmt.Printf("pkgArch is set to '%s', generated arch is '%s'\n", pkgArch, options.packageArch)
|
||||
if pkgArch == "armv6" {
|
||||
name += "-rpi"
|
||||
args = append(args, "--replaces", "grafana")
|
||||
}
|
||||
args = append(args, "--name", name)
|
||||
|
||||
|
||||
55
docs/sources/guides/whats-new-in-v6-1.md
Normal file
55
docs/sources/guides/whats-new-in-v6-1.md
Normal file
@@ -0,0 +1,55 @@
|
||||
+++
|
||||
title = "What's New in Grafana v6.1"
|
||||
description = "Feature & improvement highlights for Grafana v6.1"
|
||||
keywords = ["grafana", "new", "documentation", "6.1"]
|
||||
type = "docs"
|
||||
[menu.docs]
|
||||
name = "Version 6.1"
|
||||
identifier = "v6.1"
|
||||
parent = "whatsnew"
|
||||
weight = -12
|
||||
+++
|
||||
|
||||
# What's New in Grafana v6.1
|
||||
|
||||
## Highlights
|
||||
|
||||
### Ad hoc Filtering for Prometheus
|
||||
|
||||
{{< imgbox max-width="30%" img="/img/docs/v61/prometheus-ad-hoc.gif" caption="Ad-hoc filters variable for Prometheus" >}}
|
||||
|
||||
The ad hoc filter feature allows you to create new key/value filters on the fly with autocomplete for both key and values. The filter condition is then automatically applied to all queries on the dashboard. This makes it easier to explore your data in a dashboard without changing queries and without having to add new template variables.
|
||||
|
||||
Other timeseries databases with label-based query languages have had this feature for a while. Recently Prometheus added support for fetching label names from their API and thanks to [Mitsuhiro Tanda](https://github.com/mtanda) implementing it in Grafana, the Prometheus datasource finally supports ad hoc filtering.
|
||||
|
||||
Support for fetching a list of label names was released in Prometheus v2.6.0 so that is a requirement for this feature to work in Grafana.
|
||||
|
||||
### Permissions: Editors can own dashboards, folders and teams they create
|
||||
|
||||
When the dashboard folders feature and permissions system was released in Grafana 5.0, users with the editor role were not allowed to administrate dashboards, folders or teams. In the 6.1 release, we have added a config option so that by default editors are admins for any Dashboard, Folder or Team they create.
|
||||
|
||||
This feature also adds a new Team permission that can be assigned to any user with the editor or viewer role and lets that user add other users to the Team.
|
||||
|
||||
We believe that this is more in line with the Grafana philosophy, as it will allow teams to be more self-organizing. This option will be made permanent if it gets positive feedback from the community so let us know what you think in the [issue on GitHub](https://github.com/grafana/grafana/issues/15590).
|
||||
|
||||
To turn this feature on add the following [config option](/installation/configuration/#editors-can-admin) to your Grafana ini file in the `users` section and then restart the Grafana server:
|
||||
|
||||
```ini
|
||||
[users]
|
||||
editors_can_admin = true
|
||||
```
|
||||
|
||||
### Minor Features and Fixes
|
||||
|
||||
This release contains a lot of small features and fixes:
|
||||
|
||||
- A new keyboard shortcut `d l` toggles all Graph legends in a dashboard.
|
||||
- A small bug fix for Elasticsearch - template variables in the alias field now work properly.
|
||||
- Some new capabilities have been added for datasource plugins that will be of interest to plugin authors:
|
||||
- a new oauth pass-through option.
|
||||
- it is now possible to add user details to requests sent to the dataproxy.
|
||||
- Heatmap and Explore fixes.
|
||||
|
||||
Checkout the [CHANGELOG.md](https://github.com/grafana/grafana/blob/master/CHANGELOG.md) file for a complete list of new features, changes, and bug fixes.
|
||||
|
||||
A huge thanks to our community for all the reported issues, bug fixes and feedback.
|
||||
@@ -152,6 +152,7 @@ Content-Type: application/json
|
||||
PUT /api/alert-notifications/1 HTTP/1.1
|
||||
Accept: application/json
|
||||
Content-Type: application/json
|
||||
Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk
|
||||
|
||||
```
|
||||
|
||||
@@ -170,7 +171,7 @@ Content-Type: application/json
|
||||
Deletes an existing notification channel identified by uid.
|
||||
|
||||
**Example Request**:
|
||||
**Example Request**:
|
||||
|
||||
```http
|
||||
DELETE /api/alert-notifications/uid/team-a-email-notifier HTTP/1.1
|
||||
Accept: application/json
|
||||
@@ -198,6 +199,7 @@ Content-Type: application/json
|
||||
DELETE /api/alert-notifications/1 HTTP/1.1
|
||||
Accept: application/json
|
||||
Content-Type: application/json
|
||||
Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk
|
||||
```
|
||||
|
||||
**Example Response**:
|
||||
@@ -217,7 +219,7 @@ Content-Type: application/json
|
||||
|
||||
**Example Request**:
|
||||
|
||||
**Example Request**:
|
||||
```http
|
||||
POST /api/alert-notifications/test HTTP/1.1
|
||||
Accept: application/json
|
||||
Content-Type: application/json
|
||||
@@ -247,7 +249,7 @@ Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk
|
||||
|
||||
{
|
||||
"id": 1,
|
||||
"uid": "cIBgcSjkk",
|
||||
"uid": "new-alert-notification", // optional
|
||||
"name": "new alert notification", //Required
|
||||
"type": "email", //Required
|
||||
"isDefault": false,
|
||||
@@ -267,7 +269,7 @@ Content-Type: application/json
|
||||
|
||||
{
|
||||
"id": 1,
|
||||
"uid": "cIBgcSjkk",
|
||||
"uid": "new-alert-notification",
|
||||
"name": "new alert notification",
|
||||
"type": "email",
|
||||
"isDefault": false,
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"company": "Grafana Labs"
|
||||
},
|
||||
"name": "grafana",
|
||||
"version": "6.1.0-pre",
|
||||
"version": "6.1.1",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "http://github.com/grafana/grafana.git"
|
||||
|
||||
@@ -72,7 +72,7 @@ export class Input extends PureComponent<Props> {
|
||||
const inputElementProps = this.populateEventPropsWithStatus(restProps, validationEvents);
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div style={{ flexGrow: 1 }}>
|
||||
<input {...inputElementProps} className={inputClassName} />
|
||||
{error && !hideErrorMessage && <span>{error}</span>}
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`Input renders correctly 1`] = `
|
||||
<div>
|
||||
<div
|
||||
style={
|
||||
Object {
|
||||
"flexGrow": 1,
|
||||
}
|
||||
}
|
||||
>
|
||||
<input
|
||||
className="gf-form-input"
|
||||
/>
|
||||
|
||||
@@ -178,8 +178,8 @@ exports[`Render should render with base threshold 1`] = `
|
||||
},
|
||||
"name": "Grafana Dark",
|
||||
"panelPadding": Object {
|
||||
"horizontal": 10,
|
||||
"vertical": 5,
|
||||
"horizontal": 16,
|
||||
"vertical": 8,
|
||||
},
|
||||
"spacing": Object {
|
||||
"d": "14px",
|
||||
@@ -335,8 +335,8 @@ exports[`Render should render with base threshold 1`] = `
|
||||
},
|
||||
"name": "Grafana Dark",
|
||||
"panelPadding": Object {
|
||||
"horizontal": 10,
|
||||
"vertical": 5,
|
||||
"horizontal": 16,
|
||||
"vertical": 8,
|
||||
},
|
||||
"spacing": Object {
|
||||
"d": "14px",
|
||||
@@ -465,7 +465,13 @@ exports[`Render should render with base threshold 1`] = `
|
||||
type="text"
|
||||
value="Base"
|
||||
>
|
||||
<div>
|
||||
<div
|
||||
style={
|
||||
Object {
|
||||
"flexGrow": 1,
|
||||
}
|
||||
}
|
||||
>
|
||||
<input
|
||||
className="gf-form-input"
|
||||
readOnly={true}
|
||||
|
||||
@@ -197,7 +197,9 @@ $side-menu-width: 60px;
|
||||
|
||||
// dashboard
|
||||
$dashboard-padding: $space-md;
|
||||
$panel-padding: 0 $space-md $space-sm $space-md;
|
||||
$panel-padding: 0 ${theme.panelPadding.horizontal}px ${theme.panelPadding.vertical}px ${
|
||||
theme.panelPadding.horizontal
|
||||
}px;
|
||||
|
||||
// tabs
|
||||
$tabs-padding: 10px 15px 9px;
|
||||
|
||||
@@ -67,8 +67,8 @@ const theme: GrafanaThemeCommons = {
|
||||
},
|
||||
},
|
||||
panelPadding: {
|
||||
horizontal: 10,
|
||||
vertical: 5,
|
||||
horizontal: 16,
|
||||
vertical: 8,
|
||||
},
|
||||
zIndex: {
|
||||
dropdown: '1000',
|
||||
|
||||
@@ -261,6 +261,10 @@ func UpdateAlertNotification(c *m.ReqContext, cmd m.UpdateAlertNotificationComma
|
||||
return Error(500, "Failed to update alert notification", err)
|
||||
}
|
||||
|
||||
if cmd.Result == nil {
|
||||
return Error(404, "Alert notification not found", nil)
|
||||
}
|
||||
|
||||
return JSON(200, dtos.NewAlertNotification(cmd.Result))
|
||||
}
|
||||
|
||||
@@ -272,6 +276,10 @@ func UpdateAlertNotificationByUID(c *m.ReqContext, cmd m.UpdateAlertNotification
|
||||
return Error(500, "Failed to update alert notification", err)
|
||||
}
|
||||
|
||||
if cmd.Result == nil {
|
||||
return Error(404, "Alert notification not found", nil)
|
||||
}
|
||||
|
||||
return JSON(200, dtos.NewAlertNotification(cmd.Result))
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ type AlertNotification struct {
|
||||
}
|
||||
|
||||
type CreateAlertNotificationCommand struct {
|
||||
Uid string `json:"-"`
|
||||
Uid string `json:"uid"`
|
||||
Name string `json:"name" binding:"Required"`
|
||||
Type string `json:"type" binding:"Required"`
|
||||
SendReminder bool `json:"sendReminder"`
|
||||
@@ -54,6 +54,7 @@ type CreateAlertNotificationCommand struct {
|
||||
|
||||
type UpdateAlertNotificationCommand struct {
|
||||
Id int64 `json:"id" binding:"Required"`
|
||||
Uid string `json:"uid"`
|
||||
Name string `json:"name" binding:"Required"`
|
||||
Type string `json:"type" binding:"Required"`
|
||||
SendReminder bool `json:"sendReminder"`
|
||||
@@ -68,6 +69,7 @@ type UpdateAlertNotificationCommand struct {
|
||||
|
||||
type UpdateAlertNotificationWithUidCommand struct {
|
||||
Uid string `json:"-"`
|
||||
NewUid string `json:"uid"`
|
||||
Name string `json:"name" binding:"Required"`
|
||||
Type string `json:"type" binding:"Required"`
|
||||
SendReminder bool `json:"sendReminder"`
|
||||
|
||||
@@ -317,6 +317,10 @@ func UpdateAlertNotification(cmd *m.UpdateAlertNotificationCommand) error {
|
||||
current.SendReminder = cmd.SendReminder
|
||||
current.DisableResolveMessage = cmd.DisableResolveMessage
|
||||
|
||||
if cmd.Uid != "" {
|
||||
current.Uid = cmd.Uid
|
||||
}
|
||||
|
||||
if current.SendReminder {
|
||||
if cmd.Frequency == "" {
|
||||
return m.ErrNotificationFrequencyNotFound
|
||||
@@ -356,8 +360,13 @@ func UpdateAlertNotificationWithUid(cmd *m.UpdateAlertNotificationWithUidCommand
|
||||
return fmt.Errorf("Cannot update, alert notification uid %s doesn't exist", cmd.Uid)
|
||||
}
|
||||
|
||||
if cmd.NewUid == "" {
|
||||
cmd.NewUid = cmd.Uid
|
||||
}
|
||||
|
||||
updateNotification := &m.UpdateAlertNotificationCommand{
|
||||
Id: current.Id,
|
||||
Uid: cmd.NewUid,
|
||||
Name: cmd.Name,
|
||||
Type: cmd.Type,
|
||||
SendReminder: cmd.SendReminder,
|
||||
@@ -373,6 +382,8 @@ func UpdateAlertNotificationWithUid(cmd *m.UpdateAlertNotificationWithUidCommand
|
||||
return err
|
||||
}
|
||||
|
||||
cmd.Result = updateNotification.Result
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ var (
|
||||
)
|
||||
|
||||
func init() {
|
||||
legendFormat = regexp.MustCompile(`\[\[(\w+?)*\]\]*|\$\s*(\w+?)*`)
|
||||
legendFormat = regexp.MustCompile(`\[\[(\w+)(\.\w+)*\]\]*|\$\s*(\w+?)*`)
|
||||
}
|
||||
|
||||
func (rp *ResponseParser) Parse(response *Response, query *Query) *tsdb.QueryResult {
|
||||
|
||||
@@ -75,7 +75,10 @@ func TestInfluxdbResponseParser(t *testing.T) {
|
||||
{
|
||||
Name: "cpu.upc",
|
||||
Columns: []string{"time", "mean", "sum"},
|
||||
Tags: map[string]string{"datacenter": "America"},
|
||||
Tags: map[string]string{
|
||||
"datacenter": "America",
|
||||
"dc.region.name": "Northeast",
|
||||
},
|
||||
Values: [][]interface{}{
|
||||
{json.Number("111"), json.Number("222"), json.Number("333")},
|
||||
},
|
||||
@@ -159,6 +162,13 @@ func TestInfluxdbResponseParser(t *testing.T) {
|
||||
|
||||
So(result.Series[0].Name, ShouldEqual, "alias America")
|
||||
})
|
||||
|
||||
Convey("tag alias with periods", func() {
|
||||
query := &Query{Alias: "alias [[tag_dc.region.name]]"}
|
||||
result := parser.Parse(response, query)
|
||||
|
||||
So(result.Series[0].Name, ShouldEqual, "alias Northeast")
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -139,7 +139,7 @@ export class QueryEditorRow extends PureComponent<Props, State> {
|
||||
// give angular time to compile
|
||||
setTimeout(() => {
|
||||
this.setState({ hasTextEditMode: !!this.angularScope.toggleEditorMode });
|
||||
}, 10);
|
||||
}, 100);
|
||||
}
|
||||
|
||||
onToggleCollapse = () => {
|
||||
|
||||
@@ -9,6 +9,12 @@ import locationUtil from 'app/core/utils/location_util';
|
||||
import kbn from 'app/core/utils/kbn';
|
||||
import { store } from 'app/store/store';
|
||||
|
||||
export const queryParamsToPreserve: { [key: string]: boolean } = {
|
||||
kiosk: true,
|
||||
autofitpanels: true,
|
||||
orgId: true,
|
||||
};
|
||||
|
||||
export class PlaylistSrv {
|
||||
private cancelPromise: any;
|
||||
private dashboards: Array<{ url: string }>;
|
||||
@@ -41,9 +47,7 @@ export class PlaylistSrv {
|
||||
|
||||
const dash = this.dashboards[this.index];
|
||||
const queryParams = this.$location.search();
|
||||
const filteredParams = _.pickBy(queryParams, key => {
|
||||
return key === 'kiosk' || key === 'autofitpanels' || key === 'orgId';
|
||||
});
|
||||
const filteredParams = _.pickBy(queryParams, (value: any, key: string) => queryParamsToPreserve[key]);
|
||||
const nextDashboardUrl = locationUtil.stripBaseFromUrl(dash.url);
|
||||
|
||||
// this is done inside timeout to make sure digest happens after
|
||||
|
||||
@@ -8,13 +8,13 @@ export default class DefaultVariableQueryEditor extends PureComponent<VariableQu
|
||||
this.state = { value: props.query };
|
||||
}
|
||||
|
||||
handleChange(event) {
|
||||
this.setState({ value: event.target.value });
|
||||
}
|
||||
onChange = (event: React.FormEvent<HTMLInputElement>) => {
|
||||
this.setState({ value: event.currentTarget.value });
|
||||
};
|
||||
|
||||
handleBlur(event) {
|
||||
this.props.onChange(event.target.value, event.target.value);
|
||||
}
|
||||
onBlur = (event: React.FormEvent<HTMLInputElement>) => {
|
||||
this.props.onChange(event.currentTarget.value, event.currentTarget.value);
|
||||
};
|
||||
|
||||
render() {
|
||||
return (
|
||||
@@ -24,8 +24,8 @@ export default class DefaultVariableQueryEditor extends PureComponent<VariableQu
|
||||
type="text"
|
||||
className="gf-form-input"
|
||||
value={this.state.value}
|
||||
onChange={this.handleChange}
|
||||
onBlur={this.handleBlur}
|
||||
onChange={this.onChange}
|
||||
onBlur={this.onBlur}
|
||||
placeholder="metric name or tags query"
|
||||
required
|
||||
/>
|
||||
|
||||
@@ -112,6 +112,7 @@ export class CloudWatchQueryParameterCtrl {
|
||||
query = $scope.datasource.getDimensionKeys($scope.target.namespace, $scope.target.region);
|
||||
} else if (segment.type === 'value') {
|
||||
const dimensionKey = $scope.dimSegments[$index - 2].value;
|
||||
delete target.dimensions[dimensionKey];
|
||||
query = $scope.datasource.getDimensionValues(
|
||||
target.region,
|
||||
target.namespace,
|
||||
|
||||
@@ -966,7 +966,6 @@ export class FuncInstance {
|
||||
const str = this.def.name + '(';
|
||||
|
||||
const parameters = _.map(this.params, (value, index) => {
|
||||
const valueInterpolated = replaceVariables(value);
|
||||
let paramType;
|
||||
|
||||
if (index < this.def.params.length) {
|
||||
@@ -980,6 +979,8 @@ export class FuncInstance {
|
||||
return value;
|
||||
}
|
||||
|
||||
const valueInterpolated = _.isString(value) ? replaceVariables(value) : value;
|
||||
|
||||
// param types that might be quoted
|
||||
// To quote variables correctly we need to interpolate it to check if it contains a numeric or string value
|
||||
if (_.includes(['int_or_interval', 'node_or_tag'], paramType) && _.isFinite(+valueInterpolated)) {
|
||||
|
||||
@@ -19,6 +19,7 @@ export default class GraphiteQuery {
|
||||
this.datasource = datasource;
|
||||
this.target = target;
|
||||
this.templateSrv = templateSrv;
|
||||
this.scopedVars = scopedVars;
|
||||
this.parseTarget();
|
||||
|
||||
this.removeTagValue = '-- remove tag --';
|
||||
@@ -162,7 +163,9 @@ export default class GraphiteQuery {
|
||||
|
||||
updateModelTarget(targets) {
|
||||
const wrapFunction = (target: string, func: any) => {
|
||||
return func.render(target, this.templateSrv.replace);
|
||||
return func.render(target, (value: string) => {
|
||||
return this.templateSrv.replace(value, this.scopedVars);
|
||||
});
|
||||
};
|
||||
|
||||
if (!this.target.textEditor) {
|
||||
|
||||
@@ -31,7 +31,8 @@ describe('when creating func instance from func names', () => {
|
||||
});
|
||||
|
||||
function replaceVariablesDummy(str: string) {
|
||||
return str;
|
||||
// important that this does replace
|
||||
return str.replace('asdasdas', 'asdsad');
|
||||
}
|
||||
|
||||
describe('when rendering func instance', () => {
|
||||
|
||||
@@ -398,7 +398,13 @@ Array [
|
||||
>
|
||||
Alias By
|
||||
</label>
|
||||
<div>
|
||||
<div
|
||||
style={
|
||||
Object {
|
||||
"flexGrow": 1,
|
||||
}
|
||||
}
|
||||
>
|
||||
<input
|
||||
className="gf-form-input gf-form-input width-24"
|
||||
onChange={[Function]}
|
||||
@@ -426,7 +432,13 @@ Array [
|
||||
>
|
||||
Project
|
||||
</span>
|
||||
<div>
|
||||
<div
|
||||
style={
|
||||
Object {
|
||||
"flexGrow": 1,
|
||||
}
|
||||
}
|
||||
>
|
||||
<input
|
||||
className="gf-form-input gf-form-input width-15"
|
||||
disabled={true}
|
||||
|
||||
@@ -200,7 +200,7 @@ $side-menu-width: 60px;
|
||||
|
||||
// dashboard
|
||||
$dashboard-padding: $space-md;
|
||||
$panel-padding: 0 $space-md $space-sm $space-md;
|
||||
$panel-padding: 0 16px 8px 16px;
|
||||
|
||||
// tabs
|
||||
$tabs-padding: 10px 15px 9px;
|
||||
|
||||
@@ -18,7 +18,9 @@ RUN pip install -U awscli crcmod && \
|
||||
apt-get autoremove -y && \
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
ln -s /opt/google-cloud-sdk/bin/gsutil /usr/bin/gsutil && \
|
||||
ln -s /opt/google-cloud-sdk/bin/gcloud /usr/bin/gcloud
|
||||
ln -s /opt/google-cloud-sdk/bin/gcloud /usr/bin/gcloud && \
|
||||
mkdir -p /deb-repo /rpm-repo && \
|
||||
chown circleci:circleci /deb-repo /rpm-repo
|
||||
|
||||
COPY --from=0 /go/bin/aptly /usr/local/bin/aptly
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
_version="1.2.1"
|
||||
_version="1.2.2"
|
||||
_tag="grafana/grafana-ci-deploy:${_version}"
|
||||
|
||||
docker build -t $_tag .
|
||||
|
||||
@@ -6,8 +6,8 @@ EXTRA_OPTS="$@"
|
||||
|
||||
# Right now we hack this in into the publish script.
|
||||
# Eventually we might want to keep a list of all previous releases somewhere.
|
||||
_releaseNoteUrl="https://community.grafana.com/t/release-notes-v6-0-x/14010"
|
||||
_whatsNewUrl="http://docs.grafana.org/guides/whats-new-in-v6-0/"
|
||||
_releaseNoteUrl="https://community.grafana.com/t/release-notes-v6-1-x/15772"
|
||||
_whatsNewUrl="http://docs.grafana.org/guides/whats-new-in-v6-1/"
|
||||
|
||||
./scripts/build/release_publisher/release_publisher \
|
||||
--wn ${_whatsNewUrl} \
|
||||
|
||||
@@ -14,21 +14,21 @@ const changelogTaskRunner: TaskRunner<ChangelogOptions> = async ({ milestone })
|
||||
timeout: 10000,
|
||||
});
|
||||
|
||||
if (!/^\d+$/.test(milestone)) {
|
||||
console.log('Use milestone number not title, find number in milestone url');
|
||||
return;
|
||||
}
|
||||
|
||||
const res = await client.get('/issues', {
|
||||
params: {
|
||||
state: 'closed',
|
||||
per_page: 100,
|
||||
labels: 'add to changelog',
|
||||
milestone: milestone,
|
||||
},
|
||||
});
|
||||
|
||||
const issues = res.data.filter(item => {
|
||||
if (!item.milestone) {
|
||||
console.log('Item missing milestone', item.number);
|
||||
return false;
|
||||
}
|
||||
return item.milestone.title === milestone;
|
||||
});
|
||||
const issues = res.data;
|
||||
|
||||
const bugs = _.sortBy(
|
||||
issues.filter(item => {
|
||||
|
||||
@@ -27,13 +27,10 @@ const cherryPickRunner: TaskRunner<CherryPickOptions> = async () => {
|
||||
continue;
|
||||
}
|
||||
|
||||
console.log(item.number + ' closed_at ' + item.closed_at + ' ' + item.html_url);
|
||||
console.log(`${item.title} (${item.number}) closed_at ${item.closed_at}`);
|
||||
console.log(`\tURL: ${item.closed_at} ${item.html_url}`);
|
||||
const issueDetails = await client.get(item.pull_request.url);
|
||||
const commits = await client.get(issueDetails.data.commits_url);
|
||||
|
||||
for (const commit of commits.data) {
|
||||
console.log(commit.commit.message + ' sha: ' + commit.sha);
|
||||
}
|
||||
console.log(`\tMerge sha: ${issueDetails.data.merge_commit_sha}`);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
'autoprefixer': {},
|
||||
'postcss-reporter': {},
|
||||
'postcss-browser-reporter': {},
|
||||
}
|
||||
}
|
||||
module.exports = () => {
|
||||
return {
|
||||
plugins: {
|
||||
autoprefixer: {},
|
||||
'postcss-reporter': {},
|
||||
'postcss-browser-reporter': {},
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
@@ -19,7 +19,7 @@ module.exports = function(options) {
|
||||
loader: 'postcss-loader',
|
||||
options: {
|
||||
sourceMap: options.sourceMap,
|
||||
config: { path: __dirname + '/postcss.config.js' },
|
||||
config: { path: __dirname },
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user