Skip to content
Open
Show file tree
Hide file tree
Changes from 58 commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
88398fb
add wheel building action
MOmarMiraj Mar 4, 2025
8eac2b7
fix manylinux image and dont build wheels for PyPi
MOmarMiraj Mar 4, 2025
c2627e6
go to 2_34 manylinux image as theres no 2_32 image
MOmarMiraj Mar 4, 2025
ea82680
fix linux image name
MOmarMiraj Mar 4, 2025
9742677
add full url for linux image
MOmarMiraj Mar 4, 2025
16a9cb4
update setup.py to build in correct folder
MOmarMiraj Mar 4, 2025
cd8b06f
update test cmd path
MOmarMiraj Mar 4, 2025
6f659f6
checkout only the example folder
MOmarMiraj Mar 4, 2025
deaeb15
checkout example folder correctly
MOmarMiraj Mar 4, 2025
efe387e
edit path
MOmarMiraj Mar 4, 2025
670175f
add support for shared libs packaging
MOmarMiraj Mar 5, 2025
3ad27e9
add cryptography as a wheel
MOmarMiraj Mar 5, 2025
5e84ed0
make it manual
MOmarMiraj Mar 5, 2025
35d2f0d
don't stop if fail
MOmarMiraj Mar 5, 2025
67edcbb
debug working dir
MOmarMiraj Mar 5, 2025
145758d
check file permissions
MOmarMiraj Mar 5, 2025
f316654
change to python instead of python3
MOmarMiraj Mar 5, 2025
881497d
remove other jobs and see files path
MOmarMiraj Mar 5, 2025
f7a1083
try hardcoded path
MOmarMiraj Mar 5, 2025
1cc21ce
debug
MOmarMiraj Mar 5, 2025
f94d10b
see python version and go to 3.12
MOmarMiraj Mar 5, 2025
c777afd
try
MOmarMiraj Mar 5, 2025
521efd0
check here
MOmarMiraj Mar 5, 2025
bacb8c7
try bilding wheels now
MOmarMiraj Mar 5, 2025
efc4ed4
fix path of test and removei nstallation of python
MOmarMiraj Mar 5, 2025
8f19e0d
add python3
MOmarMiraj Mar 5, 2025
1a3e9bb
revert path
MOmarMiraj Mar 5, 2025
e3ffc3e
add script
MOmarMiraj Mar 5, 2025
ea0c161
add permission
MOmarMiraj Mar 5, 2025
fce070e
fix name
MOmarMiraj Mar 5, 2025
8bba2eb
delete script
MOmarMiraj Mar 5, 2025
028d32b
fix test command
MOmarMiraj Mar 5, 2025
2e6941f
pass sa token to linux
MOmarMiraj Mar 5, 2025
4e944bd
add morgan change
MOmarMiraj Mar 5, 2025
cd9b562
fix rules of when this job wil run
MOmarMiraj Mar 5, 2025
98f4832
update sa token
MOmarMiraj Mar 5, 2025
8bf9ccb
test on test_client instead of example.py
MOmarMiraj Mar 5, 2025
e88f750
skip musllinux wheels
MOmarMiraj Mar 5, 2025
976c276
fix rules for when the job is ran
MOmarMiraj Mar 5, 2025
2a09d16
check if its manual and its a release branch
MOmarMiraj Mar 5, 2025
1fc3895
add input
MOmarMiraj Mar 5, 2025
c3f0211
remove the push
MOmarMiraj Mar 5, 2025
cc5cf76
fix up yml file
MOmarMiraj Mar 5, 2025
5690c32
revert example file
MOmarMiraj Mar 5, 2025
2345ad1
clean up setup.py
MOmarMiraj Mar 5, 2025
a16e535
add build sdist and fix EOL
MOmarMiraj Mar 5, 2025
94fe548
add test job for source distro
MOmarMiraj Mar 6, 2025
1a487ca
test sdist job
MOmarMiraj Mar 6, 2025
f7b1d8c
install python dep for source distro
MOmarMiraj Mar 6, 2025
3593dfb
clean up .yml file
MOmarMiraj Mar 6, 2025
212f8a6
add publishing of pypi to workflow
MOmarMiraj Mar 6, 2025
fa1c3ec
fix wheels to correctly build and publish wheels to pypi and add pypr…
MOmarMiraj Mar 8, 2025
314cdc7
add new line at EOF
MOmarMiraj Mar 8, 2025
a004bf2
Add prep-release and release and update wheels according to fork of P…
MOmarMiraj Apr 3, 2025
43548d1
remove release notes and add comments
MOmarMiraj Apr 3, 2025
2474110
Merge branch 'main' into omar/automate-wheel-build
MOmarMiraj Apr 3, 2025
5750b30
remove unnecessary c omments
MOmarMiraj Apr 3, 2025
95c3aee
update setting up git user to use person who commited to be the one w…
MOmarMiraj Apr 4, 2025
0a8e17a
Apply suggestions from code review
MOmarMiraj May 9, 2025
55c7792
Merge branch 'main' into omar/automate-wheel-build
MOmarMiraj May 9, 2025
c63f59b
Clean up files and change version.txt to .VERSION
MOmarMiraj May 9, 2025
6891a34
remove wheels.yml and add building+publishing to release
MOmarMiraj May 9, 2025
62c6f61
add passphrase and token env variables for signing commits
MOmarMiraj May 9, 2025
2e6d5e5
Remove prep release action and combine it with the release action and…
MOmarMiraj May 12, 2025
1debd81
add new line at EOF of version file and fix script to trim it. Addres…
MOmarMiraj May 20, 2025
6b1d7eb
fail prep release if on CI to avoid inf loop
MOmarMiraj May 20, 2025
4699a2e
update wheels script to match CI/CD incase of error
MOmarMiraj May 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions .github/workflows/prep-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: Prep Release

