-
Notifications
You must be signed in to change notification settings - Fork 50
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Sm 989 create build pipeline for the python language wrapper (#369)
## Type of change - [ ] Bug fix - [ ] New feature development - [x] Tech debt (refactoring, code cleanup, dependency upgrades, etc) - [x] Build/deploy pipeline (DevOps) - [ ] Other ## Objective Package the Python SDK so that it can be published to [PyPI.org](pypi.org). ## Code changes - **`.github/workflows/build-python-wheels.yml`:** create wheels for Linux, macOS, and Windows (AMD64-only). A sdist is also created for other platforms. - **`languages/python/BitwardenClient/__init__.py`:** export functions and classes for autocompletion in IDEs and the interactive Python interpreter - **`languages/python/pyproject.toml`**: replaces `setup.py`, which is no longer officially supported. This uses Maturin to build the Rust shared-object library that will be bundled with the SDK. - **`languages/python/setup.py`**: replaced by `pyproject.toml` ## Before you submit - Please add **unit tests** where it makes sense to do so (encouraged but not required) --------- Co-authored-by: Daniel García <dani-garcia@users.noreply.github.com>
- Loading branch information
1 parent
d70deac
commit 9cad470
Showing
6 changed files
with
228 additions
and
50 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
--- | ||
name: Build Python Wheels | ||
|
||
on: | ||
pull_request: | ||
push: | ||
branches: | ||
- "main" | ||
- "rc" | ||
- "hotfix-rc" | ||
workflow_dispatch: | ||
|
||
defaults: | ||
run: | ||
shell: bash | ||
working-directory: languages/python | ||
|
||
jobs: | ||
generate_schemas: | ||
uses: ./.github/workflows/generate_schemas.yml | ||
|
||
setup: | ||
name: Setup | ||
runs-on: ubuntu-22.04 | ||
outputs: | ||
package_version: ${{ steps.retrieve-version.outputs.package_version }} | ||
steps: | ||
- name: Checkout repo | ||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | ||
|
||
- name: Get Package Version | ||
id: retrieve-version | ||
run: | | ||
VERSION="$(grep -o '^version = ".*"' ../../crates/bitwarden-py/Cargo.toml | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+")" | ||
echo "package_version=$VERSION" >> $GITHUB_OUTPUT | ||
build: | ||
name: Building Python wheel for - ${{ matrix.settings.os }} - ${{ matrix.settings.target }} | ||
runs-on: ${{ matrix.settings.os || 'ubuntu-latest' }} | ||
needs: | ||
- generate_schemas | ||
- setup | ||
env: | ||
_PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
settings: | ||
- os: macos-12 | ||
target: x86_64-apple-darwin | ||
|
||
- os: macos-12 | ||
target: aarch64-apple-darwin | ||
|
||
- os: windows-2022 | ||
target: x86_64-pc-windows-msvc | ||
|
||
- os: ubuntu-22.04 | ||
target: x86_64-unknown-linux-gnu | ||
|
||
- os: ubuntu-22.04 | ||
target: aarch64-unknown-linux-gnu | ||
|
||
steps: | ||
- name: Checkout repo | ||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | ||
|
||
- name: Setup Node | ||
uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 | ||
with: | ||
node-version: 18 | ||
|
||
- name: Install rust | ||
uses: dtolnay/rust-toolchain@439cf607258077187679211f12aa6f19af4a0af7 # stable | ||
with: | ||
toolchain: stable | ||
targets: ${{ matrix.settings.target }} | ||
|
||
- name: Cache cargo registry | ||
uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1 | ||
with: | ||
key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.os }} | ||
|
||
- name: Retrieve schemas | ||
uses: actions/download-artifact@f44cd7b40bfd40b6aa1cc1b9b5b7bf03d3c67110 # v4.1.0 | ||
with: | ||
name: schemas.py | ||
path: ${{ github.workspace }}/languages/python/bitwarden_sdk | ||
|
||
- name: Build wheels | ||
if: ${{ matrix.settings.target != 'x86_64-unknown-linux-gnu' }} | ||
uses: PyO3/maturin-action@b9e8f88fd4448fdecf5095864cdc7e39a544aa9f # v1.40.7 | ||
with: | ||
target: ${{ matrix.settings.target }} | ||
args: --release --find-interpreter --sdist | ||
sccache: "true" | ||
manylinux: "2_28" # https://github.com/pola-rs/polars/pull/12211 | ||
working-directory: ${{ github.workspace }}/languages/python | ||
|
||
- name: Build wheels (Linux - x86_64) | ||
if: ${{ matrix.settings.target == 'x86_64-unknown-linux-gnu' }} | ||
uses: PyO3/maturin-action@b9e8f88fd4448fdecf5095864cdc7e39a544aa9f # v1.40.7 | ||
with: | ||
target: ${{ matrix.settings.target }} | ||
args: --release --find-interpreter --sdist | ||
container: quay.io/pypa/manylinux_2_28_x86_64:2023-11-20-745eb52 | ||
sccache: "true" | ||
manylinux: "2_28" # https://github.com/pola-rs/polars/pull/12211 | ||
working-directory: ${{ github.workspace }}/languages/python | ||
|
||
- name: Upload wheels | ||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 | ||
with: | ||
name: bitwarden_sdk-${{ env._PACKAGE_VERSION }}-${{ matrix.settings.target }} | ||
path: ${{ github.workspace }}/target/wheels/bitwarden_sdk*.whl | ||
|
||
- name: Upload sdists | ||
if: ${{ matrix.settings.target == 'x86_64-unknown-linux-gnu' }} # we only need one sdist | ||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 | ||
with: | ||
name: bitwarden_sdk-${{ env._PACKAGE_VERSION }}-sdist | ||
path: ${{ github.workspace }}/target/wheels/bitwarden_sdk-*.tar.gz |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,31 +1,32 @@ | ||
# Requirements | ||
|
||
- Python3 | ||
- setuptools | ||
```bash | ||
pip install setuptools | ||
``` | ||
- setuptools_rust | ||
```bash | ||
pip install setuptools_rust | ||
``` | ||
- dateutil | ||
```bash | ||
pip install python-dateutil | ||
``` | ||
|
||
# Installation | ||
|
||
From the `languages/python/` directory, | ||
# Build locally | ||
## Requirements | ||
|
||
- Python 3 | ||
- `maturin` (install with `pip install maturin[patchelf]`) | ||
- `npm` | ||
|
||
## Build | ||
|
||
From the root of the repository: | ||
```bash | ||
python3 ./setup.py develop | ||
npm run schemas # generate schemas.py | ||
|
||
cd languages/python/ | ||
maturin develop | ||
``` | ||
|
||
Rename the the resulting `.so` file to `bitwarden_py.so`, if it isn't already there. | ||
You can now import `BitwardenClient` in your Python code. | ||
|
||
# Use without building locally | ||
|
||
```bash | ||
pip install BitwardenClient | ||
``` | ||
|
||
# Run | ||
|
||
Set the `ORGANIZATION_ID` and `ACCESS_TOKEN` environment variables to your organization ID and access token, respectively. | ||
|
||
```bash | ||
python3 ./login.py | ||
python3 ./example.py | ||
``` |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
"""The official Bitwarden client library for Python.""" | ||
|
||
__version__ = "0.1.0" | ||
|
||
from .bitwarden_client import * | ||
from .schemas import * | ||
|
||
__doc__ = bitwarden_client.__doc__ | ||
if hasattr(bitwarden_client, "__all__"): | ||
__all__ = bitwarden_client.__all__ | ||
|
||
if hasattr(schemas, "__all__"): | ||
__all__ += schemas.__all__ |
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
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
[build-system] | ||
build-backend = "maturin" | ||
requires = ["maturin>=1.0,<2.0", "setuptools_rust>=1.8.1"] | ||
|
||
[project] | ||
authors = [{ name = "Bitwarden", email = "support@bitwarden.com" }] | ||
classifiers = [ | ||
"Development Status :: 4 - Beta", | ||
"Intended Audience :: Developers", | ||
"License :: Other/Proprietary License", | ||
"Programming Language :: Python :: 3 :: Only", | ||
"Programming Language :: Rust", | ||
"Topic :: Security", | ||
] | ||
dependencies = ["dateutils >= 0.6.6"] | ||
description = "A Bitwarden Client for python" | ||
name = "bitwarden_sdk" | ||
readme = "README.md" | ||
requires-python = ">=3.0" | ||
version = "0.1.0" | ||
|
||
[tool.maturin] | ||
bindings = "pyo3" | ||
compatibility = "2_28" | ||
include = [ | ||
{ path = "bitwarden_sdk/*.py", format = ["sdist", "wheel"] } | ||
] | ||
manifest-path = "../../crates/bitwarden-py/Cargo.toml" | ||
python-packages = ["bitwarden_sdk"] |
This file was deleted.
Oops, something went wrong.