Some checks failed
Deploy analytics worker / Deploy analytics worker to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
i18n upload strings / Upload latest strings (push) Failing after 1s
Deploy bemo / Deploy bemo to ${{ (github.ref == 'refs/heads/bemo-production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
Deploy grafana resources / ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }} (push) Failing after 0s
End to end tests (dotcom) / Check for relevant changes (push) Failing after 0s
End to end tests (examples) / Check for relevant changes (push) Failing after 0s
End to end tests (mermaid readability) / Check for relevant changes (push) Failing after 1s
End to end tests (perf) / Check for relevant changes (push) Failing after 0s
Publish editor extensions / Publish editor extensions (push) Failing after 1s
Publish SDK packages / Remove the publish-packages label (push) Has been skipped
Checks / Tests & checks (push) Has been cancelled
Checks / Build all projects (push) Has been cancelled
Deploy templates / Deploy templates (push) Has been cancelled
End to end tests (dotcom) / End to end tests (dotcom) (push) Has been cancelled
End to end tests (mermaid readability) / End to end tests (mermaid readability) (push) Has been cancelled
End to end tests (perf) / End to end tests (perf) (push) Has been cancelled
Deploy .com / Deploy dotcom to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Has been cancelled
End to end tests (examples) / End to end tests (examples) (push) Has been cancelled
Publish SDK packages / Publish SDK packages (push) Has been cancelled
Publish SDK packages / Tell user released version (push) Has been cancelled
Publish SDK packages / Publishes code templates to separate repositories (push) Has been cancelled
Publish SDK packages / Deploys the template demos with the new SDK version (push) Has been cancelled
116 lines
4.6 KiB
YAML
116 lines
4.6 KiB
YAML
name: Deploy grafana resources
|
|
permissions:
|
|
contents: read
|
|
|
|
on:
|
|
pull_request:
|
|
paths:
|
|
- 'internal/grafana/**'
|
|
- '.github/workflows/deploy-grafana.yml'
|
|
push:
|
|
branches:
|
|
- main
|
|
paths:
|
|
- 'internal/grafana/**'
|
|
- '.github/workflows/deploy-grafana.yml'
|
|
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
|
|
env:
|
|
GCX_VERSION: 1.0.0
|
|
GCX_SHA256: c88c65958d19d83dc3a192a2a5037e08307a9c776019f24249b89f369c9c4d41
|
|
|
|
jobs:
|
|
deploy:
|
|
name: ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }}
|
|
# Validate and push both need the Grafana secrets, which fork PRs don't get.
|
|
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository
|
|
timeout-minutes: 10
|
|
runs-on: ubuntu-latest
|
|
concurrency: grafana-deploy-${{ github.event_name == 'push' && 'main' || github.ref }}
|
|
|
|
steps:
|
|
- name: Check out code
|
|
uses: actions/checkout@v6
|
|
|
|
- name: Install gcx
|
|
run: |
|
|
curl -fsSL -o gcx.tar.gz "https://github.com/grafana/gcx/releases/download/v${GCX_VERSION}/gcx_${GCX_VERSION}_linux_amd64.tar.gz"
|
|
echo "${GCX_SHA256} gcx.tar.gz" | sha256sum -c -
|
|
tar xzf gcx.tar.gz gcx
|
|
sudo mv gcx /usr/local/bin/gcx
|
|
gcx --version
|
|
|
|
- name: Validate resources
|
|
run: gcx resources validate -p internal/grafana/resources
|
|
env:
|
|
GRAFANA_SERVER: ${{ secrets.GRAFANA_SERVER }}
|
|
GRAFANA_TOKEN: ${{ secrets.GRAFANA_TOKEN }}
|
|
|
|
- name: Dry run
|
|
if: github.event_name == 'pull_request'
|
|
run: gcx resources push -p internal/grafana/resources --dry-run --on-error abort
|
|
env:
|
|
GRAFANA_SERVER: ${{ secrets.GRAFANA_SERVER }}
|
|
GRAFANA_TOKEN: ${{ secrets.GRAFANA_TOKEN }}
|
|
|
|
# Everything except alert rules, folders first. Two orderings matter and neither is
|
|
# the alphabetical one this glob would otherwise give: folders have to exist before
|
|
# anything annotated into them, and alert rules go last (see the step below for why).
|
|
# A commit adding a folder and a dashboard inside it lands both in one push, so the
|
|
# folder cannot be assumed to already be there.
|
|
- name: Push resources
|
|
if: github.event_name == 'push'
|
|
run: |
|
|
shopt -s nullglob
|
|
for dir in internal/grafana/resources/*folders*/; do
|
|
gcx resources push -p "$dir" --on-error abort
|
|
done
|
|
for dir in internal/grafana/resources/*/; do
|
|
case "$dir" in *folders*|*alertrules*) continue ;; esac
|
|
gcx resources push -p "$dir" --on-error abort
|
|
done
|
|
env:
|
|
GRAFANA_SERVER: ${{ secrets.GRAFANA_SERVER }}
|
|
GRAFANA_TOKEN: ${{ secrets.GRAFANA_TOKEN }}
|
|
|
|
# Alert rules are the one resource type that can fail here having passed the PR
|
|
# dry run, because alerting has no server-side dry-run — the PR reports them as
|
|
# "skipped". A newly created rule carrying group labels is rejected outright
|
|
# ("cannot set group when creating a new rule"), so the first time any new rule
|
|
# lands, this step is where it surfaces. Kept last and separate so that failure
|
|
# costs the rule, not every dashboard in the tree. Still fails the job.
|
|
- name: Push alert rules
|
|
if: github.event_name == 'push'
|
|
run: |
|
|
shopt -s nullglob
|
|
for dir in internal/grafana/resources/*alertrules*/; do
|
|
gcx resources push -p "$dir" --on-error abort
|
|
done
|
|
env:
|
|
GRAFANA_SERVER: ${{ secrets.GRAFANA_SERVER }}
|
|
GRAFANA_TOKEN: ${{ secrets.GRAFANA_TOKEN }}
|
|
|
|
# Notification templates can't go through `gcx resources push` — gcx's discovery
|
|
# registry ignores the notifications.alerting.grafana.app API group entirely — so
|
|
# template files live in templates/ (not resources/) and go through the classic
|
|
# provisioning API. The PUT is idempotent and sets `api` provenance, which locks
|
|
# UI edits the same way provisioned resources are locked.
|
|
- name: Push notification templates
|
|
if: github.event_name == 'push'
|
|
run: |
|
|
shopt -s nullglob
|
|
for f in internal/grafana/templates/*.gotmpl; do
|
|
name=$(basename "$f" .gotmpl)
|
|
jq -Rs '{template: .}' "$f" | curl -fsS -X PUT \
|
|
"$GRAFANA_SERVER/api/v1/provisioning/templates/$name" \
|
|
-H "Authorization: Bearer $GRAFANA_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d @- > /dev/null
|
|
done
|
|
env:
|
|
GRAFANA_SERVER: ${{ secrets.GRAFANA_SERVER }}
|
|
GRAFANA_TOKEN: ${{ secrets.GRAFANA_TOKEN }}
|