Release Process#

This guide describes Apache TVM-FFI release workflow for creating a release candidate, staging artifacts on ASF SVN, finalizing the release tag, and publishing release artifacts.

Prerequisite

The following environment variables need to be set before running the release steps:

export FFI_VERSION="v0.1.7-rc0"
export FFI_RELEASE_VERSION="v0.1.7"
export ASF_USERNAME="your-apache-username"
  • Tools: git, svn, gpg, gtar, and shasum;

  • A configured GPG key for signing artifacts.

Important

This tutorial is based on macOS. Adjust commands accordingly for other operating systems.

Pre-release checklist (Step 0)#

Before running the steps below, create the release candidate tag and open the release vote.

Step 0.1. Tag pre-release $FFI_VERSION on apache/tvm-ffi.

Step 0.2. Open a voting thread: apache/tvm-ffi#new (Example)

Step 1. Create Release Candidate#

This builds and signs the source release artifacts under tvm-ffi-$FFI_VERSION/.

_make_tarball() {
  local _ver="$1"
  local _workdir="tvm-ffi-$_ver-release-files"
  local _release_dir="tvm-ffi-$_ver"
  local _tarball="apache-tvm-ffi-$_ver.tar.gz"

  mkdir -p "$_workdir" "$_release_dir"
  (
    cd "$_workdir"

    git clone --recursive https://github.com/apache/tvm-ffi.git ffi-release
    cd ffi-release

    git checkout "$_ver"
    rm -rf .DS_Store
    find . -name ".git*" -print0 | xargs -0 rm -rf

    cd ..
    gtar -czvf "$_tarball" -C ffi-release .
    gpg --armor --output "$_tarball.asc" --detach-sig "$_tarball"
    shasum -a 512 "$_tarball" > "$_tarball.sha512"
  )
  mv "$_workdir/$_tarball" "$_release_dir/"
  mv "$_workdir/$_tarball.asc" "$_release_dir/"
  mv "$_workdir/$_tarball.sha512" "$_release_dir/"
  rm -rf "$_workdir"
}

_upload_to_apache_dev_svn() {
  local _ver="$1"
  local _asf_username="$2"
  local _svn_dir="$(pwd)/svn-tvm"
  local _release_dir="tvm-ffi-$_ver"
  (
    svn co --depth=files "https://dist.apache.org/repos/dist/dev/tvm" $_svn_dir
    cp -r "${_release_dir}/" "$_svn_dir/$_release_dir"
    cd "$_svn_dir"
    svn add "$_release_dir"
    svn ci --username "$_asf_username" -m "Add TVM-FFI $_ver"
  )
}

_make_tarball "$FFI_VERSION"
_upload_to_apache_dev_svn "$FFI_VERSION" "$ASF_USERNAME"

Step 2. Conclude Release#

After the vote passes, retag the release, publish the wheel, bump versions, and trigger the docs release.

Step 2.1. Conclude voting results: apache/tvm-ffi#new. (Example)

Step 2.2. Publish PyPI wheel: apache/tvm-ffi.

Step 2.3. Update documentation to latest: apache/tvm-site.

Step 2.4. Re-tag the release candidate to the final release version, and bump the version in the source tree:

_retag_and_bump_version() {
  local _ffi_version="$1"
  local _ffi_release_version="$2"

  # Configuration variables
  local _repo_url="git@github.com:apache/tvm-ffi.git"
  local _work_dir="tvm-ffi-release"
  local _git_remote="upstream"
  local _header_file="include/tvm/ffi/c_api.h"

  # 1. Git clone with remote named "upstream"
  echo "Cloning repository..."
  git clone -o "$_git_remote" "$_repo_url" "$_work_dir"
  cd "$_work_dir" || return 1
  git fetch "$_git_remote" --tags

  # 2. Replace tag and push
  local _ffi_commit="$(git rev-parse "${_ffi_version}^{commit}")"
  echo "Creating release tag $_ffi_release_version at commit $_ffi_commit..."
  git tag -a "$_ffi_release_version" "$_ffi_commit" -m "Release $_ffi_release_version"
  git push "$_git_remote" "$_ffi_release_version"
  git push "$_git_remote" --delete "$_ffi_version"

  # 3. Version bump after the release
  local _today=$(date +%Y-%m-%d)
  local _branch_name="${_today}/ver-bump"
  local _current_patch=$(grep "#define TVM_FFI_VERSION_PATCH" "$_header_file" | awk '{print $3}')
  local _new_patch=$((_current_patch + 1))
  git checkout -b "$_branch_name"
  echo "Bumping TVM_FFI_VERSION_PATCH from $_current_patch to $_new_patch"
  sed "s/#define TVM_FFI_VERSION_PATCH $_current_patch/#define TVM_FFI_VERSION_PATCH $_new_patch/" "$_header_file" > "${_header_file}.tmp" && mv "${_header_file}.tmp" "$_header_file"
  echo "Committing and pushing changes..."
  git add "$_header_file"
  git commit -m "chore(release): Version bump after release $_ffi_release_version"
  git push -u "$_git_remote" "$_branch_name"
}

_retag_and_bump_version "$FFI_VERSION" "$FFI_RELEASE_VERSION"

Step 3. Upload Release Artifacts#

After the release is final, copy the RC artifacts into dist/release with the final version name.

_upload_svn() {
  local _ffi_version="$1"
  local _ffi_release_version="$2"
  local _asf_username="$3"
  local _release_dir="tvm-ffi-$_ffi_version"
  local _svn_dir="$(pwd)/svn-tvm-release"
  (
    svn co --depth=files "https://dist.apache.org/repos/dist/release/tvm" $_svn_dir
    mkdir -p "$_svn_dir/tvm-ffi-$_ffi_release_version"
    cp "${_release_dir}/apache-tvm-ffi-$_ffi_version.tar.gz" "$_svn_dir/tvm-ffi-$_ffi_release_version/apache-tvm-ffi-src-$_ffi_release_version.tar.gz"
    cp "${_release_dir}/apache-tvm-ffi-$_ffi_version.tar.gz.asc" "$_svn_dir/tvm-ffi-$_ffi_release_version/apache-tvm-ffi-src-$_ffi_release_version.tar.gz.asc"
    cp "${_release_dir}/apache-tvm-ffi-$_ffi_version.tar.gz.sha512" "$_svn_dir/tvm-ffi-$_ffi_release_version/apache-tvm-ffi-src-$_ffi_release_version.tar.gz.sha512"
    cd "$_svn_dir"
    svn add "tvm-ffi-$_ffi_release_version"
    svn ci --username "$_asf_username" -m "Add TVM FFI $_ffi_release_version"
  )
}

_upload_svn $FFI_VERSION $FFI_RELEASE_VERSION $ASF_USERNAME