Skip to content

Commit 790da24

Browse files
committed
feat: workflow
1 parent 0104774 commit 790da24

3 files changed

Lines changed: 239 additions & 2 deletions

File tree

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
name: Build and Release
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v*'
7+
workflow_dispatch:
8+
inputs:
9+
draft:
10+
description: 'Create as draft release'
11+
type: boolean
12+
default: true
13+
14+
jobs:
15+
build-linux:
16+
runs-on: ubuntu-latest
17+
steps:
18+
- uses: actions/checkout@v4
19+
20+
- uses: actions/setup-python@v5
21+
with:
22+
python-version: '3.x'
23+
24+
- name: Install Python dependencies
25+
run: pip install cx_Freeze pynput Pillow requests
26+
27+
- name: Install system dependencies
28+
run: sudo apt-get install -y imagemagick zsync python3-tk libfuse2
29+
30+
- name: Build AppImage
31+
run: bash build.sh
32+
33+
- name: Upload AppImage artifacts
34+
uses: actions/upload-artifact@v4
35+
with:
36+
name: linux-appimage
37+
path: |
38+
PyMacroRecord-*.AppImage
39+
PyMacroRecord-*.AppImage.zsync
40+
41+
build-windows:
42+
runs-on: windows-latest
43+
steps:
44+
- uses: actions/checkout@v4
45+
46+
- uses: actions/setup-python@v5
47+
with:
48+
python-version: '3.x'
49+
50+
- name: Install Python dependencies
51+
run: pip install pyinstaller pynput Pillow requests pystray
52+
53+
- name: Download UPX
54+
shell: pwsh
55+
run: |
56+
Invoke-WebRequest -Uri "https://github.com/upx/upx/releases/download/v4.2.4/upx-4.2.4-win64.zip" -OutFile upx.zip
57+
Expand-Archive upx.zip -DestinationPath upx_tmp
58+
New-Item -ItemType Directory -Force -Path upx | Out-Null
59+
Copy-Item upx_tmp\upx-4.2.4-win64\upx.exe upx\
60+
Remove-Item -Recurse -Force upx.zip, upx_tmp
61+
62+
- name: Build portable exe (onefile)
63+
run: >
64+
pyinstaller --noconfirm --onefile --windowed
65+
--icon "src/assets/logo.ico"
66+
--name "PyMacroRecord-portable"
67+
--contents-directory "."
68+
--upx-dir upx
69+
--add-data "src/assets;assets/"
70+
--add-data "src/langs;langs/"
71+
--add-data "src/hotkeys;hotkeys/"
72+
--add-data "src/macro;macro/"
73+
--add-data "src/utils;utils/"
74+
--add-data "src/windows;windows/"
75+
"src/main.py"
76+
77+
- name: Build folder exe (for setup installer)
78+
run: >
79+
pyinstaller --noconfirm --windowed
80+
--icon "src/assets/logo.ico"
81+
--name "PyMacroRecord"
82+
--upx-dir upx
83+
--add-data "src/assets;assets/"
84+
--add-data "src/langs;langs/"
85+
--add-data "src/hotkeys;hotkeys/"
86+
--add-data "src/macro;macro/"
87+
--add-data "src/utils;utils/"
88+
--add-data "src/windows;windows/"
89+
"src/main.py"
90+
91+
- name: Get version
92+
id: version
93+
shell: pwsh
94+
run: |
95+
$content = Get-Content src/utils/version.py -Raw
96+
$v = [regex]::Match($content, 'version\s*=\s*"([\d.]+)"').Groups[1].Value
97+
echo "VALUE=$v" >> $env:GITHUB_OUTPUT
98+
99+
- name: Build setup installer (Inno Setup)
100+
shell: pwsh
101+
run: |
102+
choco install innosetup --yes --no-progress
103+
New-Item -ItemType Directory -Force -Path setup_output | Out-Null
104+
iscc `
105+
"/DMyAppVersion=${{ steps.version.outputs.VALUE }}" `
106+
"/DMyOutputDir=${{ github.workspace }}\setup_output" `
107+
"setup.iss"
108+
109+
- name: Upload Windows artifacts
110+
uses: actions/upload-artifact@v4
111+
with:
112+
name: windows-artifacts
113+
path: |
114+
dist/PyMacroRecord-portable.exe
115+
setup_output/PyMacroRecord_*_Setup.exe
116+
117+
release:
118+
needs: [build-linux, build-windows]
119+
runs-on: ubuntu-latest
120+
permissions:
121+
contents: write
122+
steps:
123+
- name: Download Linux artifacts
124+
uses: actions/download-artifact@v4
125+
with:
126+
name: linux-appimage
127+
path: release-files
128+
129+
- name: Download Windows artifacts
130+
uses: actions/download-artifact@v4
131+
with:
132+
name: windows-artifacts
133+
path: release-files
134+
135+
- name: Create GitHub Release
136+
uses: softprops/action-gh-release@v2
137+
with:
138+
generate_release_notes: true
139+
draft: ${{ github.event_name == 'workflow_dispatch' && inputs.draft }}
140+
tag_name: ${{ github.ref_name != '' && github.ref_name || 'v0.0.0-test' }}
141+
files: release-files/**

build.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ cat > "${APPDIR}/usr/share/metainfo/${APP_ID}.appdata.xml" <<EOF
4747
<summary>Free macro recorder for Linux and Windows</summary>
4848
<metadata_license>MIT</metadata_license>
4949
<project_license>GPL-3.0</project_license>
50-
<developer>
50+
<developer id="io.github.LOUDO56">
5151
<name>LOUDO56</name>
5252
</developer>
5353
<launchable type="desktop-id">${APP_ID}.desktop</launchable>
@@ -84,7 +84,7 @@ if [ ! -f "${APPIMAGETOOL}" ]; then
8484
fi
8585

8686
echo ">>> Creating AppImage..."
87-
ARCH="${ARCH}" "${APPIMAGETOOL}" -u "${UPDATE_INFO}" \
87+
ARCH="${ARCH}" "${APPIMAGETOOL}" --no-appstream -u "${UPDATE_INFO}" \
8888
"${APPDIR}" "${APP_NAME}-${VERSION}-${ARCH}.AppImage"
8989

9090
if command -v zsyncmake &>/dev/null; then

setup.iss

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
; CI-compatible Inno Setup script.
2+
; Run locally: iscc setup.iss
3+
; Run in CI: iscc /DMyAppVersion=1.4.3 /DMyOutputDir=C:\path\setup_output setup.iss
4+
5+
#define MyAppName "PyMacroRecord"
6+
#ifndef MyAppVersion
7+
#define MyAppVersion "1.4.3"
8+
#endif
9+
#define MyAppPublisher "LOUDO"
10+
#define MyAppURL "https://www.pymacrorecord.com/"
11+
#define MyAppExeName "PyMacroRecord.exe"
12+
#define MyAppAssocName MyAppName + " File"
13+
#define MyAppAssocExt ".pmr"
14+
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt
15+
16+
; Paths resolved relative to this .iss file (repo root)
17+
#ifndef MyDistDir
18+
#define MyDistDir SourcePath + "dist\PyMacroRecord"
19+
#endif
20+
#ifndef MySetupBuilderDir
21+
#define MySetupBuilderDir SourcePath + "setup builder"
22+
#endif
23+
#ifndef MyOutputDir
24+
#define MyOutputDir SourcePath + "setup_output"
25+
#endif
26+
27+
[Setup]
28+
AppId={{AD24EE86-03F0-4209-A794-57AFBC461017}
29+
AppName={#MyAppName}
30+
AppVersion={#MyAppVersion}
31+
AppPublisher={#MyAppPublisher}
32+
AppPublisherURL={#MyAppURL}
33+
AppSupportURL={#MyAppURL}
34+
AppUpdatesURL={#MyAppURL}
35+
DefaultDirName={autopf}\{#MyAppName}
36+
UninstallDisplayIcon={app}\{#MyAppExeName}
37+
UninstallDisplayName={#MyAppName}
38+
ChangesAssociations=yes
39+
DisableProgramGroupPage=yes
40+
LicenseFile={#SourcePath}LICENSE.md
41+
PrivilegesRequired=lowest
42+
OutputDir={#MyOutputDir}
43+
OutputBaseFilename=PyMacroRecord_{#MyAppVersion}_Setup
44+
SetupIconFile={#SourcePath}src\assets\logo.ico
45+
Compression=lzma
46+
SolidCompression=yes
47+
WizardStyle=modern
48+
49+
[Languages]
50+
Name: "english"; MessagesFile: "compiler:Default.isl"
51+
Name: "armenian"; MessagesFile: "compiler:Languages\Armenian.isl"
52+
Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl"
53+
Name: "bulgarian"; MessagesFile: "compiler:Languages\Bulgarian.isl"
54+
Name: "catalan"; MessagesFile: "compiler:Languages\Catalan.isl"
55+
Name: "corsican"; MessagesFile: "compiler:Languages\Corsican.isl"
56+
Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl"
57+
Name: "danish"; MessagesFile: "compiler:Languages\Danish.isl"
58+
Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl"
59+
Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl"
60+
Name: "french"; MessagesFile: "compiler:Languages\French.isl"
61+
Name: "german"; MessagesFile: "compiler:Languages\German.isl"
62+
Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl"
63+
Name: "hungarian"; MessagesFile: "compiler:Languages\Hungarian.isl"
64+
Name: "icelandic"; MessagesFile: "compiler:Languages\Icelandic.isl"
65+
Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl"
66+
Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl"
67+
Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl"
68+
Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl"
69+
Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl"
70+
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
71+
Name: "slovak"; MessagesFile: "compiler:Languages\Slovak.isl"
72+
Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl"
73+
Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl"
74+
Name: "turkish"; MessagesFile: "compiler:Languages\Turkish.isl"
75+
Name: "ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl"
76+
77+
[Tasks]
78+
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
79+
80+
[Files]
81+
Source: "{#MyDistDir}\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
82+
Source: "{#MyDistDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
83+
84+
[Registry]
85+
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocKey}"; ValueData: ""; Flags: uninsdeletevalue
86+
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}"; ValueType: string; ValueName: ""; ValueData: "{#MyAppAssocName}"; Flags: uninsdeletekey
87+
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"
88+
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""
89+
Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".myp"; ValueData: ""
90+
91+
[Icons]
92+
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
93+
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
94+
95+
[Run]
96+
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

0 commit comments

Comments
 (0)