Skip to content

Build Kallichore Release #176

Build Kallichore Release

Build Kallichore Release #176

Workflow file for this run

name: "Build Kallichore Release"
on:
push:
branches:
- main
workflow_dispatch:
jobs:
# Run tests on all platforms
test:
name: Run Tests
runs-on: ${{ matrix.os }}
timeout-minutes: 30
strategy:
fail-fast: true
matrix:
include:
- os: ubuntu-latest
platform: linux
- os: windows-latest
platform: windows
- os: [self-hosted-staging, macos, arm64]
platform: macos
steps:
- name: Checkout sources
uses: actions/checkout@v4
# Set up Python. We only do this on Github hosted runners since it
# won't work on our self hosted macOS runner.
- name: Set up Python
uses: actions/setup-python@v5
if: matrix.platform == 'linux' || matrix.platform == 'windows'
with:
python-version: '3.11'
- name: Install Python dependencies
run: |
python -m pip install --upgrade pip
pip install ipykernel
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Install dependencies (Linux)
if: matrix.platform == 'linux'
run: |
sudo apt-get update
sudo apt-get install -y pkg-config libsodium-dev libzmq3-dev
- name: Install dependencies (Windows)
if: matrix.platform == 'windows'
run: |
vcpkg install zeromq:x64-windows
shell: cmd
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- name: Run tests
run: cargo test --verbose --all
env:
RUST_BACKTRACE: 1
# Extract the current version of Kallichore from its Cargo.toml file.
get_version:
name: Determine Kallichore Version
runs-on: ubuntu-latest
outputs:
KALLICHORE_VERSION: ${{ steps.extract_version.outputs.result }}
steps:
# Checkout sources
- name: Checkout sources
uses: actions/checkout@v4
# Extract version
- name: Determine Version
id: extract_version
run: |
VERSION=$(cat crates/kcserver/Cargo.toml | grep '^version' | head -1 | sed -e "s/[^.0-9]//g")
echo "Kallichore version: ${VERSION}"
echo "Found version ${VERSION}" >> "$GITHUB_STEP_SUMMARY"
echo "result=${VERSION}" >> "$GITHUB_OUTPUT"
# Check to see whether we have already released this version. If we have, we will skip the
# release process later on.
check_release:
name: Check for Existing Release
runs-on: ubuntu-latest
needs: [get_version]
outputs:
EXISTING_RELEASE: ${{ steps.release_flag.outputs.result }}
steps:
- name: Check for existing release tag
uses: mukunku/tag-exists-action@v1.3.0
id: check_tag
with:
tag: ${{ needs.get_version.outputs.KALLICHORE_VERSION }}
- name: Set release flag
id: release_flag
run: |
echo "Existing ${{ needs.get_version.outputs.KALLICHORE_VERSION }} release: ${{steps.check_tag.outputs.exists}}"
echo "result=${{steps.check_tag.outputs.exists}}" >> $GITHUB_OUTPUT
do_release:
name: Trigger a new release
if: ${{ needs.check_release.outputs.EXISTING_RELEASE == 'false' && github.ref == 'refs/heads/main' }}
runs-on: ubuntu-latest
needs: [check_release]
steps:
- name: Dummy step
run: echo ""
# Build Kallichore for macOS. Both arm64 (Apple Silicon) and x64 (Intel) hosts.
build_macos:
name: Build macOS
runs-on: [self-hosted-staging, macos, arm64]
needs: [get_version]
timeout-minutes: 40
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DEBUG_FLAG: ${{ matrix.flavor == 'debug' && '-debug' || '' }}
strategy:
max-parallel: 1
matrix:
arch: [arm64, x64]
flavor: [debug, release]
include:
- arch: arm64
arch_terminal: arm64
homebrew_folder: /opt/homebrew
rust_target_prefix: aarch64
- arch: x64
arch_terminal: x86_64
homebrew_folder: /usr/local
rust_target_prefix: x86_64
steps:
- name: Install Rust toolchain
run: |
rustup update --no-self-update stable
rustup default stable
# Checkout sources
- name: Checkout sources
uses: actions/checkout@v4
# These are already installed for both architectures, but would be required if we switch off
# a self-hosted runner, so we may as well leave them in
- name: Install zeromq dependencies
id: install_zeromq_dependencies
run: |
arch -${{matrix.arch_terminal}} /bin/bash -c "${{matrix.homebrew_folder}}/bin/brew install pkg-config"
arch -${{matrix.arch_terminal}} /bin/bash -c "${{matrix.homebrew_folder}}/bin/brew install libsodium"
# Zeromq calls whatever pkg-config version is findable on the PATH to be able to locate
# libsodium, so we have to ensure the x86_64 version is first on the PATH when compiling for
# that architecture, so that it finds the x86_64 version of libsodium for zeromq to link against.
- name: Update PATH to pkg-config for zeromq
id: update_path_for_zeromq
if: matrix.arch == 'x64'
run: |
echo "${{matrix.homebrew_folder}}/bin" >> $GITHUB_PATH
# Compile
- name: Compile Kallichore (${{ matrix.arch }})
env:
npm_config_arch: ${{ matrix.arch }}
KALLICHORE_BUILD_TYPE: ${{ matrix.flavor }}
RUST_TARGET: ${{ matrix.rust_target_prefix }}-apple-darwin
CARGO_FLAGS:
PKG_CONFIG_ALLOW_CROSS: 1
run: |
cargo clean
cargo build ${{ matrix.flavor == 'release' && '--release' || '' }} --target ${{ matrix.rust_target_prefix }}-apple-darwin
# Compress server to a zip file
- name: Create archive
run: |
# Enter the build directory
pushd target/${{ matrix.rust_target_prefix }}-apple-darwin/${{ matrix.flavor }}
# Compress the server to an archive
ARCHIVE="$GITHUB_WORKSPACE/kallichore-${{ needs.get_version.outputs.KALLICHORE_VERSION }}${{ env.DEBUG_FLAG }}-darwin-${{ matrix.arch }}.zip"
zip -Xry $ARCHIVE kcserver
popd
# Create build artifact
- name: Upload client archive
uses: actions/upload-artifact@v4
with:
name: kallichore-${{ matrix.flavor }}-darwin-${{ matrix.arch }}-archive
path: kallichore-${{ needs.get_version.outputs.KALLICHORE_VERSION }}${{ env.DEBUG_FLAG }}-darwin-${{ matrix.arch }}.zip
build_windows:
name: Build Windows
runs-on: windows-latest
timeout-minutes: 40
needs: [get_version]
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
strategy:
matrix:
arch: [x64]
flavor: [debug, release]
include:
- arch: x64
rust_target_prefix: x86_64
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Compile Kallichore
env:
Kallichore_BUILD_TYPE: ${{ matrix.flavor }}
RUST_TARGET: ${{ matrix.rust_target_prefix }}-pc-windows-msvc
shell: cmd
run: |
cargo clean
cargo build ${{ matrix.flavor == 'release' && '--release' || '' }} --target ${{ matrix.rust_target_prefix }}-pc-windows-msvc
- name: Create archive
shell: pwsh
run: |
# Compress the server to an archive
$params = @{
Path = "target\${{ matrix.rust_target_prefix }}-pc-windows-msvc\${{ matrix.flavor }}\kcserver.exe", "LICENSE"
DestinationPath = "kallichore-${{ needs.get_version.outputs.KALLICHORE_VERSION }}-${{ matrix.flavor }}-windows-${{ matrix.arch }}.zip"
}
Compress-Archive @params
- name: Upload client archive
uses: actions/upload-artifact@v4
with:
name: kallichore-${{ matrix.flavor }}-windows-${{ matrix.arch }}-archive
path: kallichore-${{ needs.get_version.outputs.KALLICHORE_VERSION }}-${{ matrix.flavor }}-windows-${{ matrix.arch }}.zip
build_linux:
name: "Build Linux"
uses: ./.github/workflows/release-linux.yml
needs: [get_version]
secrets: inherit
with:
version: ${{ needs.get_version.outputs.KALLICHORE_VERSION }}
create_release:
name: Create Release
runs-on: [self-hosted, macos, arm64]
needs: [do_release, get_version, build_macos, build_windows, build_linux]
env:
GITHUB_TOKEN: ${{ github.token }}
outputs:
upload_url: ${{ steps.create_release.outputs.upload_url }}
steps:
- name: Create release
uses: actions/create-release@v1
id: create_release
with:
draft: false
prerelease: true
release_name: ${{ needs.get_version.outputs.KALLICHORE_VERSION }}
tag_name: ${{ needs.get_version.outputs.KALLICHORE_VERSION }}
# Uploads binaries, if we created a release
upload_release_binaries:
name: Upload Release Binaries
runs-on: [self-hosted, macos, arm64]
needs: [create_release, get_version]
permissions:
contents: write # Required for creating a tag and release
env:
GITHUB_TOKEN: ${{ github.token }}
DEBUG_FLAG: ${{ matrix.flavor == 'debug' && '-debug' || '' }}
RELEASE_TAG: ${{ needs.get_version.outputs.KALLICHORE_VERSION }}
strategy:
max-parallel: 1
matrix:
flavor: [debug, release]
steps:
# Download all binaries
- name: Download Kallichore for macOS arm64 server (${{ matrix.flavor }})
uses: actions/download-artifact@v4
with:
name: kallichore-${{ matrix.flavor }}-darwin-arm64-archive
- name: Download Kallichore for macOS x64 (${{ matrix.flavor}})
uses: actions/download-artifact@v4
with:
name: kallichore-${{ matrix.flavor }}-darwin-x64-archive
- name: Download Kallichore for Windows x64 (${{ matrix.flavor}})
uses: actions/download-artifact@v4
with:
name: kallichore-${{ matrix.flavor }}-windows-x64-archive
- name: Download Kallichore for Linux x64 (${{ matrix.flavor}})
uses: actions/download-artifact@v4
with:
name: kallichore-${{ matrix.flavor }}-linux-x64-archive
- name: Download Kallichore for Linux arm64 (${{ matrix.flavor}})
uses: actions/download-artifact@v4
with:
name: kallichore-${{ matrix.flavor }}-linux-arm64-archive
# Combine macOS binaries to a single binary with lipo
- name: Create macOS universal binary
run: |
# Decompress x64 builds
rm -rf x64 && mkdir x64 && pushd x64
unzip ../kallichore-${{ env.RELEASE_TAG }}${{ env.DEBUG_FLAG }}-darwin-x64.zip
popd
# Decompress arm64 build
rm -rf arm64 && mkdir arm64 && pushd arm64
unzip ../kallichore-${{ env.RELEASE_TAG }}${{ env.DEBUG_FLAG }}-darwin-arm64.zip
popd
# Create a universal binary
lipo -create x64/kcserver arm64/kcserver -output kcserver
# Compress and bundle licenses
ARCHIVE="$GITHUB_WORKSPACE/kallichore-${{ env.RELEASE_TAG }}${{ env.DEBUG_FLAG }}-darwin-universal.zip"
zip -Xry $ARCHIVE kcserver
- name: Upload macOS release artifact (universal)
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ needs.create_release.outputs.upload_url }}
asset_path: kallichore-${{ env.RELEASE_TAG }}${{ env.DEBUG_FLAG }}-darwin-universal.zip
asset_name: kallichore-${{ needs.get_version.outputs.KALLICHORE_VERSION }}${{ env.DEBUG_FLAG }}-darwin-universal.zip
asset_content_type: application/octet-stream
- name: Upload macOS release artifact (arm64/Apple Silicon)
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ needs.create_release.outputs.upload_url }}
asset_path: kallichore-${{ env.RELEASE_TAG }}${{ env.DEBUG_FLAG }}-darwin-arm64.zip
asset_name: kallichore-${{ needs.get_version.outputs.KALLICHORE_VERSION }}${{ env.DEBUG_FLAG }}-darwin-arm64.zip
asset_content_type: application/octet-stream
- name: Upload macOS release artifact (x64/Intel)
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ needs.create_release.outputs.upload_url }}
asset_path: kallichore-${{ env.RELEASE_TAG }}${{ env.DEBUG_FLAG }}-darwin-x64.zip
asset_name: kallichore-${{ needs.get_version.outputs.KALLICHORE_VERSION }}${{ env.DEBUG_FLAG }}-darwin-x64.zip
asset_content_type: application/octet-stream
- name: Upload Windows release artifact (x64)
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ needs.create_release.outputs.upload_url }}
asset_path: kallichore-${{ env.RELEASE_TAG }}-${{ matrix.flavor }}-windows-x64.zip
asset_name: kallichore-${{ env.RELEASE_TAG }}${{ env.DEBUG_FLAG }}-windows-x64.zip
asset_content_type: application/octet-stream
- name: Upload Linux release artifacts (x64)
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ needs.create_release.outputs.upload_url }}
asset_path: kallichore-${{ env.RELEASE_TAG }}-${{ matrix.flavor }}-linux-x64.zip
asset_name: kallichore-${{ env.RELEASE_TAG }}${{ env.DEBUG_FLAG }}-linux-x64.zip
asset_content_type: application/octet-stream
- name: Upload Linux release artifacts (arm64)
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ needs.create_release.outputs.upload_url }}
asset_path: kallichore-${{ env.RELEASE_TAG }}-${{ matrix.flavor }}-linux-arm64.zip
asset_name: kallichore-${{ env.RELEASE_TAG }}${{ env.DEBUG_FLAG }}-linux-arm64.zip
asset_content_type: application/octet-stream
# Publish new releases to the kallichore-builds public repository
publish_public_release:
name: Publish Public Release
runs-on: ubuntu-latest
needs: [upload_release_binaries, get_version]
permissions:
contents: write # Required for creating a tag and release
env:
RELEASE_TAG: ${{ needs.get_version.outputs.KALLICHORE_VERSION }}
steps:
- name: Download macOS release (universal)
uses: dsaltares/fetch-gh-release-asset@1.1.2
with:
version: tags/${{ env.RELEASE_TAG }}
file: kallichore-${{ env.RELEASE_TAG }}-darwin-universal.zip
token: ${{ secrets.GITHUB_TOKEN }}
- name: Download macOS release (arm64/Apple Silicon)
uses: dsaltares/fetch-gh-release-asset@1.1.2
with:
version: tags/${{ env.RELEASE_TAG }}
file: kallichore-${{ env.RELEASE_TAG }}-darwin-arm64.zip
token: ${{ secrets.GITHUB_TOKEN }}
- name: Download macOS release (x64/Intel)
uses: dsaltares/fetch-gh-release-asset@1.1.2
with:
version: tags/${{ env.RELEASE_TAG }}
file: kallichore-${{ env.RELEASE_TAG }}-darwin-x64.zip
token: ${{ secrets.GITHUB_TOKEN }}
- name: Download Linux release (x64)
uses: dsaltares/fetch-gh-release-asset@1.1.2
with:
version: tags/${{ env.RELEASE_TAG }}
file: kallichore-${{ env.RELEASE_TAG }}-linux-x64.zip
token: ${{ secrets.GITHUB_TOKEN }}
- name: Download Linux release (arm64)
uses: dsaltares/fetch-gh-release-asset@1.1.2
with:
version: tags/${{ env.RELEASE_TAG }}
file: kallichore-${{ env.RELEASE_TAG }}-linux-arm64.zip
token: ${{ secrets.GITHUB_TOKEN }}
- name: Download Windows release
uses: dsaltares/fetch-gh-release-asset@1.1.2
with:
version: tags/${{ env.RELEASE_TAG }}
file: kallichore-${{ env.RELEASE_TAG }}-windows-x64.zip
token: ${{ secrets.GITHUB_TOKEN }}
- name: Create access token
uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ vars.POSITRON_BOT_APP_ID }}
private-key: ${{ secrets.POSITRON_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
repositories: |
kallichore
kallichore-builds
- name: Create public release
uses: softprops/action-gh-release@v2
with:
token: ${{ steps.app-token.outputs.token }}
repository: posit-dev/kallichore-builds
tag_name: ${{ env.RELEASE_TAG }}
prerelease: true
fail_on_unmatched_files: true
generate_release_notes: false
body: |
Kallichore ${{env.RELEASE_TAG }}
files: |
kallichore-${{ env.RELEASE_TAG }}-darwin-universal.zip
kallichore-${{ env.RELEASE_TAG }}-darwin-arm64.zip
kallichore-${{ env.RELEASE_TAG }}-darwin-x64.zip
kallichore-${{ env.RELEASE_TAG }}-windows-x64.zip
kallichore-${{ env.RELEASE_TAG }}-linux-x64.zip
kallichore-${{ env.RELEASE_TAG }}-linux-arm64.zip
status:
if: ${{ failure() }}
runs-on: self-hosted
needs: [build_macos, build_windows, get_version]
steps:
- name: Notify slack if build fails
uses: slackapi/slack-github-action@v1.24.0
id: slack-failure
with:
payload: |
{
"message": "Kallichore build ${{ needs.get_version.outputs.KALLICHORE_VERSION }} failed",
"status": "Failure",
"run_url": "https://github.com/posit-dev/positron/actions/runs/${{ github.run_id }}"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}