on:
workflow_dispatch:
inputs:
version:
description: "Version number:"
required: true
type: string
build_number:
description: "Build number:"
required: true
type: string

jobs:
prepare-release:
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/heads/sdk-core/') # Only run on branches that start with sdk-core/
steps:
- name: Checkout the code
uses: actions/checkout@v4

- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v6
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
git_user_signingkey: true
git_commit_gpgsign: true
git_tag_gpgsign: true
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

whose GPG key is this?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be the private key of the bot that we will add to the secrets.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you clarify which fields exactly you would expect to have in the GitHub Secrets? i.e. the key & value for the secret.

As well as any other dependencies that we should take care of before merging this MR - would be nice to have a Dependencies section in the PR description.

Copy link
Copy Markdown
Contributor Author

@MOmarMiraj MOmarMiraj May 9, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Github secrets would have to have the GPG secret key from the bot we expect to push the release. Similar to how it is here, it would be GPG_PRIVATE_KEY as the key and the value would be the actual GPG key. Yes I can add that dependencies in the PR section.


- name: Setup Git User
run: |
git config user.name "$GITHUB_ACTOR"
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"

- name: Parse and Validate Inputs
id: get_inputs
run: |
# Get inputs passed to the workflow
VERSION="${{ github.event.inputs.version }}"
BUILD_NUMBER="${{ github.event.inputs.build_number }}"

# Save the parsed values for future steps
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "BUILD_NUMBER=$BUILD_NUMBER" >> $GITHUB_ENV
shell: bash

- name: Run the Prep Release Script
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
make prep-release VERSION="$VERSION" BUILD_NUMBER="$BUILD_NUMBER"
shell: bash
29 changes: 29 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Release SDK

on:
workflow_dispatch:

jobs:
Release-SDK:
Comment thread
MOmarMiraj marked this conversation as resolved.
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/heads/sdk-core/') # Only run on branches that start with sdk-core/
steps:
- name: Checkout the code
uses: actions/checkout@v4
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v6
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
git_user_signingkey: true
git_commit_gpgsign: true
git_tag_gpgsign: true
- name: Setup Git User
run: |
git config user.name "$GITHUB_ACTOR"
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"

- name: Run the Release Script
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: make release
shell: bash
101 changes: 101 additions & 0 deletions .github/workflows/wheels.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
name: Wheels Builder and Publisher
on:
pull_request:
branches:
- main
types:
- closed
Comment thread
MOmarMiraj marked this conversation as resolved.
Outdated

jobs:
build_wheels:
name: Build wheels for Python SDK on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
if: github.event.pull_request.merged == true && contains(github.event.pull_request.head.ref, 'sdk-core/')
strategy:
fail-fast: false
matrix:
# macOS 13 is an Intel runner and macOS 14 is an Apple Silicon runner
os: [ubuntu-22.04, ubuntu-22.04-arm, windows-latest, macos-13, macos-14]
steps:
- uses: actions/checkout@v4
- name: Upgrade build dependencies
run: python -m pip install --upgrade pip setuptools wheel


