61 Commits
0.1.1 ... main

Author SHA1 Message Date
efadffa161 Update entrypoint.sh 2025-09-26 02:30:42 +03:00
9aee71fa20 Update entrypoint.sh 2025-09-26 02:22:04 +03:00
dedb36637a Update entrypoint.sh 2025-09-26 01:45:49 +03:00
6b6add4b12 Update entrypoint.sh 2025-09-26 00:48:33 +03:00
053f8af371 Update entrypoint.sh 2025-09-26 00:47:13 +03:00
0c26acd621 Update entrypoint.sh 2025-09-26 00:46:33 +03:00
c64c64659a Update entrypoint.sh 2025-09-26 00:43:49 +03:00
c6ab45d77a Update entrypoint.sh 2025-09-26 00:26:25 +03:00
b7edcdebb0 Update entrypoint.sh 2025-09-26 00:24:23 +03:00
b79736ab4e Update entrypoint.sh 2025-09-26 00:18:58 +03:00
10c4c26423 Update entrypoint.sh 2025-09-26 00:13:28 +03:00
bf937651f1 Update entrypoint.sh 2025-09-25 22:20:26 +03:00
Jack McKew
6736e82336 Merge pull request #56 from joschua-rgb/main
Fix: "wine: Unimplemented function ucrtbase.dll.crealf called at address ..."
2025-03-30 09:48:40 +11:00
Joschua
b4dba940e0 fix(Dockerfile): Install vcrun2019
Added extra winetricks step to install the Visual C++ Redistributable 2019 package to fix "wine: Unimplemented function ucrtbase.dll.crealf called at address ..." error
2025-03-29 20:24:00 +01:00
Jack McKew
a2a5f0d408 Merge pull request #54 from floxdeveloper/patch-1
Update actions-versions in full example of README.md
2024-10-25 08:59:45 +10:00
Florian
3e3df82cba Update actions-versions in full example of README.md
In the full example the actions-versions still says v2, which gives warnings when using it to build the artifact. Today v4 is recommended and working.
2024-10-18 08:29:10 +02:00
Jack McKew
329a7d2adf Add version 6.8.0 2024-06-26 14:38:35 +10:00
Jack McKew
0c49af4a3e Merge pull request #52 from rvbg/main
Update README.md with fix notice
2024-05-24 13:33:49 +10:00
rvbg
43b64c31a5 Update README.md with fix notice
https://github.com/JackMcKew/pyinstaller-action-windows/issues/51
2024-05-24 04:48:50 +02:00
Jack McKew
87e5d76c3e Merge pull request #47 from alexrudd2/patch-1
Remove references to deleted branch
2024-04-12 09:07:24 +10:00
Alex
a6f029a295 Remove references to deleted branch 2024-04-11 12:00:14 -05:00
Jack McKew
1db992099e Merge pull request #45 from GaNiziolek/python3-10-pyinstaller-5-13
Upgrade pyinstaller 5.3 -> 5.13
2024-03-19 16:08:30 +10:00
Jack McKew
3adcdbc63a Merge branch 'main' into python3-10-pyinstaller-5-13 2024-03-19 15:49:34 +10:00
Jack McKew
5d2da82392 Merge pull request #44 from JackMcKew/python3-10-pyinstaller-5-3
Python3 10 pyinstaller 5 3
2024-03-17 18:56:12 +10:00
Gabriel Niziolek
e40854d22c Revert "add add_data_dirs input"
This reverts commit 0ce759f0a3.
2024-01-25 10:53:51 -03:00
Gabriel Niziolek
bd5c434b9b Revert "--add-data must be separated by semicolon"
This reverts commit d224f5c898.
2024-01-25 10:53:43 -03:00
Gabriel Niziolek
9e5e0015f0 Merge branch 'JackMcKew:main' into python3-10-pyinstaller-5-13 2024-01-25 05:52:26 -08:00
Gabriel Niziolek
d224f5c898 --add-data must be separated by semicolon 2024-01-25 10:31:49 -03:00
Gabriel Niziolek
0ce759f0a3 add add_data_dirs input 2024-01-25 10:16:59 -03:00
Gabriel Niziolek
c1a1d21957 change docker image 2024-01-25 09:28:50 -03:00
Gabriel Niziolek
77d59c8016 Bump pyinstaller version to 5.13 2024-01-24 23:15:30 -03:00
Jack McKew
cb26723d2e Merge pull request #39 from Young-Lord/patch-1
docs: fix incorrect indent in example
2023-09-21 13:27:08 -04:00
LY
1b1d3f463a docs: fix incorrect indent in example 2023-07-19 08:36:37 +08:00
Jack McKew
8ecfdfba5f Update README.md 2023-07-11 14:48:17 +02:00
Jack McKew
1c038a14bd Add git 2023-05-08 22:57:45 +10:00
Jack McKew
2dc8dcfca9 Add git 2023-05-08 22:57:16 +10:00
Jack McKew
9c3a65eaf4 Add comment for python 3.10 2023-05-01 17:59:51 +10:00
Jack McKew
04b363697b Use managed dockerfile 2023-05-01 09:56:43 +10:00
Jack McKew
e245b974e8 Merge pull request #30 from dancergraham/patch-1 2023-05-01 08:58:06 +10:00
Jack McKew
dce16b0bf6 Start working on supporting new versions 2023-04-29 12:09:18 +10:00
Graham Knapp
09164817ca docs: update default branch name
Update default branch name to match this repo and the current GitHub standard
2022-10-18 14:45:27 +02:00
Jack McKew
f63335e48c Update README.md 2021-04-16 09:17:26 +10:00
Jack McKew
5a4cb8819f Merge pull request #15 from NKPmedia/main
Added the requirements file to the options
2021-04-16 09:16:12 +10:00
Paul Kruse
a68442bab8 Pass requirements option to docker 2021-04-14 15:55:35 +02:00
Paul Kruse
ad7cee232c Added requirements option to the entrypoint script 2021-04-14 15:51:57 +02:00
Paul Kruse
d22b0c4203 Added requirements input 2021-04-14 15:50:28 +02:00
Jack McKew
a8dee21ad0 Merge pull request #2 from biplobsd/main
Argument for specifying .spec file to build
2020-06-26 08:17:34 +10:00
Biplob SD
7071c8c601 specific file 2020-06-25 19:30:22 +06:00
Biplob SD
4e2ef9706a Update action.yml 2020-06-25 18:12:28 +06:00
Biplob SD
9cdd374622 default *.spec 2020-06-25 17:37:37 +06:00
Biplob SD
b22424d290 default *.spec 2020-06-25 17:35:29 +06:00
Biplob SD
99ed1fb8c9 Update entrypoint.sh 2020-06-25 00:43:06 +06:00
Biplob SD
b469d4d30a Update entrypoint.sh 2020-06-25 00:24:03 +06:00
Biplob SD
ac8fd363b0 Update entrypoint.sh 2020-06-25 00:03:26 +06:00
Biplob SD
681336b7ae upgrade builds tools 2020-06-24 23:52:49 +06:00
Biplob SD
f1f2d7035f SPEC_FILE 2020-06-24 23:11:48 +06:00
Biplob SD
ff7e885f69 spec path 2020-06-24 22:57:19 +06:00
Fizban
33e01256d3 Add FAQ and example repo 2020-06-15 21:10:01 +10:00
Fizban
318c4aa936 For clarity 2020-06-08 21:03:55 +10:00
Fizban
2790537b70 Main as default branch 2020-06-08 21:01:01 +10:00
Jack McKew
a9a33a332d add notes 2020-06-04 09:25:21 +10:00
8 changed files with 290 additions and 16 deletions

