mirror of
https://github.com/Skyvern-AI/skyvern.git
synced 2026-07-09 16:09:13 +00:00
150 lines
6.3 KiB
YAML
150 lines
6.3 KiB
YAML
name: Build Skyvern SDK and publish to PyPI
|
|
on:
|
|
workflow_dispatch:
|
|
push:
|
|
branches:
|
|
- main
|
|
paths:
|
|
- 'pyproject.toml'
|
|
permissions:
|
|
contents: read
|
|
jobs:
|
|
check-version-change:
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
should_publish: ${{ steps.check.outputs.should_publish }}
|
|
steps:
|
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
with:
|
|
fetch-depth: 2
|
|
persist-credentials: false
|
|
- name: Decide whether to publish
|
|
id: check
|
|
run: |
|
|
# Compare current vs previous commit, AND check PyPI for the new version.
|
|
# Without the PyPI check, reverts (1.0.37 -> 1.0.36) and re-bumps after a
|
|
# revert (1.0.36 -> 1.0.37, where 1.0.37 was already published) both look
|
|
# like "version changed" and crash the publish step with HTTP 400.
|
|
CURRENT_VERSION=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/')
|
|
|
|
git checkout HEAD^1
|
|
PREVIOUS_VERSION=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/')
|
|
|
|
if [ "$CURRENT_VERSION" = "$PREVIOUS_VERSION" ]; then
|
|
echo "Version unchanged at $CURRENT_VERSION; skipping publish."
|
|
echo "should_publish=false" >> $GITHUB_OUTPUT
|
|
exit 0
|
|
fi
|
|
echo "Version changed from $PREVIOUS_VERSION to $CURRENT_VERSION."
|
|
|
|
# Treat both skyvern and skyvern-ui as already-published only if both
|
|
# are present on PyPI at the new version. If either is missing (e.g.
|
|
# the first release of a new sibling package), proceed.
|
|
PYPI_INDEX="https://pypi.org/pypi"
|
|
SKYVERN_STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$PYPI_INDEX/skyvern/$CURRENT_VERSION/json")
|
|
SKYVERN_UI_STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$PYPI_INDEX/skyvern-ui/$CURRENT_VERSION/json")
|
|
echo "PyPI lookup: skyvern=$SKYVERN_STATUS skyvern-ui=$SKYVERN_UI_STATUS"
|
|
|
|
if [ "$SKYVERN_STATUS" = "200" ] && [ "$SKYVERN_UI_STATUS" = "200" ]; then
|
|
echo "Both packages already at $CURRENT_VERSION on PyPI; skipping publish."
|
|
echo "should_publish=false" >> $GITHUB_OUTPUT
|
|
else
|
|
echo "should_publish=true" >> $GITHUB_OUTPUT
|
|
fi
|
|
run-ci:
|
|
needs: check-version-change
|
|
if: needs.check-version-change.outputs.should_publish == 'true'
|
|
uses: ./.github/workflows/ci.yml
|
|
build-sdk:
|
|
runs-on: ubuntu-latest
|
|
needs: [check-version-change, run-ci]
|
|
if: needs.check-version-change.outputs.should_publish == 'true'
|
|
steps:
|
|
- name: Check out Git repository
|
|
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
with:
|
|
persist-credentials: false
|
|
# If you wanted to use multiple Python versions, you'd have specify a matrix in the job and
|
|
# reference the matrixe python version here.
|
|
- name: Setup Python
|
|
id: setup-python
|
|
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
with:
|
|
python-version: "3.11"
|
|
# Cache the installation of `uv` itself, e.g. the next step. This prevents the workflow
|
|
# from installing `uv` every time, which can be slow.
|
|
- name: Install uv
|
|
run: |
|
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
echo "$HOME/.local/bin" >> $GITHUB_PATH
|
|
- name: Set up Node.js
|
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
|
with:
|
|
node-version-file: .nvmrc
|
|
# Create/refresh environment. Avoid restoring build caches in the publishing
|
|
# job so release artifacts are built only from the checked-out source.
|
|
- name: Sync dependencies
|
|
run: |
|
|
uv sync --group dev
|
|
- name: Clean dist directory
|
|
run: rm -rf dist
|
|
- name: Verify package versions match
|
|
run: |
|
|
python - <<'PY'
|
|
from pathlib import Path
|
|
import tomllib
|
|
|
|
root_version = tomllib.loads(Path("pyproject.toml").read_text())["project"]["version"]
|
|
ui_version = tomllib.loads(Path("packages/skyvern-ui/pyproject.toml").read_text())["project"]["version"]
|
|
if root_version != ui_version:
|
|
raise SystemExit(f"skyvern version {root_version} does not match skyvern-ui version {ui_version}")
|
|
print(f"Building skyvern and skyvern-ui version {root_version}")
|
|
PY
|
|
- name: Build prebuilt UI package
|
|
run: scripts/build-skyvern-ui-package.sh dist/skyvern-ui
|
|
- name: Build Skyvern package
|
|
run: uv build --out-dir dist/skyvern
|
|
- name: Upload skyvern-ui distribution
|
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
with:
|
|
name: skyvern-ui-dist
|
|
path: dist/skyvern-ui/*
|
|
if-no-files-found: error
|
|
retention-days: 7
|
|
- name: Upload skyvern distribution
|
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
with:
|
|
name: skyvern-dist
|
|
path: dist/skyvern/*
|
|
if-no-files-found: error
|
|
retention-days: 7
|
|
publish-sdk:
|
|
runs-on: ubuntu-latest
|
|
needs: build-sdk
|
|
permissions:
|
|
contents: read
|
|
id-token: write
|
|
steps:
|
|
- name: Download skyvern-ui distribution
|
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
|
with:
|
|
name: skyvern-ui-dist
|
|
path: dist/skyvern-ui
|
|
- name: Download skyvern distribution
|
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
|
with:
|
|
name: skyvern-dist
|
|
path: dist/skyvern
|
|
- name: Publish skyvern-ui to PyPI
|
|
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
|
|
with:
|
|
packages-dir: dist/skyvern-ui/
|
|
# Defense-in-depth: if check-version-change ever misses an edge case
|
|
# (e.g. half-published release where one sibling landed), skip files
|
|
# already on PyPI rather than failing the whole publish step.
|
|
skip-existing: true
|
|
- name: Publish skyvern to PyPI
|
|
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
|
|
with:
|
|
packages-dir: dist/skyvern/
|
|
skip-existing: true
|