Skip to content

Commit 7dc102e

Browse files
Merge branch 'main' into feature/dockerfile-non-root
2 parents b3df08f + bd3e10f commit 7dc102e

4 files changed

Lines changed: 163 additions & 4 deletions

File tree

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
name: Create Jira Ticket from GitHub Issue
2+
3+
on:
4+
issues:
5+
types: [opened]
6+
7+
jobs:
8+
create-jira-ticket:
9+
runs-on: ubuntu-latest
10+
steps:
11+
- name: Login to Jira
12+
uses: atlassian/gajira-login@v3
13+
env:
14+
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
15+
JIRA_USER_EMAIL: ${{ secrets.JIRA_EMAIL }}
16+
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
17+
18+
- name: Create Jira issue
19+
id: create
20+
uses: atlassian/gajira-create@v3
21+
with:
22+
project: ${{ secrets.JIRA_PROJECT_KEY }}
23+
issuetype: Bug
24+
summary: "[GH-${{ github.event.issue.number }}] ${{ github.event.issue.title }}"
25+
description: |
26+
*Reported via GitHub Issue:* [${{ github.event.issue.html_url }}|${{ github.event.issue.html_url }}]
27+
28+
*Reporter:* ${{ github.event.issue.user.login }}
29+
30+
*Description:*
31+
${{ github.event.issue.body }}
32+
fields: >-
33+
{
34+
"labels": ["github-issue"]
35+
}
36+
37+
- name: Comment on GitHub issue with Jira link
38+
uses: actions/github-script@v7
39+
with:
40+
script: |
41+
github.rest.issues.createComment({
42+
issue_number: context.issue.number,
43+
owner: context.repo.owner,
44+
repo: context.repo.repo,
45+
body: `A Jira ticket has been created: **[${{ steps.create.outputs.issue }}](${{ secrets.JIRA_BASE_URL }}/browse/${{ steps.create.outputs.issue }})**`
46+
})

.github/workflows/publish.yml

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
name: Publish Docker image and MCP registry entry
2+
3+
on:
4+
push:
5+
tags: ["v*"]
6+
7+
env:
8+
REGISTRY: ghcr.io
9+
IMAGE_NAME: perforce/p4mcp-server
10+
11+
jobs:
12+
publish:
13+
runs-on: ubuntu-latest
14+
permissions:
15+
contents: read
16+
packages: write
17+
id-token: write # required for OIDC auth to MCP registry
18+
19+
steps:
20+
- name: Checkout
21+
uses: actions/checkout@v4
22+
23+
- name: Set up Docker Buildx
24+
uses: docker/setup-buildx-action@v3
25+
26+
- name: Log in to GHCR
27+
uses: docker/login-action@v3
28+
with:
29+
registry: ${{ env.REGISTRY }}
30+
username: ${{ github.actor }}
31+
password: ${{ secrets.GITHUB_TOKEN }}
32+
33+
- name: Extract version from tag
34+
id: version
35+
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
36+
37+
- name: Build and push Docker image
38+
uses: docker/build-push-action@v5
39+
with:
40+
context: .
41+
push: true
42+
tags: |
43+
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}
44+
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
45+
labels: |
46+
org.opencontainers.image.source=https://github.com/perforce/p4mcp-server
47+
org.opencontainers.image.version=${{ steps.version.outputs.VERSION }}
48+
49+
- name: Install mcp-publisher
50+
run: |
51+
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
52+
curl -fsSL "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_linux_${ARCH}.tar.gz" \
53+
| tar xz mcp-publisher
54+
chmod +x mcp-publisher
55+
56+
- name: Update server.json version and image tag
57+
run: |
58+
VERSION=${{ steps.version.outputs.VERSION }}
59+
jq --arg v "$VERSION" \
60+
'.version = $v | .packages[0].identifier = "ghcr.io/perforce/p4mcp-server:\($v)"' \
61+
server.json > server.tmp && mv server.tmp server.json
62+
63+
- name: Authenticate to MCP registry (GitHub OIDC)
64+
run: ./mcp-publisher login github-oidc
65+
66+
- name: Publish to MCP registry
67+
run: ./mcp-publisher publish

Dockerfile

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
FROM python:3.12-slim
22

3+
LABEL io.modelcontextprotocol.server.name="io.github.perforce/p4mcp-server"
4+
35
# Install system dependencies
46
RUN apt-get update && apt-get install -y \
57
build-essential \
@@ -20,7 +22,6 @@ COPY src/ ./src/
2022
ENV PYTHONPATH=/app
2123
ENV P4TICKETS=/home/mcpuser/.p4tickets
2224

23-
RUN mkdir -p /app/logs && chown mcpuser:mcpuser /app/logs
24-
USER mcpuser
25-
# Run the server with HTTP transport
26-
CMD ["python3", "-m", "src.main", "--transport", "stdio"]
25+
# Run the server
26+
ENTRYPOINT ["python3", "-m", "src.main"]
27+
CMD ["--transport", "stdio"]

server.json

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3+
"name": "io.github.perforce/p4mcp-server",
4+
"title": "Perforce P4 MCP Server",
5+
"description": "Perforce P4 MCP server: changelists, files, shelves, workspaces, jobs, code reviews, and streams.",
6+
"version": "1.0.0",
7+
"repository": {
8+
"source": "github",
9+
"url": "https://github.com/perforce/p4mcp-server"
10+
},
11+
"packages": [
12+
{
13+
"registryType": "oci",
14+
"identifier": "ghcr.io/perforce/p4mcp-server:1.0.0",
15+
"runtime": {
16+
"name": "docker"
17+
},
18+
"transport": {
19+
"type": "stdio"
20+
},
21+
"environmentVariables": [
22+
{
23+
"name": "P4PORT",
24+
"description": "Perforce server address (e.g. ssl:perforce.example.com:1666)",
25+
"required": true
26+
},
27+
{
28+
"name": "P4USER",
29+
"description": "Perforce username",
30+
"required": true
31+
},
32+
{
33+
"name": "P4CLIENT",
34+
"description": "Perforce workspace/client name",
35+
"required": false
36+
},
37+
{
38+
"name": "P4PASSWD",
39+
"description": "Perforce password or ticket",
40+
"required": false
41+
}
42+
]
43+
}
44+
]
45+
}

0 commit comments

Comments
 (0)