-
Notifications
You must be signed in to change notification settings - Fork 9
177 lines (150 loc) · 6.27 KB
/
ci.yml
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
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.12"
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.8", "3.10", "3.12" ]
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/[email protected]
with:
case-path: ./output/case.json
case-version: "case-1.1.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/*