Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
389ba81
PMM-13487 Use skaffold to build PMM
ademidoff Dec 29, 2025
e4708c8
PMM-13487 Break up the monolith pipeline to build every component
ademidoff Dec 29, 2025
f3a63d5
PMM-13487 Fix artifact extraction
ademidoff Dec 29, 2025
ef6647b
PMM-13487 Use bash as shell
ademidoff Dec 30, 2025
3b97bed
PMM-13487 New pipeline to build PMM
ademidoff Dec 30, 2025
08d0678
PMM-13487 Code formatting
ademidoff Jan 3, 2026
bace1f3
PMM-13487 Fix the exporter name
ademidoff Jan 4, 2026
9589b27
PMM-13487 Save SQL queries to a dedicated directory
ademidoff Jan 10, 2026
a4b7eed
PMM-13487 Create a docker client build script
ademidoff Jan 11, 2026
8424883
Merge branch 'v3' into PMM-13487-fresh-pipeline-to-build-pmm
ademidoff Jan 27, 2026
6dcf75c
Merge branch 'v3' into PMM-13487-build-pmm-locally
ademidoff Jan 27, 2026
541d546
PMM-13487 Enable srcam-sha-256 for setup.py
ademidoff Feb 3, 2026
6afa622
PMM-13487 Add multi-architecture build support
ademidoff Feb 3, 2026
53cc512
Merge branch 'v3' into PMM-13487-fresh-pipeline-to-build-pmm
ademidoff Feb 3, 2026
5cd5eb9
PMM-13487 Add the license header
ademidoff Feb 3, 2026
1c5686e
PMM-13487 Create multi-stage Dockerfile for the server
ademidoff Feb 3, 2026
87a373d
PMM-13487 Build server using a multi-stage Dockerfile
ademidoff Feb 14, 2026
23dc440
PMM-13487 Fix cache mount issues
ademidoff Feb 15, 2026
cd08e41
PMM-13487 Break up a monolith stage into smaller ones
ademidoff Feb 15, 2026
044dd87
PMM-13487 Fix a linter error
ademidoff Feb 16, 2026
6117207
Merge branch 'v3' into PMM-13487-a-pipeline-to-build-pmm
ademidoff Feb 16, 2026
7c2188d
Merge branch 'v3' into PMM-13487-a-pipeline-to-build-pmm
ademidoff Feb 20, 2026
81a5b8c
Merge branch 'v3' into PMM-13487-a-pipeline-to-build-pmm
ademidoff Mar 1, 2026
20d5fd4
PMM-13487 Update envvars and Dockerfile
ademidoff Mar 1, 2026
27248d4
Merge branch 'v3' into PMM-13487-a-pipeline-to-build-pmm
ademidoff Mar 15, 2026
df476ad
PMM-13487 Update echo statements
ademidoff Mar 28, 2026
6978f9b
PMM-13487 Several cache fixes and improvements
ademidoff Mar 28, 2026
602439d
Merge branch 'v3' into PMM-13487-a-pipeline-to-build-pmm
ademidoff Mar 28, 2026
c3d0332
PMM-13487 Fix file permissions
ademidoff Mar 28, 2026
27fa4cb
PMM-13487 Fix gitmodules output format
ademidoff Mar 28, 2026
43f908c
PMM-13487 Bump Go to 1.26
ademidoff Mar 28, 2026
a15ef21
PMM-13487 Migrate to individual Dockefiles
ademidoff Mar 29, 2026
afc6adf
PMM-13487 Migrate to docker run - based builds
ademidoff Mar 29, 2026
1e0117b
PMM-13487 Generate SBOM, fix pmm-builder arch params
ademidoff Mar 29, 2026
9a27125
PMM-13487 Pass yarn cache folder explicitly
ademidoff Mar 29, 2026
f119e69
PMM-13487 Optimize the Dockerfile.server
ademidoff Mar 29, 2026
5b2f37d
PMM-13487 Remove a redundant build step
ademidoff Mar 29, 2026
de43793
PMM-13487 Minor updates and fixes
ademidoff Mar 29, 2026
b30d683
Merge branch 'v3' into PMM-13487-a-pipeline-to-build-pmm
ademidoff Apr 3, 2026
b2cde51
PMM-13487 Break the dependency on submodules
ademidoff Apr 4, 2026
0df5e1e
PMM-13487 Add build logs
ademidoff Apr 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .devcontainer/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,10 @@ def setup():
# Turns fsync off. Create database operations with fsync on are very slow on Ubuntu.
# Having fsync off in dev environment is fine.
"sed -i -e \"s/#fsync = on/fsync = off/\" /srv/postgres14/postgresql.conf",
# Configure pg_hba.conf for password authentication from all hosts (dev environment only)
# Note: In dev, we allow both trust and scram-sha-256 for convenience
"echo 'host all all 0.0.0.0/0 trust' >> /srv/postgres14/pg_hba.conf",
"echo 'host all all 0.0.0.0/0 scram-sha-256' >> /srv/postgres14/pg_hba.conf",
# "supervisorctl restart postgresql",
])