View File

@@ -1,4 +1,8 @@
FROM cdrx/pyinstaller-windows
FROM jackmckew/pyinstaller-windows
#extra winetrick step to fix "Unimplemented function ucrtbase.dll.crealf called"
RUN apt-get install -y xvfb libgnutls30 libgnutls30:i386
RUN xvfb-run winetricks --force -q vcrun2019
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

View File

@@ -0,0 +1,84 @@
FROM ubuntu:18.04
ENV DEBIAN_FRONTEND noninteractive
ARG WINE_VERSION=winehq-staging
ARG PYTHON_VERSION=3.10.1
ARG PYINSTALLER_VERSION=5.13
# we need wine for this all to work, so we'll use the PPA
RUN set -x \
&& dpkg --add-architecture i386 \
&& apt-get update -qy \
&& apt-get install --no-install-recommends -qfy apt-transport-https software-properties-common wget gpg-agent rename git \
&& wget -nv https://dl.winehq.org/wine-builds/winehq.key \
&& apt-key add winehq.key \
&& add-apt-repository 'https://dl.winehq.org/wine-builds/ubuntu/' \
&& apt-get update -qy \
&& apt-get install --no-install-recommends -qfy $WINE_VERSION winbind cabextract \
&& apt-get clean \
&& wget -nv https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks \
&& chmod +x winetricks \
&& mv winetricks /usr/local/bin
# wine settings
ENV WINEARCH win64
ENV WINEDEBUG fixme-all
ENV WINEPREFIX /wine
# PYPI repository location
ENV PYPI_URL=https://pypi.python.org/
# PYPI index location
ENV PYPI_INDEX_URL=https://pypi.python.org/simple
# install python in wine, using the msi packages to install, extracting
# the files directly, since installing isn't running correctly.
RUN set -x \
&& winetricks win7 \
&& for msifile in `echo core dev exe lib path pip tcltk tools`; do \
wget -nv "https://www.python.org/ftp/python/$PYTHON_VERSION/amd64/${msifile}.msi"; \
wine msiexec /i "${msifile}.msi" /qb TARGETDIR=C:/Python310; \
rm ${msifile}.msi; \
done \
&& cd /wine/drive_c/Python310 \
&& echo 'wine '\''C:\Python310\python.exe'\'' "$@"' > /usr/bin/python \
&& echo 'wine '\''C:\Python310\Scripts\easy_install.exe'\'' "$@"' > /usr/bin/easy_install \
&& echo 'wine '\''C:\Python310\Scripts\pip.exe'\'' "$@"' > /usr/bin/pip \
&& echo 'wine '\''C:\Python310\Scripts\pyinstaller.exe'\'' "$@"' > /usr/bin/pyinstaller \
&& echo 'wine '\''C:\Python310\Scripts\pyupdater.exe'\'' "$@"' > /usr/bin/pyupdater \
&& echo 'assoc .py=PythonScript' | wine cmd \
&& echo 'ftype PythonScript=c:\Python310\python.exe "%1" %*' | wine cmd \
&& while pgrep wineserver >/dev/null; do echo "Waiting for wineserver"; sleep 1; done \
&& chmod +x /usr/bin/python /usr/bin/easy_install /usr/bin/pip /usr/bin/pyinstaller /usr/bin/pyupdater \
&& (pip install -U pip || true) \
&& rm -rf /tmp/.wine-*
ENV W_DRIVE_C=/wine/drive_c
ENV W_WINDIR_UNIX="$W_DRIVE_C/windows"
ENV W_SYSTEM64_DLLS="$W_WINDIR_UNIX/system32"
ENV W_TMP="$W_DRIVE_C/windows/temp/_$0"
# install Microsoft Visual C++ Redistributable for Visual Studio 2017 dll files
RUN set -x \
&& rm -f "$W_TMP"/* \
&& wget -P "$W_TMP" https://download.visualstudio.microsoft.com/download/pr/11100230/15ccb3f02745c7b206ad10373cbca89b/VC_redist.x64.exe \
&& cabextract -q --directory="$W_TMP" "$W_TMP"/VC_redist.x64.exe \
&& cabextract -q --directory="$W_TMP" "$W_TMP/a10" \
&& cabextract -q --directory="$W_TMP" "$W_TMP/a11" \
&& cd "$W_TMP" \
&& rename 's/_/\-/g' *.dll \
&& cp "$W_TMP"/*.dll "$W_SYSTEM64_DLLS"/
# install pyinstaller
RUN /usr/bin/pip install pyinstaller==$PYINSTALLER_VERSION
# put the src folder inside wine
RUN mkdir /src/ && ln -s /src /wine/drive_c/src
VOLUME /src/
WORKDIR /wine/drive_c/src/
RUN mkdir -p /wine/drive_c/tmp
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

View File

@@ -0,0 +1,84 @@
FROM ubuntu:18.04
ENV DEBIAN_FRONTEND noninteractive
ARG WINE_VERSION=winehq-staging
ARG PYTHON_VERSION=3.10.1
ARG PYINSTALLER_VERSION=6.8.0
# we need wine for this all to work, so we'll use the PPA
RUN set -x \
&& dpkg --add-architecture i386 \
&& apt-get update -qy \
&& apt-get install --no-install-recommends -qfy apt-transport-https software-properties-common wget gpg-agent rename git \
&& wget -nv https://dl.winehq.org/wine-builds/winehq.key \
&& apt-key add winehq.key \
&& add-apt-repository 'https://dl.winehq.org/wine-builds/ubuntu/' \
&& apt-get update -qy \
&& apt-get install --no-install-recommends -qfy $WINE_VERSION winbind cabextract \
&& apt-get clean \
&& wget -nv https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks \
&& chmod +x winetricks \
&& mv winetricks /usr/local/bin
# wine settings
ENV WINEARCH win64
ENV WINEDEBUG fixme-all
ENV WINEPREFIX /wine
# PYPI repository location
ENV PYPI_URL=https://pypi.python.org/
# PYPI index location
ENV PYPI_INDEX_URL=https://pypi.python.org/simple
# install python in wine, using the msi packages to install, extracting
# the files directly, since installing isn't running correctly.
RUN set -x \
&& winetricks win7 \
&& for msifile in `echo core dev exe lib path pip tcltk tools`; do \
wget -nv "https://www.python.org/ftp/python/$PYTHON_VERSION/amd64/${msifile}.msi"; \
wine msiexec /i "${msifile}.msi" /qb TARGETDIR=C:/Python310; \
rm ${msifile}.msi; \
done \
&& cd /wine/drive_c/Python310 \
&& echo 'wine '\''C:\Python310\python.exe'\'' "$@"' > /usr/bin/python \
&& echo 'wine '\''C:\Python310\Scripts\easy_install.exe'\'' "$@"' > /usr/bin/easy_install \
&& echo 'wine '\''C:\Python310\Scripts\pip.exe'\'' "$@"' > /usr/bin/pip \
&& echo 'wine '\''C:\Python310\Scripts\pyinstaller.exe'\'' "$@"' > /usr/bin/pyinstaller \
&& echo 'wine '\''C:\Python310\Scripts\pyupdater.exe'\'' "$@"' > /usr/bin/pyupdater \
&& echo 'assoc .py=PythonScript' | wine cmd \
&& echo 'ftype PythonScript=c:\Python310\python.exe "%1" %*' | wine cmd \
&& while pgrep wineserver >/dev/null; do echo "Waiting for wineserver"; sleep 1; done \
&& chmod +x /usr/bin/python /usr/bin/easy_install /usr/bin/pip /usr/bin/pyinstaller /usr/bin/pyupdater \
&& (pip install -U pip || true) \
&& rm -rf /tmp/.wine-*
ENV W_DRIVE_C=/wine/drive_c
ENV W_WINDIR_UNIX="$W_DRIVE_C/windows"
ENV W_SYSTEM64_DLLS="$W_WINDIR_UNIX/system32"
ENV W_TMP="$W_DRIVE_C/windows/temp/_$0"
# install Microsoft Visual C++ Redistributable for Visual Studio 2017 dll files
RUN set -x \
&& rm -f "$W_TMP"/* \
&& wget -P "$W_TMP" https://download.visualstudio.microsoft.com/download/pr/11100230/15ccb3f02745c7b206ad10373cbca89b/VC_redist.x64.exe \
&& cabextract -q --directory="$W_TMP" "$W_TMP"/VC_redist.x64.exe \
&& cabextract -q --directory="$W_TMP" "$W_TMP/a10" \
&& cabextract -q --directory="$W_TMP" "$W_TMP/a11" \
&& cd "$W_TMP" \
&& rename 's/_/\-/g' *.dll \
&& cp "$W_TMP"/*.dll "$W_SYSTEM64_DLLS"/
# install pyinstaller
RUN /usr/bin/pip install pyinstaller==$PYINSTALLER_VERSION
# put the src folder inside wine
RUN mkdir /src/ && ln -s /src /wine/drive_c/src
VOLUME /src/
WORKDIR /wine/drive_c/src/
RUN mkdir -p /wine/drive_c/tmp
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

6
Dockerfiles/README.md Normal file
View File

@@ -0,0 +1,6 @@
# Docker Files
To push new images up to Docker hub
1. `docker login`
2. `docker build -f Dockerfile-py3.10-win64 . --platform=linux/amd64 -t jackmckew/pyinstaller-windows:3.10 -t jackmckew/pyinstaller-windows:latest && docker push jackmckew/pyinstaller-windows:3.10 && docker push jackmckew/pyinstaller-windows:latest`

45
Dockerfiles/entrypoint.sh Normal file
View File

@@ -0,0 +1,45 @@
#!/bin/bash
# Fail on errors.
set -e
# Make sure .bashrc is sourced
. /root/.bashrc
# Allow the workdir to be set using an env var.
# Useful for CI pipiles which use docker for their build steps
# and don't allow that much flexibility to mount volumes
WORKDIR=${SRCDIR:-/src}
#
# In case the user specified a custom URL for PYPI, then use
# that one, instead of the default one.
#
if [[ "$PYPI_URL" != "https://pypi.python.org/" ]] || \
[[ "$PYPI_INDEX_URL" != "https://pypi.python.org/simple" ]]; then
# the funky looking regexp just extracts the hostname, excluding port
# to be used as a trusted-host.
mkdir -p /wine/drive_c/users/root/pip
echo "[global]" > /wine/drive_c/users/root/pip/pip.ini
echo "index = $PYPI_URL" >> /wine/drive_c/users/root/pip/pip.ini
echo "index-url = $PYPI_INDEX_URL" >> /wine/drive_c/users/root/pip/pip.ini
echo "trusted-host = $(echo $PYPI_URL | perl -pe 's|^.*?://(.*?)(:.*?)?/.*$|$1|')" >> /wine/drive_c/users/root/pip/pip.ini
echo "Using custom pip.ini: "
cat /wine/drive_c/users/root/pip/pip.ini
fi
cd $WORKDIR
if [ -f requirements.txt ]; then
pip install -r requirements.txt
fi # [ -f requirements.txt ]
echo "$@"
if [[ "$@" == "" ]]; then
pyinstaller --clean -y --dist ./dist/windows --workpath /tmp *.spec
chown -R --reference=. ./dist/windows
else
sh -c "$@"
fi # [[ "$@" == "" ]]

View File

@@ -5,23 +5,49 @@ Github Action for building executables with PyInstaller
To build your application, you need to specify where your source code is via the `path` argument, this defaults to `src`.
The source code directory should have your `.spec` file that PyInstaller generates. If you don't have one, you'll need to run PyInstaller once locally to generate it.
Also if you have another program `.spec` file you can set specific pyinstaller `.spec` file by `spec: <YOUR_SPEC_FILE_NAME>`
If the `src` folder has a `requirements.txt` file, the packages will be installed into the environment before PyInstaller runs.
If the `src` folder has a `requirements.txt` file, the packages will be installed into the environment before PyInstaller runs. This can also be specified via the `requirements` argument.
If you wish to specify a package mirror, this is possibly via the `pypi_url` and/or the `pypi_index_url`, these defaults are:
- `pypi_url` = `https://pypi.python.org/`
- `pypi_index_url` = `https://pypi.python.org/simple`
> If you are using the default Python `gitignore` file, ensure to remove `.spec`.
> This action uses [Wine](https://www.winehq.org) to emulate windows inside Docker for packaging POSIX executables.
## CURRENT ISSUE: `ModuleNotFoundError pkg_resources.extern`
The pkg_resources hook for setuptools>=v70.0.0 is currently missing in pyinstaller 5.13, which is used in this Github Action.
To address this, a future version of this project will incorporate pyinstaller>=6.7 to resolve the issue.
However, in the interim, it is necessary to manually include a hiddenimport to the `.spec` file.
Include `hiddenimports=['pkg_resources.extern'],` in your `.spec` file, something like this:
```
a = Analysis(
hiddenimports=['pkg_resources.extern'],
)
```
For further assistance, please refer to the following issues:
- JackMcKew/pyinstaller-action-windows#51
- pyinstaller/pyinstaller#8554
## Example usage
There's an example repository where you can see this action in action: <https://github.com/JackMcKew/pyinstaller-action-windows-example>.
Include this in your `.github/workflows/main.yaml`:
```yaml
- name: PyInstaller Windows
uses: JackMcKew/pyinstaller-action-windows@master
with:
path: src
uses: JackMcKew/pyinstaller-action-windows@main
with:
path: src
```
## Full Example
@@ -37,9 +63,9 @@ name: Package Application with Pyinstaller
on:
push:
branches: [ master ]
branches: [ main ]
pull_request:
branches: [ master ]
branches: [ main ]
jobs:
build:
@@ -47,19 +73,23 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Package Application
uses: JackMcKew/pyinstaller-action-windows@master
uses: JackMcKew/pyinstaller-action-windows@main
with:
path: src
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v4
with:
name: name-of-artifact
path: src/dist/windows
```
## FAQ
If you get this error: `OSError: [WinError 123] Invalid name: '/tmp\\*'`, ensure your path is correctly configured, the default is `src`.
## Sources
A big thank you to all the contributors over at <https://github.com/cdrx/docker-pyinstaller>, this action is just a modified version of their docker container, thank you!

View File

@@ -6,7 +6,7 @@ branding:
color: 'blue'
inputs:
path:
description: 'Directory containing source code & .spec file (optional requirements.txt).'
description: 'Directory containing source code (optional requirements.txt).'
required: True
default: src
pypi_url:
@@ -17,6 +17,14 @@ inputs:
description: 'Specify a custom URL for PYPI Index'
required: False
default: https://pypi.python.org/simple
spec:
description: 'Specify a file path for .spec file'
required: False
default: ""
requirements:
description: 'Specify a file path for requirements.txt file'
required: False
default: "requirements.txt"
outputs:
output:
description: 'The output of PyInstaller'
@@ -27,4 +35,6 @@ runs:
args:
- ${{ inputs.path }}
- ${{ inputs.pypi_url }}
- ${{ inputs.pypi_index_url }}
- ${{ inputs.pypi_index_url }}
- ${{ inputs.spec }}
- ${{ inputs.requirements }}

View File

@@ -17,6 +17,10 @@ PYPI_INDEX_URL=$3
WORKDIR=${SRCDIR:-/src}
SPEC_FILE=${4:-*.spec}
python -m pip install --upgrade pip wheel setuptools
#
# In case the user specified a custom URL for PYPI, then use
# that one, instead of the default one.
@@ -37,14 +41,21 @@ fi
cd $WORKDIR
if [ -f requirements.txt ]; then
pip install -r requirements.txt
fi # [ -f requirements.txt ]
if [ -f $5 ]; then
pip install -r $5
fi # [ -f $5 ]
# if [[ "$@" == "" ]]; then
pyinstaller --clean -y --dist ./dist/windows --workpath /tmp *.spec
# pyinstaller --clean -y
# rd /s /q build
# rd /s /q __pycache__
pyinstaller --clean --onefile fw.py --distpath ./dist/windows --workpath /tmp
# rm fw.spec
# pyinstaller --onefile fw.py --distpath ./dist/windows --workpath /tmp
# pyinstaller --clean -F -y --dist ./dist/windows --workpath /tmp $SPEC_FILE
chown -R --reference=. ./dist/windows
# else
# sh -c "$@"