Merge pull request #49 from kchason/pre-commit #70
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI/CD Pipeline | |
on: | |
push: | |
pull_request: | |
env: | |
# The Python version for the build jobs as well as the primary one for the test and artifact generation. This MUST be | |
# in the python-version matrix in the `test` job. | |
PYTHON_VERSION: "3.13" | |
jobs: | |
test: | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
# This allows the pipeline to be run against multiple Python versions. eg. [3.6, 3.7, 3.8, 3.9, 3.10]. This results | |
# in linting and unit tests running for all listed versions as well as the creation of packages and wheels on | |
# creation of a tag in Git. | |
python-version: [ "3.9", "3.11", "3.13" ] | |
steps: | |
# Get the code from the repository to be packaged | |
- name: Get Repo | |
uses: actions/checkout@v4 | |
# Setup the appropriate Python version | |
- name: Set up Python ${{ matrix.python-version }} | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python-version }} | |
# Install the packages to build the SQLite Dissect package | |
- name: Prepare Build Environment | |
run: | | |
sudo apt install python3-setuptools | |
python -m pip install -q --upgrade pip | |
pip install . | |
pip install -q flake8 pytest pytest-cov build twine wheel pre-commit | |
# Lint the Python code to check for syntax errors | |
- name: Lint with Flake8 | |
run: | | |
# stop the build if there are Python syntax errors or undefined names | |
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics | |
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide | |
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics | |
# Run pre-commit on the repository | |
- name: Pre-Commit | |
run: pre-commit run -a | |
# Test the Python unit tests | |
- name: PyTest | |
run: | | |
# Create the directory for the test output | |
mkdir output | |
# Run the test suite | |
pytest --cov-report term-missing --cov-report html --cov=sqlite_dissect --cov-config=.coveragerc | |
# Run the CASE validation job to confirm the output is valid | |
- name: CASE Export Validation | |
uses: kchason/case-validation-action@v2.9.0 | |
with: | |
case-path: ./output/case.json | |
case-version: "case-1.3.0" | |
# Upload the PyTest HTML coverage report for review | |
- name: Upload PyTest Coverage | |
uses: actions/upload-artifact@v4 | |
if: ${{ matrix.python-version == env.PYTHON_VERSION }} | |
with: | |
name: code-coverage-report | |
path: htmlcov | |
windows-build: | |
runs-on: windows-latest | |
steps: | |
# Get the code from the repository to be packaged | |
- name: Get Repo | |
uses: actions/checkout@v4 | |
# Setup the target build version | |
- name: Set up Python ${{ env.PYTHON_VERSION }} | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ env.PYTHON_VERSION }} | |
# Install the packages to build the SQLite Dissect package | |
- name: Prepare Build Environment | |
run: | | |
python -m pip install -q --upgrade pip | |
pip install . | |
pip install -q pyinstaller build twine wheel | |
- name: Build Windows Executable (Single File) | |
run: | | |
pyinstaller pyinstaller/sqlite_dissect_win-x86_64_onefile.spec | |
cd ./dist/win-x86_64/bin/ | |
sqlite_dissect.exe -h | |
Compress-Archive -Path sqlite_dissect.exe -DestinationPath sqlite-dissect-windows-x64-${{ env.PYTHON_VERSION }}-binary.zip | |
Move-Item -Path sqlite-dissect-windows-x64-${{ env.PYTHON_VERSION }}-binary.zip -Destination ../../../ | |
# Upload the built executable | |
- name: Upload Windows Executable | |
uses: actions/upload-artifact@v4 | |
with: | |
name: windows-binary | |
path: sqlite-dissect-windows-x64-${{ env.PYTHON_VERSION }}-binary.zip | |
linux-build: | |
runs-on: ubuntu-latest | |
steps: | |
# Get the code from the repository to be packaged | |
- name: Get Repo | |
uses: actions/checkout@v4 | |
# Setup the target build version | |
- name: Set up Python ${{ env.PYTHON_VERSION }} | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ env.PYTHON_VERSION }} | |
# Install the packages to build the SQLite Dissect package | |
- name: Prepare Build Environment | |
run: | | |
sudo apt install python3-setuptools | |
python -m pip install -q --upgrade pip | |
pip install . | |
pip install -q pyinstaller build twine wheel | |
- name: Build Linux Executable (Single File) | |
run: | | |
pyinstaller pyinstaller/sqlite_dissect_linux-x64_onefile.spec | |
cd ./dist/linux-x64/bin/ | |
./sqlite_dissect -h | |
zip -r sqlite-dissect-linux-x64-${{ env.PYTHON_VERSION }}-binary.zip sqlite_dissect | |
mv sqlite-dissect-linux-x64-${{ env.PYTHON_VERSION }}-binary.zip ../../../ | |
cd ../../../ | |
rm -rf ./dist/ | |
# Upload the built executables | |
- name: Upload Linux Executable | |
uses: actions/upload-artifact@v4 | |
with: | |
name: linux-binary | |
path: sqlite-dissect-linux-x64-${{ env.PYTHON_VERSION }}-binary.zip | |
# Build the Sphinx documentation into a PDF for easier distribution | |
- name: Build Documentation | |
run: | | |
pip install -q sphinx | |
pip install -q sphinx-rtd-theme | |
sphinx-build -b html ./docs/source/ ./docs/build/ | |
# Upload the HTML documentation for distribution | |
- name: Upload HTML Docs | |
uses: actions/upload-artifact@v4 | |
with: | |
name: html-docs | |
path: ./docs/build/ | |
# Build the binary wheel as well as the source tar | |
- name: Build Objects | |
run: python setup.py sdist bdist_wheel | |
# Ensure the objects were packaged correctly and there wasn't an issue with | |
# the compilation or packaging process. | |
- name: Check Objects | |
run: twine check dist/* | |
# If this commit is the result of a Git tag, push the wheel and tar packages | |
# to the PyPi registry | |
- name: Publish to PyPI | |
if: startsWith(github.ref, 'refs/tags') | |
run: twine upload --repository-url https://upload.pypi.org/legacy/ -u __token__ -p ${{ secrets.PYPI_API_TOKEN }} --skip-existing --verbose dist/* |