Expand Down
34 changes: 34 additions & 0 deletions .github/workflows/build-pipeline.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Build Pipeline

on:
workflow_dispatch:
inputs:
target:
description: 'Build target: all | client | server'
required: true
default: 'all'
type: choice
options:
- all
- client
- server
pr_number:
description: 'PR number (informational — used for logging)'
required: false
default: ''

jobs:
build:
name: Build PMM (${{ github.event.inputs.target }})
# Requires a self-hosted runner with Docker + Minio configured.
# Adjust the runner label once the build infrastructure is in place.
runs-on: [self-hosted, pmm-builder]

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Build
run: |
cd build/pipeline
make build-${{ github.event.inputs.target }}
111 changes: 111 additions & 0 deletions .github/workflows/pmm-bot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
name: PMM Bot

on:
issue_comment:
types: [created]

jobs:
dispatch:
# Only handle PR comments that start with @pmm-bot
if: >
github.event.issue.pull_request != null &&
startsWith(github.event.comment.body, '@pmm-bot')
runs-on: ubuntu-latest
permissions:
issues: write # post comments and reactions
pull-requests: write
actions: write # trigger workflow_dispatch

steps:
- uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const body = context.payload.comment.body.trim();
const sender = context.payload.comment.user.login;
const owner = context.repo.owner;
const repo = context.repo.repo;
const issueNumber = context.payload.issue.number;
const commentId = context.payload.comment.id;

// ── 1. Permission check ──────────────────────────────────────────
let permission;
try {
const { data } = await github.rest.repos.getCollaboratorPermissionLevel({
owner, repo, username: sender,
});
permission = data.permission;
} catch (e) {
// Non-collaborators get a 404 from this endpoint.
permission = 'none';
}

if (!['write', 'admin'].includes(permission)) {
await github.rest.issues.createComment({
owner, repo, issue_number: issueNumber,
body: `@${sender} You need write access to trigger bot commands.`,
});
return;
}

// ── 2. Acknowledge ───────────────────────────────────────────────
await github.rest.reactions.createForIssueComment({
owner, repo, comment_id: commentId, content: 'eyes',
});

// ── 3. Resolve the PR branch ─────────────────────────────────────
const { data: pr } = await github.rest.pulls.get({
owner, repo, pull_number: issueNumber,
});
const ref = pr.head.ref;

// ── 4. Parse command ─────────────────────────────────────────────
// Strip the "@pmm-bot " prefix and normalise whitespace.
const cmd = body.replace(/^@pmm-bot\s+/i, '').trim().toLowerCase();

const COMMANDS = {
'rebuild all': { workflow: 'build-pipeline.yml', inputs: { target: 'all' } },
'rebuild client': { workflow: 'build-pipeline.yml', inputs: { target: 'client' } },
'rebuild server': { workflow: 'build-pipeline.yml', inputs: { target: 'server' } },
'run api tests': { workflow: 'api-tests.yml', inputs: {} },
};

