.github/workflows/ci.yml
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
permissions: read-all
jobs:
build:
runs-on: ubuntu-latest
env:
GRAFANA_ACCESS_POLICY_TOKEN: ${{ secrets.GRAFANA_ACCESS_POLICY_TOKEN }}
steps:
- uses: actions/checkout@v4
# pnpm action uses the packageManager field in package.json to
# understand which version to install.
- uses: pnpm/action-setup@v3
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'pnpm'
cache-dependency-path: pnpm-lock.yaml
- name: Install dependencies
run: pnpm install --frozen-lockfile --prefer-offline
- name: Check types
run: pnpm run typecheck
- name: Lint
run: pnpm run lint
- name: Unit tests
run: pnpm run test:ci
- name: Build frontend
run: pnpm run build
- name: Check for backend
id: check-for-backend
run: |
if [ -f "Magefile.go" ]
then
echo "has-backend=true" >> $GITHUB_OUTPUT
fi
- name: Setup Go environment
if: steps.check-for-backend.outputs.has-backend == 'true'
uses: actions/setup-go@v5
with:
go-version-file: go.mod
check-latest: true
- name: Test backend
if: steps.check-for-backend.outputs.has-backend == 'true'
uses: magefile/mage-action@v3
with:
version: latest
args: coverage
- name: Build backend
if: steps.check-for-backend.outputs.has-backend == 'true'
uses: magefile/mage-action@v3
with:
version: latest
args: buildAll
- name: Warn missing Grafana access policy token
run: |
echo Please generate a Grafana access policy token: https://grafana.com/developers/plugin-tools/publish-a-plugin/sign-a-plugin#generate-an-access-policy-token
echo Once done please follow the instructions found here: https://github.com/${{github.repository}}/blob/main/README.md#using-github-actions-release-workflow
if: ${{ env.GRAFANA_ACCESS_POLICY_TOKEN == '' }}
- name: Sign plugin
run: pnpm run sign
if: ${{ env.GRAFANA_ACCESS_POLICY_TOKEN != '' }}
- name: Get plugin metadata
id: metadata
run: |
sudo apt-get install jq
export GRAFANA_PLUGIN_ID=$(cat dist/plugin.json | jq -r .id)
export GRAFANA_PLUGIN_VERSION=$(cat dist/plugin.json | jq -r .info.version)
export GRAFANA_PLUGIN_ARTIFACT=${GRAFANA_PLUGIN_ID}-${GRAFANA_PLUGIN_VERSION}.zip
echo "plugin-id=${GRAFANA_PLUGIN_ID}" >> $GITHUB_OUTPUT
echo "plugin-version=${GRAFANA_PLUGIN_VERSION}" >> $GITHUB_OUTPUT
echo "archive=${GRAFANA_PLUGIN_ARTIFACT}" >> $GITHUB_OUTPUT
- name: Package plugin
id: package-plugin
run: |
mv dist ${{ steps.metadata.outputs.plugin-id }}
zip ${{ steps.metadata.outputs.archive }} ${{ steps.metadata.outputs.plugin-id }} -r
- name: Archive Build
uses: actions/upload-artifact@v4
with:
name: ${{ steps.metadata.outputs.plugin-id }}-${{ steps.metadata.outputs.plugin-version }}
path: ${{ steps.metadata.outputs.plugin-id }}
retention-days: 5
- name: Code Climate - Check environment
id: check-for-codeclimate
env:
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
run: |
if [ ! -z $CC_TEST_REPORTER_ID ]
then
echo "has-codeclimate=true" >> $GITHUB_OUTPUT
fi
- name: Code Climate - Run
if: steps.check-for-codeclimate.outputs.has-codeclimate == 'true'
run: |
mkdir -p ccbin/
curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./ccbin/cc-test-reporter
chmod +x ./ccbin/cc-test-reporter
./ccbin/cc-test-reporter format-coverage -t lcov -o out/codeclimate.frontend.json coverage/lcov.info
npx jest --ci --runInBand --reporters=default --reporters=jest-junit
- name: Code Climate - Upload
if: steps.check-for-codeclimate.outputs.has-codeclimate == 'true'
env:
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
run: |
./ccbin/cc-test-reporter sum-coverage out/codeclimate.*.json -d -p 1 -o out/codeclimate.total.json
./ccbin/cc-test-reporter upload-coverage -i out/codeclimate.total.json
- name: E2E - Check for playwright
id: e2e-check-for-playwright
run: |
if [ -d "playwright" ]
then
echo "has-e2e-playwright=true" >> $GITHUB_OUTPUT
fi
- name: E2E - Start Grafana in Docker
if: steps.e2e-check-for-playwright.outputs.has-e2e-playwright == 'true'
run: docker-compose up -d
- name: E2E - Install playwright dependencies
if: steps.e2e-check-for-playwright.outputs.has-e2e-playwright == 'true'
run: sudo apt-get update && npx playwright install --with-deps
- name: E2E - Run tests
id: e2e-run-tests
if: steps.e2e-check-for-playwright.outputs.has-e2e-playwright == 'true'
run: pnpm run e2e:playwright
- name: E2E - Stop Grafana in Docker
if: steps.e2e-check-for-playwright.outputs.has-e2e-playwright == 'true'
run: docker-compose down
- name: E2E - Archive output
uses: actions/upload-artifact@v4
if: steps.e2e-check-for-playwright.outputs.has-e2e-playwright == 'true'
with:
name: playwright-report
path: playwright-report/
retention-days: 30