# Need to grab the SDK version for the wheel name
- name: Extract SDK Version
Comment thread
MOmarMiraj marked this conversation as resolved.
Outdated
run: echo "SDK_VERSION=$(cat version.txt)" >> "$GITHUB_ENV"
shell: bash

- name: Install cibuildwheel
run: |
python -m pip install cibuildwheel

- name: Build wheels
env:
CIBW_SKIP: pp* *-musllinux_*
CIBW_MANYLINUX_X86_64_IMAGE: "quay.io/pypa/manylinux_2_34_x86_64"
CIBW_MANYLINUX_AARCH64_IMAGE: "quay.io/pypa/manylinux_2_34_aarch64"
CIBW_ARCHS: "native" # Equivalent to python's platform.machine()
CIBW_BEFORE_BUILD_WINDOWS: "pip install delvewheel"
CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: "delvewheel repair -w {dest_dir} {wheel}"
CIBW_TEST_REQUIRES: "pydantic pytest pytest-asyncio"
MACOSX_DEPLOYMENT_TARGET: "12.0"
CIBW_TEST_COMMAND: "python -m pytest {project}/src/onepassword/test_client.py"
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.TEST_SERVICE_ACCOUNT_TOKEN }}
CIBW_ENVIRONMENT_PASS_LINUX: OP_SERVICE_ACCOUNT_TOKEN # We have to specify this to pass the token to the test command
run: |
python -m cibuildwheel --output-dir dist

