Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dev/2.4.0 #91

Open
wants to merge 15 commits into
base: main
Choose a base branch
from
156 changes: 129 additions & 27 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout source
uses: actions/checkout@v4
uses: actions/checkout@v4.1.1
- name: Set up Python 3.11 for linting
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: '3.11'
- name: Install dependencies
Expand Down Expand Up @@ -52,14 +52,14 @@ jobs:
- auto
steps:
- name: Checkout source
uses: actions/checkout@v4
uses: actions/checkout@v4.1.1
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
if: runner.os == 'Linux' && matrix.arch != 'auto'
with:
platforms: all
- name: Setup Python
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ matrix.python-version }}
- name: Build pure wheel
Expand All @@ -71,13 +71,14 @@ jobs:
- name: Show built files
shell: bash
run: ls -la wheelhouse
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v3.1.3
name: Upload wheels artifact
with:
name: wheels
path: ./wheelhouse/ibeis*.whl
test_purepy_wheels:
name: ${{ matrix.python-version }} on ${{ matrix.os }}, arch=${{ matrix.arch }} with ${{ matrix.install-extras }}
if: "! startsWith(github.event.ref, 'refs/heads/release')"
runs-on: ${{ matrix.os }}
needs:
- build_purepy_wheels
Expand All @@ -87,10 +88,6 @@ jobs:
# Xcookie generates an explicit list of environments that will be used
# for testing instead of using the more concise matrix notation.
include:
- python-version: '3.7'
install-extras: tests-strict,runtime-strict,headless-strict
os: ubuntu-latest
arch: auto
- python-version: '3.8'
install-extras: tests-strict,runtime-strict,headless-strict
os: ubuntu-latest
Expand All @@ -107,14 +104,10 @@ jobs:
install-extras: tests-strict,runtime-strict,headless-strict
os: ubuntu-latest
arch: auto
- python-version: '3.7'
- python-version: '3.8'
install-extras: tests-strict,runtime-strict,optional-strict,headless-strict
os: ubuntu-latest
arch: auto
- python-version: '3.7'
install-extras: tests,optional,headless
os: ubuntu-latest
arch: auto
- python-version: '3.8'
install-extras: tests,optional,headless
os: ubuntu-latest
Expand All @@ -133,17 +126,17 @@ jobs:
arch: auto
steps:
- name: Checkout source
uses: actions/checkout@v4
uses: actions/checkout@v4.1.1
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
if: runner.os == 'Linux' && matrix.arch != 'auto'
with:
platforms: all
- name: Setup Python
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ matrix.python-version }}
- uses: actions/download-artifact@v3
- uses: actions/download-artifact@v2.1.1
name: Download wheels
with:
name: wheels
Expand All @@ -160,6 +153,9 @@ jobs:
pip install tomli pkginfo
export WHEEL_FPATH=$(python -c "import pathlib; print(str(sorted(pathlib.Path('wheelhouse').glob('ibeis*.whl'))[-1]).replace(chr(92), chr(47)))")
export MOD_VERSION=$(python -c "from pkginfo import Wheel; print(Wheel('$WHEEL_FPATH').version)")
echo "$WHEEL_FPATH=WHEEL_FPATH"
echo "$INSTALL_EXTRAS=INSTALL_EXTRAS"
echo "$MOD_VERSION=MOD_VERSION"
pip install --prefer-binary "ibeis[$INSTALL_EXTRAS]==$MOD_VERSION" -f wheelhouse
echo "Install finished."
- name: Test wheel ${{ matrix.install-extras }}
Expand All @@ -177,6 +173,7 @@ jobs:
ls -altr
# Get the path to the installed package and run the tests
export MOD_DPATH=$(python -c "import ibeis, os; print(os.path.dirname(ibeis.__file__))")
export MOD_NAME=ibeis
echo "
---
MOD_DPATH = $MOD_DPATH
Expand All @@ -196,15 +193,19 @@ jobs:
if: github.event_name == 'push' && ! startsWith(github.event.ref, 'refs/tags') && ! startsWith(github.event.ref, 'refs/heads/release')
needs:
- build_purepy_wheels
- test_purepy_wheels
steps:
- name: Checkout source
uses: actions/checkout@v4
- uses: actions/download-artifact@v3
name: Download wheels and sdist
uses: actions/checkout@v4.1.1
- uses: actions/download-artifact@v2.1.1
name: Download wheels
with:
name: wheels
path: wheelhouse
- uses: actions/[email protected]
name: Download sdist
with:
name: sdist_wheels
path: wheelhouse
- name: Show files to upload
shell: bash
run: ls -la wheelhouse
Expand Down Expand Up @@ -232,22 +233,52 @@ jobs:
pip install urllib3 requests[security] twine
GPG_KEYID=$(cat dev/public_gpg_key)
echo "GPG_KEYID = '$GPG_KEYID'"
DO_GPG=True GPG_KEYID=$GPG_KEYID TWINE_REPOSITORY_URL=${TWINE_REPOSITORY_URL} TWINE_PASSWORD=$TWINE_PASSWORD TWINE_USERNAME=$TWINE_USERNAME GPG_EXECUTABLE=$GPG_EXECUTABLE DO_UPLOAD=True DO_TAG=False ./publish.sh
GPG_SIGN_CMD="$GPG_EXECUTABLE --batch --yes --detach-sign --armor --local-user $GPG_KEYID"
WHEEL_PATHS=(wheelhouse/*.whl wheelhouse/*.tar.gz)
WHEEL_PATHS_STR=$(printf '"%s" ' "${WHEEL_PATHS[@]}")
echo "$WHEEL_PATHS_STR"
for WHEEL_PATH in "${WHEEL_PATHS[@]}"
do
echo "------"
echo "WHEEL_PATH = $WHEEL_PATH"
$GPG_SIGN_CMD --output $WHEEL_PATH.asc $WHEEL_PATH
$GPG_EXECUTABLE --verify $WHEEL_PATH.asc $WHEEL_PATH || echo "hack, the first run of gpg very fails"
$GPG_EXECUTABLE --verify $WHEEL_PATH.asc $WHEEL_PATH
done
ls -la wheelhouse
pip install opentimestamps-client
ots stamp wheelhouse/*.whl wheelhouse/*.tar.gz wheelhouse/*.asc
ls -la wheelhouse
twine upload --username __token__ --password "$TWINE_PASSWORD" --repository-url "$TWINE_REPOSITORY_URL" wheelhouse/*.whl wheelhouse/*.tar.gz --skip-existing --verbose || { echo "failed to twine upload" ; exit 1; }
- uses: actions/[email protected]
name: Upload deploy artifacts
with:
name: deploy_artifacts
path: |-
wheelhouse/*.whl
wheelhouse/*.zip
wheelhouse/*.tar.gz
wheelhouse/*.asc
wheelhouse/*.ots
live_deploy:
name: Uploading Live to PyPi
runs-on: ubuntu-latest
if: github.event_name == 'push' && (startsWith(github.event.ref, 'refs/tags') || startsWith(github.event.ref, 'refs/heads/release'))
needs:
- build_purepy_wheels
- test_purepy_wheels
steps:
- name: Checkout source
uses: actions/checkout@v4
- uses: actions/download-artifact@v3
name: Download wheels and sdist
uses: actions/checkout@v4.1.1
- uses: actions/download-artifact@v2.1.1
name: Download wheels
with:
name: wheels
path: wheelhouse
- uses: actions/[email protected]
name: Download sdist
with:
name: sdist_wheels
path: wheelhouse
- name: Show files to upload
shell: bash
run: ls -la wheelhouse
Expand Down Expand Up @@ -275,7 +306,78 @@ jobs:
pip install urllib3 requests[security] twine
GPG_KEYID=$(cat dev/public_gpg_key)
echo "GPG_KEYID = '$GPG_KEYID'"
DO_GPG=True GPG_KEYID=$GPG_KEYID TWINE_REPOSITORY_URL=${TWINE_REPOSITORY_URL} TWINE_PASSWORD=$TWINE_PASSWORD TWINE_USERNAME=$TWINE_USERNAME GPG_EXECUTABLE=$GPG_EXECUTABLE DO_UPLOAD=True DO_TAG=False ./publish.sh
GPG_SIGN_CMD="$GPG_EXECUTABLE --batch --yes --detach-sign --armor --local-user $GPG_KEYID"
WHEEL_PATHS=(wheelhouse/*.whl wheelhouse/*.tar.gz)
WHEEL_PATHS_STR=$(printf '"%s" ' "${WHEEL_PATHS[@]}")
echo "$WHEEL_PATHS_STR"
for WHEEL_PATH in "${WHEEL_PATHS[@]}"
do
echo "------"
echo "WHEEL_PATH = $WHEEL_PATH"
$GPG_SIGN_CMD --output $WHEEL_PATH.asc $WHEEL_PATH
$GPG_EXECUTABLE --verify $WHEEL_PATH.asc $WHEEL_PATH || echo "hack, the first run of gpg very fails"
$GPG_EXECUTABLE --verify $WHEEL_PATH.asc $WHEEL_PATH
done
ls -la wheelhouse
pip install opentimestamps-client
ots stamp wheelhouse/*.whl wheelhouse/*.tar.gz wheelhouse/*.asc
ls -la wheelhouse
twine upload --username __token__ --password "$TWINE_PASSWORD" --repository-url "$TWINE_REPOSITORY_URL" wheelhouse/*.whl wheelhouse/*.tar.gz --skip-existing --verbose || { echo "failed to twine upload" ; exit 1; }
- uses: actions/[email protected]
name: Upload deploy artifacts
with:
name: deploy_artifacts
path: |-
wheelhouse/*.whl
wheelhouse/*.zip
wheelhouse/*.tar.gz
wheelhouse/*.asc
wheelhouse/*.ots
release:
name: Create Github Release
if: github.event_name == 'push' && (startsWith(github.event.ref, 'refs/tags') || startsWith(github.event.ref, 'refs/heads/release'))
runs-on: ubuntu-latest
permissions:
contents: write
needs:
- live_deploy
steps:
- name: Checkout source
uses: actions/[email protected]
- uses: actions/[email protected]
name: Download artifacts
with:
name: deploy_artifacts
path: wheelhouse
- name: Show files to release
shell: bash
run: ls -la wheelhouse
- run: 'echo "Automatic Release Notes. TODO: improve" > ${{ github.workspace }}-CHANGELOG.txt'
- name: Tag Release Commit
if: (startsWith(github.event.ref, 'refs/heads/release'))
run: |-
export VERSION=$(python -c "import setup; print(setup.VERSION)")
git tag "v$VERSION"
git push origin "v$VERSION"
- uses: softprops/action-gh-release@v1
name: Create Release
id: create_release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
body_path: ${{ github.workspace }}-CHANGELOG.txt
tag_name: ${{ github.ref }}
name: Release ${{ github.ref }}
body: Automatic Release
generate_release_notes: true
draft: true
prerelease: false
files: |-
wheelhouse/*.whl
wheelhouse/*.asc
wheelhouse/*.ots
wheelhouse/*.zip
wheelhouse/*.tar.gz


###
Expand Down
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ We are currently working on porting this changelog to the specifications in
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).


### [Version 2.4.0] - Released xx

### Added
* Can now dump a simplified version of the database to a kwcoco file

### [Version 2.3.2] - Released 2024-02-01

### Fixed:
Expand Down Expand Up @@ -61,4 +66,3 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm

### Added
* First semi-usable pip release

2 changes: 1 addition & 1 deletion dev/_scripts/_timeits/time_uuids.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
# My data getters
from vtool_ibeis.tests import grabdata
elephant = grabdata.get_testimg_path('elephant.jpg')
lena = grabdata.get_testimg_path('lena.jpg')
astro = grabdata.get_testimg_path('astro.jpg')
zebra = grabdata.get_testimg_path('zebra.jpg')
jeff = grabdata.get_testimg_path('jeff.png')
gpath = zebra
Expand Down
98 changes: 49 additions & 49 deletions dev/ci_public_gpg_key.pgp.enc
Original file line number Diff line number Diff line change
@@ -1,49 +1,49 @@
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
z0lGG7pdLlYb/6bICUgTmg==
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
Siv1Yf+we9qIWUiidmLgFg==
Loading
Loading