const HELP_TEXT =
'**Available commands:**\n' +
'- `@pmm-bot rebuild all` — build client + server\n' +
'- `@pmm-bot rebuild client` — build client only\n' +
'- `@pmm-bot rebuild server` — build server only\n' +
'- `@pmm-bot run API tests` — run API test suite\n' +
'- `@pmm-bot help` — show this message\n';

if (cmd === 'help') {
await github.rest.issues.createComment({
owner, repo, issue_number: issueNumber, body: HELP_TEXT,
});
return;
}

if (!(cmd in COMMANDS)) {
await github.rest.issues.createComment({
owner, repo, issue_number: issueNumber,
body: `Unknown command: \`${cmd}\`\n\n${HELP_TEXT}`,
});
return;
}

// ── 5. Dispatch ──────────────────────────────────────────────────
const { workflow, inputs } = COMMANDS[cmd];
await github.rest.actions.createWorkflowDispatch({
owner, repo,
workflow_id: workflow,
ref,
inputs: { ...inputs, pr_number: String(issueNumber) },
});

// ── 6. Confirm ───────────────────────────────────────────────────
const runsUrl =
`https://github.com/${owner}/${repo}/actions/workflows/${workflow}`;
await github.rest.issues.createComment({
owner, repo, issue_number: issueNumber,
body: `@${sender} Dispatched \`${cmd}\` on branch \`${ref}\`. [View runs](${runsUrl})`,
});
10 changes: 5 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/.vscode/
*.iml