- uses: actions/upload-artifact@v4
with:
name: onepassword-sdk-${{ env.SDK_VERSION }}-${{ matrix.os }}
path: ./dist/*.whl

build-sdist:
name: Build source distribution for Python SDK
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true && contains(github.event.pull_request.head.ref, 'sdk-core/')
Comment thread
MOmarMiraj marked this conversation as resolved.
Outdated
steps:
- uses: actions/checkout@v4

- name: Extract SDK Version
run: echo "SDK_VERSION=$(cat version.txt)" >> "$GITHUB_ENV"
shell: bash

- name: Install dependencies
run: pip3 install build pydantic pytest pytest-asyncio

- name: Build source distribution
run: python3 -m build --sdist

- name: Test Source Distribution
env:
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.TEST_SERVICE_ACCOUNT_TOKEN }}
run: |
python3 -m pip install dist/*.tar.gz
python3 -m pytest src/onepassword/test_client.py

- uses: actions/upload-artifact@v4
with:
name: onepassword-sdk-${{ env.SDK_VERSION }}
path: ./dist/*.tar.gz

publish-to-pypi:
name: Publish to PyPI
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true && contains(github.event.pull_request.head.ref, 'sdk-core/')
environment:
name: pypi
url: https://pypi.org/project/onepassword-sdk/
permissions:
id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
needs: [build_wheels, build-sdist]
steps:
- uses: actions/download-artifact@v4
with:
pattern: onepassword-sdk-*
path: ./dist
merge-multiple: true
- name: Publish package distributions to PyPi
uses: pypa/gh-action-pypi-publish@release/v1.12
33 changes: 33 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
[build-system]
requires = ["setuptools>=66", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "onepassword-sdk"
Comment thread
MOmarMiraj marked this conversation as resolved.
dynamic = ["version"]
description = "The 1Password Python SDK offers programmatic read access to your secrets in 1Password in an interface native to Python."
authors = [{ name = "1Password" }]
license = { file = "LICENSE" }
readme = "README.md"
requires-python = ">=3.9"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Operating System :: MacOS",
"Operating System :: POSIX :: Linux",
"Operating System :: Microsoft :: Windows",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"License :: OSI Approved :: MIT License",
]
dependencies = [
"pydantic>=2.5",
]

[project.urls]
Homepage = "https://github.com/1Password/onepassword-sdk-python"

[tool.setuptools.dynamic]
version = {file = "./version.txt"}
33 changes: 5 additions & 28 deletions setup.py
Comment thread
MOmarMiraj marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
from pathlib import Path
from setuptools import setup, find_packages
from setuptools import setup, find_packages, Distribution
from sysconfig import get_platform
from version import SDK_VERSION
import platform
import os

Expand All @@ -19,6 +17,9 @@ def finalize_options(self):
except ImportError:
bdist_wheel = None

class BinaryDistribution(Distribution):
def has_ext_modules(self):
return True

def get_shared_library_data_to_include():
# Return the correct uniffi C shared library extension for the given platform
Expand Down Expand Up @@ -46,35 +47,11 @@ def get_shared_library_data_to_include():


setup(
name="onepassword-sdk",
version=SDK_VERSION,
author="1Password",
long_description=(Path(__file__).parent / "README.md").read_text(),
long_description_content_type="text/markdown",
description="The 1Password Python SDK offers programmatic read access to your secrets in 1Password in an interface native to Python.",
url="https://github.com/1Password/onepassword-sdk-python",
packages=find_packages(
where="src",
),
license="MIT",
license_files="LICENSE",
distclass=BinaryDistribution,
package_dir={"": "src"},
python_requires=">=3.9",
classifiers=[
"Development Status :: 5 - Production/Stable",
"Operating System :: MacOS",
"Operating System :: POSIX :: Linux",
"Operating System :: Microsoft :: Windows",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"License :: OSI Approved :: MIT License",
],
cmdclass={"bdist_wheel": bdist_wheel},
package_data={"": get_shared_library_data_to_include()},
install_requires=[
"pydantic>=2.5", # Minimum Pydantic version to run the Python SDK
],
)
4 changes: 1 addition & 3 deletions src/release/scripts/build-wheels.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

# Helper script to build the required wheels for the Python SDK

output_version_file="version.py"

# The list of python verisons the SDKs release for
python_versions=("$@")

Expand All @@ -15,7 +13,7 @@ macOS_version_x86_64=10.9
macOS_version_arm64=11.0

# Extracts the current verison number for cleanup function
current_version=$(awk -F "['\"]" '/SDK_VERSION =/{print $2}' "$output_version_file")
current_version=$(cat version.txt)

# Function to execute upon exit
cleanup() {
Expand Down
11 changes: 5 additions & 6 deletions src/release/scripts/prep-release.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,20 @@

# Helper script to prepare a release for the Python SDK.

output_version_file="version.py"
output_version_file="version.txt"
output_build_file="src/onepassword/build_number.py"
version_template_file="src/release/templates/version.tpl.py"
build_number_template_file="src/release/templates/build_number.tpl.py"


# Extracts the current build/version number for comparison and backup
current_version=$(awk -F "['\"]" '/SDK_VERSION =/{print $2}' "$output_version_file")
current_version=$(cat "$output_version_file")
current_build=$(awk -F "['\"]" '/SDK_BUILD_NUMBER =/{print $2}' "$output_build_file")

# Function to execute upon exit
cleanup() {
echo "Performing cleanup tasks..."
# Revert changes to file if any
sed -e "s/{{ version }}/$current_version/" "$version_template_file" > "$output_version_file"
echo -n "$current_version" > "$output_version_file"
sed -e "s/{{ build }}/$current_build/" "$build_number_template_file" > "$output_build_file"
exit 1
}
Expand Down Expand Up @@ -86,8 +85,8 @@ update_and_validate_version
# Update and validate the build number
update_and_validate_build

# Update version & build number in version.py and build_number.py respectively
sed -e "s/{{ version }}/$version/" "$version_template_file" > "$output_version_file"
# Update version & build number in version.txt and build_number.py respectively
echo -n "$version" > "$output_version_file"
sed -e "s/{{ build }}/$build/" "$build_number_template_file" > "$output_build_file"


Expand Down
9 changes: 1 addition & 8 deletions src/release/scripts/release.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
set -e

# Read the contents of the files into variables
version=$(awk -F "['\"]" '/SDK_VERSION =/{print $2}' "version.py")
version=$(cat "version.txt")
build=$(awk -F "['\"]" '/SDK_BUILD_NUMBER =/{print $2}' "src/onepassword/build_number.py")
release_notes=$(< src/release/RELEASE-NOTES)

Expand All @@ -27,10 +27,3 @@ git tag -a -s "v${version}" -m "${version}"
git push origin tag "v${version}"

gh release create "v${version}" --title "Release ${version}" --notes "${release_notes}" --repo github.com/1Password/onepassword-sdk-python

# Release on PyPi
python3 -m twine upload dist/*

# Delete the dist folder after published
rm -r dist src/*.egg-info

1 change: 0 additions & 1 deletion src/release/templates/version.tpl.py

This file was deleted.

1 change: 0 additions & 1 deletion version.py

This file was deleted.

1 change: 1 addition & 0 deletions version.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0.2.0
Comment thread
MOmarMiraj marked this conversation as resolved.
Outdated
Loading