From 3369a2434344283260a4673914fa1bbaaab81427 Mon Sep 17 00:00:00 2001 From: Timmy Welch Date: Tue, 7 Jun 2022 19:13:44 -0700 Subject: [PATCH] Update GitHub Actions Separate release/packaging and CI Add an ignore for flake8 on ctversion.py as it is generated Cleanup unused portions of the makefile Use 'build' to generate PyPi distribution Python venv on windows uses the Scripts directory --- .flake8 | 2 +- .github/workflows/build.yaml | 96 +++++++++++++++++++++++----------- .github/workflows/package.yaml | 72 +++++++++++++++++++++++++ Makefile | 61 +++++++-------------- requirements_dev.txt | 3 ++ 5 files changed, 162 insertions(+), 72 deletions(-) create mode 100644 .github/workflows/package.yaml diff --git a/.flake8 b/.flake8 index ccb0c2e..f2b9c0f 100644 --- a/.flake8 +++ b/.flake8 @@ -1,6 +1,6 @@ [flake8] max-line-length = 120 extend-ignore = E203, E501, A003 -extend-exclude = venv, scripts, build, dist +extend-exclude = venv, scripts, build, dist, comictaggerlib/ctversion.py per-file-ignores = comictaggerlib/cli.py: T20 diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index b0bac72..d9d74a2 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,16 +1,51 @@ -name: Build +name: CI +env: + PIP: pip + PYTHON: python on: - push: - tags: - - "[0-9]+.[0-9]+.[0-9]+*" pull_request: - + push: jobs: - build: + lint: permissions: - contents: write + checks: write + contents: read + pull-requests: write + runs-on: ${{ matrix.os }} + strategy: + matrix: + python-version: [3.9] + os: [ubuntu-latest] + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + + - uses: syphar/restore-virtualenv@v1.2 + id: cache-virtualenv + + - uses: syphar/restore-pip-download-cache@v1 + if: steps.cache-virtualenv.outputs.cache-hit != 'true' + + - name: Install build dependencies + run: | + python -m pip install --upgrade --upgrade-strategy eager -r requirements_dev.txt + + - uses: reviewdog/action-setup@v1 + with: + reviewdog_version: nightly + - run: flake8 | reviewdog -f=flake8 -reporter=github-pr-review -tee -level=error + env: + REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + build-and-test: runs-on: ${{ matrix.os }} strategy: matrix: @@ -21,43 +56,44 @@ jobs: - uses: actions/checkout@v2 with: fetch-depth: 0 + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - - name: Install dependencies + + - uses: syphar/restore-virtualenv@v1.2 + id: cache-virtualenv + + - uses: syphar/restore-pip-download-cache@v1 + if: steps.cache-virtualenv.outputs.cache-hit != 'true' + + - name: Install build dependencies run: | - python3 -m pip install -r requirements_dev.txt - python3 -m pip install -r requirements.txt - for requirement in requirements-*.txt; do - python3 -m pip install -r "$requirement" - done - shell: bash - - name: Install Windows dependencies + python -m pip install --upgrade --upgrade-strategy eager -r requirements_dev.txt + + - name: Install Windows build dependencies run: | choco install -y zip if: runner.os == 'Windows' + + - name: Build and install PyPi packages + run: | + make clean pydist + python -m pip install "dist/$(python setup.py --fullname)-py3-none-any.whl[GUI,CBR]" + - name: build run: | - make pydist make dist + - name: Archive production artifacts uses: actions/upload-artifact@v2 if: runner.os != 'Linux' # linux binary currently has a segfault when running on latest fedora with: name: "${{ format('ComicTagger-{0}', runner.os) }}" - path: dist/*.zip + path: | + dist/*.zip - - name: Release - uses: softprops/action-gh-release@v1 - if: startsWith(github.ref, 'refs/tags/') - with: - prerelease: "${{ contains(github.ref, '-') }}" # alpha-releases should be 1.3.0-alpha.x full releases should be 1.3.0 - draft: true - files: dist/*.zip - - name: "Publish distribution 📦 to PyPI" - if: startsWith(github.ref, 'refs/tags/') && runner.os == 'Linux' - uses: pypa/gh-action-pypi-publish@master - with: - password: ${{ secrets.PYPI_API_TOKEN }} - packages_dir: piprelease + - name: PyTest + run: | + python -m pytest diff --git a/.github/workflows/package.yaml b/.github/workflows/package.yaml new file mode 100644 index 0000000..79f7bd3 --- /dev/null +++ b/.github/workflows/package.yaml @@ -0,0 +1,72 @@ +name: Package + +env: + PIP: pip + PYTHON: python +on: + push: + tags: + - "[0-9]+.[0-9]+.[0-9]+*" +jobs: + package: + permissions: + contents: write + runs-on: ${{ matrix.os }} + strategy: + matrix: + python-version: [3.9] + os: [ubuntu-latest, macos-10.15, windows-latest] + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + + - uses: syphar/restore-virtualenv@v1.2 + id: cache-virtualenv + + - uses: syphar/restore-pip-download-cache@v1 + if: steps.cache-virtualenv.outputs.cache-hit != 'true' + + - name: Install build dependencies + run: | + python -m pip install --upgrade --upgrade-strategy eager -r requirements_dev.txt + + - name: Install Windows build dependencies + run: | + choco install -y zip + if: runner.os == 'Windows' + + - name: Build, Install and Test PyPi packages + run: | + make clean pydist + python -m pip install "dist/$(python setup.py --fullname)-py3-none-any.whl[GUI,CBR]" + echo "CT_FULL_NAME=$(python setup.py --fullname)" >> $GITHUB_ENV + python -m flake8 + python -m pytest + + - name: "Publish distribution 📦 to PyPI" + if: startsWith(github.ref, 'refs/tags/') && runner.os == 'Linux' + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.PYPI_API_TOKEN }} + packages_dir: dist + + - name: Build PyInstaller package + run: | + make dist + + - name: Release + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + prerelease: "${{ contains(github.ref, '-') }}" # alpha-releases should be 1.3.0-alpha.x full releases should be 1.3.0 + draft: false + files: | + dist/!(*Linux).zip + dist/*.whl diff --git a/Makefile b/Makefile index 53f1725..0a7558d 100644 --- a/Makefile +++ b/Makefile @@ -3,16 +3,16 @@ PYTHON ?= python3 VERSION_STR := $(shell $(PYTHON) setup.py --version) SITE_PACKAGES := $(shell $(PYTHON) -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])') -PACKAGE_PATH = $(SITE_PACKAGES)/comictagger-$(VERSION_STR).dist-info +PACKAGE_PATH = $(SITE_PACKAGES)/comictagger.egg-link VENV := $(shell echo $${VIRTUAL_ENV-venv}) PY3 := $(shell command -v $(PYTHON) 2> /dev/null) PYTHON_VENV := $(VENV)/bin/python INSTALL_STAMP := $(VENV)/.install.stamp -INSTALL_GUI_STAMP := $(VENV)/.install-GUI.stamp ifeq ($(OS),Windows_NT) + PYTHON_VENV := $(VENV)/Scripts/python.exe OS_VERSION=win-$(PROCESSOR_ARCHITECTURE) APP_NAME=comictagger.exe FINAL_NAME=ComicTagger-$(VERSION_STR)-$(OS_VERSION).exe @@ -22,48 +22,36 @@ else ifeq ($(shell uname -s),Darwin) FINAL_NAME=ComicTagger-$(VERSION_STR)-$(OS_VERSION).app else APP_NAME=comictagger - FINAL_NAME=ComicTagger-$(VERSION_STR) + FINAL_NAME=ComicTagger-$(VERSION_STR)-$(shell uname -s) endif -.PHONY: all clean pydist upload dist CI check run +.PHONY: all clean pydist dist CI check all: clean dist $(PYTHON_VENV): @if [ -z $(PY3) ]; then echo "Python 3 could not be found."; exit 2; fi - $(PY3) -m venv --system-site-packages $(VENV) + $(PY3) -m venv $(VENV) clean: - find . -type d -name "__pycache__" | xargs rm -rf {}; - rm -rf $(INSTALL_STAMP) - rm -rf dist MANIFEST + find . -maxdepth 4 -type d -name "__pycache__" + rm -rf $(PACKAGE_PATH) $(INSTALL_STAMP) build dist MANIFEST comictaggerlib/ctversion.py $(MAKE) -C mac clean - rm -rf build - rm comictaggerlib/ctversion.py -CI: ins - black . - isort . - flake8 . - pytest +CI: install + $(PYTHON_VENV) -m black . + $(PYTHON_VENV) -m isort . + $(PYTHON_VENV) -m flake8 . + $(PYTHON_VENV) -m pytest check: install - $(VENV)/bin/black --check . - $(VENV)/bin/isort --check . - $(VENV)/bin/flake8 . - $(VENV)/bin/pytest + $(PYTHON_VENV) -m black --check . + $(PYTHON_VENV) -m isort --check . + $(PYTHON_VENV) -m flake8 . + $(PYTHON_VENV) -m pytest -pydist: CI - make clean - mkdir -p piprelease - rm -f comictagger-$(VERSION_STR).zip - $(PYTHON) setup.py sdist --formats=gztar - mv dist/comictagger-$(VERSION_STR).tar.gz piprelease - rm -rf comictagger.egg-info dist - -upload: - $(PYTHON) setup.py register - $(PYTHON) setup.py sdist --formats=gztar upload +pydist: + $(PYTHON_VENV) -m build install: $(INSTALL_STAMP) $(INSTALL_STAMP): $(PYTHON_VENV) requirements.txt requirements_dev.txt @@ -71,15 +59,6 @@ $(INSTALL_STAMP): $(PYTHON_VENV) requirements.txt requirements_dev.txt $(PYTHON_VENV) -m pip install -e . touch $(INSTALL_STAMP) -install-GUI: $(INSTALL_GUI_STAMP) -$(INSTALL_GUI_STAMP): requirements-GUI.txt - $(PYTHON_VENV) -m pip install -r requirements-GUI.txt - touch $(INSTALL_GUI_STAMP) - -ins: $(PACKAGE_PATH) -$(PACKAGE_PATH): - $(PIP) install -e . - -dist: CI +dist: pyinstaller -y comictagger.spec - cd dist && zip -r $(FINAL_NAME).zip $(APP_NAME) + cd dist && zip -m -r $(FINAL_NAME).zip $(APP_NAME) diff --git a/requirements_dev.txt b/requirements_dev.txt index 9e1398a..f3444bd 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -1,6 +1,9 @@ black>=22 +build flake8==4.* +flake8-black flake8-encodings +flake8-isort isort>=5.10 pyinstaller>=4.10 pytest==7.*