# Temprorary build files
/api/nginx/*.pem
bin/
!/documentation/resources/bin/
Expand All @@ -13,7 +14,6 @@ cover.out
crosscover.out

agent/testdata/

agent/agents/mysql/slowlog/parser/corpus/
agent/agents/mysql/slowlog/parser/crashers/
agent/agents/mysql/slowlog/parser/suppressions/
Expand All @@ -32,22 +32,22 @@ compose.yml
# ViM temporary files
*.sw[o,p]

# build ops
.env
.netrc
.modules
build.log
packer.log
ci.yml

api-tests/pmm-api-tests-output.txt
api-tests/pmm-api-tests-junit-report.xml
pmm-api-tests-output.txt
pmm-api-tests-junit-report.xml

packer.log
encryption.key

/tmp/
settings.json
GEMINI.md
RTA-Jira-Tasks-Summary.md

# PMM Demo backups (it would increase repository size significantly)
dev/clickhouse-backups/
125 changes: 104 additions & 21 deletions build/ansible/roles/pmm-images/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,6 @@
- name: List installed gpg keys
command: ls -la /etc/pki/rpm-gpg

# Local yum repo for building pmm server docker image in autobuild jobs
- name: Add a local YUM repository
yum_repository:
name: local
description: Local YUM repository - x86_64
baseurl: file:///tmp/RPMS
gpgcheck: no
enabled: no

- name: Update OS packages
dnf:
name: "*"
Expand Down Expand Up @@ -96,18 +87,110 @@
- /var/lib/cloud/scripts/per-once
- /var/lib/cloud/scripts/per-boot

- name: Install PMM Server components
dnf:
name:
- percona-grafana
- percona-victoriametrics
- percona-qan-api2
- percona-dashboards
- pmm-managed
- pmm-dump
- vmproxy
state: installed
enablerepo: local
- name: Create server component directories
file:
path: "{{ item }}"
state: directory
owner: pmm
group: root
mode: 0775
loop:
- /usr/share/grafana
- /usr/share/pmm-managed
- /usr/share/pmm-ui
- /usr/share/percona-dashboards
- /usr/share/percona-dashboards/panels
- /usr/local/percona
- /usr/local/percona/advisors
- /usr/local/percona/checks
- /usr/local/percona/alerting-templates
- /var/lib/grafana

- name: Install Go binaries
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
owner: root
group: root
mode: "0755"
remote_src: yes
loop:
- { src: /opt/pmm-staging/pmm-managed/bin/pmm-managed, dest: /usr/sbin/pmm-managed }
- { src: /opt/pmm-staging/pmm-managed/bin/pmm-encryption-rotation, dest: /usr/sbin/pmm-encryption-rotation }
- { src: /opt/pmm-staging/pmm-managed/bin/pmm-managed-init, dest: /usr/sbin/pmm-managed-init }
- { src: /opt/pmm-staging/pmm-managed/bin/pmm-managed-starlark, dest: /usr/sbin/pmm-managed-starlark }
- { src: /opt/pmm-staging/pmm-managed/bin/qan-api2, dest: /usr/sbin/percona-qan-api2 }
- { src: /opt/pmm-staging/pmm-managed/bin/vmproxy, dest: /usr/sbin/vmproxy }
- { src: /opt/pmm-staging/pmm-dump/pmm-dump, dest: /usr/sbin/pmm-dump }
- { src: /opt/pmm-staging/grafana-go/grafana-server, dest: /usr/sbin/grafana-server }
- { src: /opt/pmm-staging/grafana-go/grafana, dest: /usr/sbin/grafana }
- { src: /opt/pmm-staging/grafana-go/grafana-cli, dest: /usr/bin/grafana-cli }
- { src: /opt/pmm-staging/victoriametrics/victoria-metrics-pure, dest: /usr/sbin/victoriametrics }
- { src: /opt/pmm-staging/victoriametrics/vmalert-pure, dest: /usr/sbin/vmalert }

- name: Install Grafana UI assets
command: cp -rT /opt/pmm-staging/grafana-ui/{{ item.src }} /usr/share/grafana/{{ item.dest }}
loop:
- { src: public, dest: public }
- { src: conf, dest: conf }
- { src: tools, dest: tools }

- name: Install Grafana configuration files
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
owner: pmm
group: root
mode: "0644"
remote_src: yes
loop:
- { src: /opt/pmm-staging/grafana-ui/conf/sample.ini, dest: /etc/grafana/grafana.ini }
- { src: /opt/pmm-staging/grafana-ui/conf/ldap.toml, dest: /etc/grafana/ldap.toml }

- name: Install pmm-managed data assets
command: cp -rT /opt/pmm-staging/pmm-managed/data/{{ item.src }} {{ item.dest }}
loop:
- { src: swagger, dest: /usr/share/pmm-managed/swagger }
- { src: advisors, dest: /usr/local/percona/advisors }
- { src: checks, dest: /usr/local/percona/checks }
- { src: alerting-templates, dest: /usr/local/percona/alerting-templates }

- name: Install PMM UI assets
command: cp -rT /opt/pmm-staging/pmm-ui/{{ item.src }} {{ item.dest }}
loop:
- { src: pmm-dist, dest: /usr/share/pmm-ui }
- { src: pmm-compat-dist, dest: /usr/share/percona-dashboards/panels/pmm-compat-app }

- name: Install percona-dashboards assets
command: cp -rT /opt/pmm-staging/pmm-dashboards/{{ item.src }} {{ item.dest }}
loop:
- { src: panels, dest: /usr/share/percona-dashboards/panels }
- { src: pmm-app-dist, dest: /usr/share/percona-dashboards/panels/pmm-app }

- name: Install VERSION.json
copy:
src: /opt/pmm-staging/version.json
dest: /usr/share/pmm-server/VERSION.json
owner: root
group: root
mode: "0644"
remote_src: yes

- name: Set ownership on pmm-owned assets
file:
path: "{{ item }}"
state: directory
owner: pmm
group: root
recurse: yes
loop:
- /usr/share/grafana
- /usr/share/pmm-managed
- /usr/share/pmm-ui
- /usr/share/percona-dashboards
- /usr/local/percona



- name: Configure grafana
include_role:
Expand Down
3 changes: 2 additions & 1 deletion build/docker/server/Dockerfile.el9
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ RUN --mount=type=cache,target=/var/cache/dnf \
ansible-collection-ansible-posix \
glibc-langpack-en \
dnf \
vi
vi && \
dnf -y remove microdnf

COPY entrypoint.sh /opt/entrypoint.sh
COPY ansible /opt/ansible
Expand Down
Loading
Loading