-
Notifications
You must be signed in to change notification settings - Fork 116
197 lines (169 loc) · 5.92 KB
/
build-binary.yml
File metadata and controls
197 lines (169 loc) · 5.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
name: Build Binary (Test Only)
# NOTE: This workflow is for testing binary builds in PRs only.
# For releases, use the _build-and-release.yml reusable workflow.
on:
pull_request:
branches: [master]
paths:
- 'src/**'
- 'packaging/binary/**'
- 'packaging/mcpb/**'
- '.github/workflows/build-binary.yml'
workflow_dispatch:
inputs:
version:
description: 'Version to build (e.g., 4.7.4)'
required: true
default: '0.0.0-dev'
# Restrict permissions by default (security best practice)
permissions:
contents: read
jobs:
build:
permissions:
contents: read
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
artifact_name: ha-mcp-linux
binary_ext: ''
platform: linux
- os: windows-latest
artifact_name: ha-mcp-windows
binary_ext: '.exe'
platform: win32
- os: macos-latest
artifact_name: ha-mcp-macos-arm64
binary_ext: ''
platform: darwin
runs-on: ${{ matrix.os }}
name: Build on ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
# Pull the skills-vendor submodule so PyInstaller's
# `collect_all('ha_mcp')` packages the bundled skill files into
# the test binary. Without this, PR CI binaries ship with an
# empty skills directory — same root cause as #1280, just on
# the PR-test path instead of the stable-release path.
submodules: true
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
version: "latest"
- name: Create virtual environment and install dependencies
run: |
uv venv .venv
uv pip install -e . pyinstaller
shell: bash
- name: Activate venv (Unix)
if: runner.os != 'Windows'
run: echo "$PWD/.venv/bin" >> $GITHUB_PATH
- name: Activate venv (Windows)
if: runner.os == 'Windows'
run: echo "$PWD/.venv/Scripts" >> $env:GITHUB_PATH
shell: pwsh
- name: Build binary
run: pyinstaller packaging/binary/ha-mcp.spec
- name: Run smoke test (Unix)
if: runner.os != 'Windows'
run: |
chmod +x dist/ha-mcp
# Run the built-in smoke test to verify all libraries are bundled
./dist/ha-mcp --smoke-test
- name: Run smoke test (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
# Run the built-in smoke test to verify all libraries are bundled
& "dist\ha-mcp.exe" --smoke-test
if ($LASTEXITCODE -ne 0) {
Write-Host "Smoke test failed with exit code $LASTEXITCODE"
exit $LASTEXITCODE
}
- name: Rename binary for artifact
shell: bash
run: |
mv dist/ha-mcp${{ matrix.binary_ext }} dist/${{ matrix.artifact_name }}${{ matrix.binary_ext }}
- name: Upload binary artifact
uses: actions/upload-artifact@v7
with:
name: ${{ matrix.artifact_name }}
path: dist/${{ matrix.artifact_name }}${{ matrix.binary_ext }}
if-no-files-found: error
create-mcpb:
needs: build
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: Download Windows binary
uses: actions/download-artifact@v8
with:
name: ha-mcp-windows
path: mcpb-bundle
- name: Download macOS binary
uses: actions/download-artifact@v8
with:
name: ha-mcp-macos-arm64
path: mcpb-bundle
- name: Set version
id: version
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
VERSION="${{ github.event.inputs.version }}"
VERSION="${VERSION:-0.0.0-dev}"
else
# For pull_request, use dev version
VERSION="0.0.0-dev"
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Building version: $VERSION"
- name: Create combined mcpb bundle
run: |
VERSION="${{ steps.version.outputs.version }}"
# Rename binaries to standard names
mv mcpb-bundle/ha-mcp-windows.exe mcpb-bundle/ha-mcp.exe
mv mcpb-bundle/ha-mcp-macos-arm64 mcpb-bundle/ha-mcp
# Copy icons to bundle (light + dark variants + main icon)
cp packaging/mcpb/icon-16.png mcpb-bundle/
cp packaging/mcpb/icon-32.png mcpb-bundle/
cp packaging/mcpb/icon-64.png mcpb-bundle/
cp packaging/mcpb/icon-128.png mcpb-bundle/
cp packaging/mcpb/icon-256.png mcpb-bundle/
cp packaging/mcpb/icon-512.png mcpb-bundle/
cp packaging/mcpb/icon-dark-16.png mcpb-bundle/
cp packaging/mcpb/icon-dark-32.png mcpb-bundle/
cp packaging/mcpb/icon-dark-64.png mcpb-bundle/
cp packaging/mcpb/icon-dark-128.png mcpb-bundle/
cp packaging/mcpb/icon-dark-256.png mcpb-bundle/
cp packaging/mcpb/icon-dark-512.png mcpb-bundle/
cp packaging/mcpb/icon-512.png mcpb-bundle/icon.png
# Generate manifest.json (multi-platform)
python packaging/mcpb/generate_manifest.py "$VERSION"
# Create .mcpb file (zip archive)
cd mcpb-bundle
zip -r ../ha-mcp.mcpb *
cd ..
# List contents for verification
echo "=== MCPB Contents ==="
unzip -l ha-mcp.mcpb
- name: Upload mcpb artifact
uses: actions/upload-artifact@v7
with:
name: ha-mcp-mcpb
path: ha-mcp.mcpb
if-no-files-found: error