Skip to content

Commit

Permalink
feat: Automate Release (#402)
Browse files Browse the repository at this point in the history
* feat: Store project version in `version.txt`

* fix: Add `CMakeFiles` to `.gitignore`

* feat: Automate Release

* fix: Remove enforce-linking-issues workflow

* fix: Remove unecessary SSH passphrase/privatekey inputs

* fix: Force push release branch

* fix: Make build-macos need pre-build

* fix: Typo in pre-build.bash path

* fix: Typo in examples build path
  • Loading branch information
fuzzypixelz committed Apr 17, 2024
1 parent c5008cb commit 6528094
Show file tree
Hide file tree
Showing 13 changed files with 281 additions and 169 deletions.
10 changes: 0 additions & 10 deletions .github/workflows/enforce-linking-issues.yml

This file was deleted.

280 changes: 126 additions & 154 deletions .github/workflows/release.yml
Expand Up @@ -14,188 +14,160 @@
name: Release

on:
release:
types: [published]
schedule:
- cron: "0 0 * * 1-5"
workflow_dispatch:

inputs:
live-run:
type: boolean
description: Live-run
required: false
version:
type: string
description: Release number
required: false
jobs:
preps:
name: Preparation
tag:
name: Branch, Bump & tag
runs-on: ubuntu-latest
outputs:
version: ${{ steps.create-release-branch.outputs.version }}
branch: ${{ steps.create-release-branch.outputs.branch }}
steps:
- name: Clone this repository
- id: create-release-branch
uses: eclipse-zenoh/ci/create-release-branch@main
with:
repo: ${{ github.repository }}
live-run: ${{ inputs.live-run || false }}
# NOTE(fuzzypixelz): When the version is undefined (e.g. on schedule
# events) we cannot use git-describe as CMake doesn't support it.
# However, we still need some placeholder version to test that the
# version can be reliably bumped.
version: ${{ inputs.version || '0.0.0' }}
github-token: ${{ secrets.BOT_TOKEN_WORKFLOW }}

- name: Checkout this repository
uses: actions/checkout@v4
with:
ref: ${{ steps.create-release-branch.outputs.branch }}

- name: Bump and tag project
run: bash ci/scripts/bump-and-tag.bash
env:
VERSION: ${{ steps.create-release-branch.outputs.version }}
GIT_USER_NAME: eclipse-zenoh-bot
GIT_USER_EMAIL: eclipse-zenoh-bot@users.noreply.github.com

- name: Environment setup
id: env
shell: bash
run: |
echo "GITHUB_REF=${GITHUB_REF}"
echo "GITHUB_SHA=${GITHUB_SHA:0:8}"
GIT_BRANCH=`[[ $GITHUB_REF =~ ^refs/heads/.* ]] && echo ${GITHUB_REF/refs\/heads\//} || true`
echo "GIT_BRANCH=${GIT_BRANCH}"
echo "GIT_BRANCH=${GIT_BRANCH}" >> $GITHUB_OUTPUT
GIT_TAG=`[[ $GITHUB_REF =~ ^refs/tags/.* ]] && echo ${GITHUB_REF/refs\/tags\//} || true`
echo "GIT_TAG=${GIT_TAG}"
echo "GIT_TAG=${GIT_TAG}" >> $GITHUB_OUTPUT
ZENOH_VERSION=$(sed -n 's/^project(libzenohpico VERSION \(.*\) LANGUAGES C)/\1/p' CMakeLists.txt | head -n1)
echo "ZENOH_VERSION=${ZENOH_VERSION}"
echo "ZENOH_VERSION=${ZENOH_VERSION}" >> $GITHUB_OUTPUT
if [ -n "${GIT_TAG}" ]; then
IS_RELEASE="true"
echo "IS_RELEASE=${IS_RELEASE}"
echo "IS_RELEASE=${IS_RELEASE}" >> $GITHUB_OUTPUT
PKG_VERSION=${GIT_TAG}
elif [ -n "${GIT_BRANCH}" ]; then
PKG_VERSION=${GIT_BRANCH}-${GITHUB_SHA:0:8}
else
PKG_VERSION=${ZENOH_VERSION}-${GITHUB_SHA:0:8}
fi
echo "PKG_VERSION=${PKG_VERSION}"
echo "PKG_VERSION=${PKG_VERSION}" >> $GITHUB_OUTPUT
CROSSBUILD_TARGETS=$(sed -n 's/^CROSSBUILD_TARGETS=\(.*\)/\1/p' GNUmakefile | head -n1)
echo "CROSSBUILD_TARGETS=$CROSSBUILD_TARGETS"
TARGET_MATRIX="{\"target\": [\"${CROSSBUILD_TARGETS// /\",\"}\"]}"
echo "TARGET_MATRIX=$TARGET_MATRIX"
echo "TARGET_MATRIX=$TARGET_MATRIX" >> $GITHUB_OUTPUT
pre-build:
name: Pre-Build
needs: tag
runs-on: ubuntu-latest
outputs:
GIT_BRANCH: ${{ steps.env.outputs.GIT_BRANCH }}
GIT_TAG: ${{ steps.env.outputs.GIT_TAG }}
IS_RELEASE: ${{ steps.env.outputs.IS_RELEASE }}
ZENOH_VERSION: ${{ steps.env.outputs.ZENOH_VERSION }}
PKG_VERSION: ${{ steps.env.outputs.PKG_VERSION }}
TARGET_MATRIX: ${{ steps.env.outputs.TARGET_MATRIX }}

macos-build:
name: Build on macos-x64
needs: preps
build-linux-matrix: ${{ steps.pre-build.outputs.build-linux-matrix }}
steps:
- name: Clone this repository
uses: actions/checkout@v4
with:
ref: ${{ needs.tag.outputs.branch }}

- id: pre-build
run: bash ci/scripts/pre-build.bash

build-macos:
name: Build for macOS (x64)
needs: [tag, pre-build]
runs-on: macos-latest
steps:
- name: Clone this repository
uses: actions/checkout@v4
with:
ref: ${{ needs.tag.outputs.branch }}

- name: MacOS build
run: make
- id: build-macos
run: bash ci/scripts/build-macos.bash
env:
BUILD_TYPE: RELEASE

- name: Packaging
id: package
shell: bash
run: |
LIB_PKG_NAME=${PWD}/zenoh-pico-${{ needs.preps.outputs.PKG_VERSION }}-macos-x64.zip
echo "Packaging ${LIB_PKG_NAME}:"
cd build && zip -r ${LIB_PKG_NAME} lib && cd -
zip -r ${LIB_PKG_NAME} include
echo "LIB_PKG_NAME=${LIB_PKG_NAME}" >> $GITHUB_OUTPUT
EXP_PKG_NAME=${PWD}/zenoh-pico-${{ needs.preps.outputs.PKG_VERSION }}-macos-x64-examples.zip
echo "Packaging ${EXP_PKG_NAME}:"
cd build/examples && zip ${EXP_PKG_NAME} * && cd -
echo "EXP_PKG_NAME=${EXP_PKG_NAME}" >> $GITHUB_OUTPUT
- name: "Upload x86_64 macos package"
uses: actions/upload-artifact@v3
REPO: ${{ github.repository }}
VERSION: ${{ needs.tag.outputs.version }}

- name: Upload macOS library archive
uses: actions/upload-artifact@v4
with:
name: macos-x64
path: |
${{ steps.package.outputs.LIB_PKG_NAME }}
${{ steps.package.outputs.EXP_PKG_NAME }}
name: ${{ steps.build-macos.outputs.archive-lib }}
path: ${{ steps.build-macos.outputs.archive-lib }}

linux-builds:
- name: Upload macOS examples archive
uses: actions/upload-artifact@v4
with:
name: ${{ steps.build-macos.outputs.archive-examples }}
path: ${{ steps.build-macos.outputs.archive-examples }}

build-linux:
name: Crossbuild for ${{ matrix.target }}
needs: preps
needs: [tag, pre-build]
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix: ${{fromJson(needs.preps.outputs.TARGET_MATRIX)}}
matrix: ${{ fromJson(needs.pre-build.outputs.build-linux-matrix) }}
steps:
- name: Clone this repository
uses: actions/checkout@v4
with:
ref: ${{ needs.tag.outputs.branch }}

- name: make for ${{ matrix.target }}
- id: build-linux
run: bash ci/scripts/build-linux.bash
env:
BUILD_TYPE: RELEASE
run: make ${{ matrix.target }}

- name: Packaging
id: package
shell: bash
run: |
TARGET=${{ matrix.target }}
LIB_PKG_NAME=${PWD}/zenoh-pico-${{ needs.preps.outputs.PKG_VERSION }}-${TARGET}.zip
DEB_PKG_NAME=${PWD}/zenoh-pico-${{ needs.preps.outputs.PKG_VERSION }}-${TARGET}-deb-pkgs.zip
RPM_PKG_NAME=${PWD}/zenoh-pico-${{ needs.preps.outputs.PKG_VERSION }}-${TARGET}-rpm-pkgs.zip
EXP_PKG_NAME=${PWD}/zenoh-pico-${{ needs.preps.outputs.PKG_VERSION }}-${TARGET}-examples.zip
echo "Packaging ${LIB_PKG_NAME}:"
cd crossbuilds/${TARGET} && zip -r ${LIB_PKG_NAME} lib && cd -
zip -r ${LIB_PKG_NAME} include
echo "LIB_PKG_NAME=${LIB_PKG_NAME}" >> $GITHUB_OUTPUT
cd crossbuilds/${TARGET}/packages
echo "Packaging ${DEB_PKG_NAME}:"
zip ${DEB_PKG_NAME} *.deb
echo "DEB_PKG_NAME=${DEB_PKG_NAME}" >> $GITHUB_OUTPUT
echo "Packaging ${RPM_PKG_NAME}:"
zip ${RPM_PKG_NAME} *.rpm
echo "RPM_PKG_NAME=${RPM_PKG_NAME}" >> $GITHUB_OUTPUT
cd -
echo "Packaging ${EXP_PKG_NAME}:"
cd crossbuilds/${TARGET}/examples && zip ${EXP_PKG_NAME} * && cd -
echo "EXP_PKG_NAME=${EXP_PKG_NAME}" >> $GITHUB_OUTPUT
- name: "Upload packages"
uses: actions/upload-artifact@v3
REPO: ${{ github.repository }}
VERSION: ${{ needs.tag.outputs.version }}
TARGET: ${{ matrix.target }}

- name: Upload Linux library archive for ${{ matrix.target }}
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.target }}
path: |
${{ steps.package.outputs.LIB_PKG_NAME }}
${{ steps.package.outputs.DEB_PKG_NAME }}
${{ steps.package.outputs.RPM_PKG_NAME }}
${{ steps.package.outputs.EXP_PKG_NAME }}
publication:
name: Publish the release
if: needs.preps.outputs.IS_RELEASE == 'true'
needs: [preps, macos-build, linux-builds]
runs-on: ubuntu-latest
steps:
- name: Download result of previous builds
uses: actions/download-artifact@v3
name: ${{ steps.build-linux.outputs.archive-lib }}
path: ${{ steps.build-linux.outputs.archive-lib }}

- name: Upload Linux examples archive for ${{ matrix.target }}
uses: actions/upload-artifact@v4
with:
path: ARTIFACTS
name: ${{ steps.build-linux.outputs.archive-examples }}
path: ${{ steps.build-linux.outputs.archive-examples }}

- name: Publish as github release
uses: softprops/action-gh-release@v1
- name: Upload Linux RPM archive for ${{ matrix.target }}
uses: actions/upload-artifact@v4
with:
files: ARTIFACTS/*/*.*
name: ${{ steps.build-linux.outputs.archive-rpm }}
path: ${{ steps.build-linux.outputs.archive-rpm }}

- name: Publish to download.eclipse.org/zenoh
env:
SSH_TARGET: genie.zenoh@projects-storage.eclipse.org
ECLIPSE_BASE_DIR: /home/data/httpd/download.eclipse.org/zenoh/zenoh-pico
shell: bash
run: |
echo "--- setup ssh-agent"
eval "$(ssh-agent -s)"
echo 'echo "${{ secrets.SSH_PASSPHRASE }}"' > ~/.ssh_askpass && chmod +x ~/.ssh_askpass
echo "${{ secrets.SSH_PRIVATE_KEY }}" | tr -d '\r' | DISPLAY=NONE SSH_ASKPASS=~/.ssh_askpass ssh-add - > /dev/null 2>&1
rm -f ~/.ssh_askpass
echo "--- test ssh:"
ssh -o "StrictHostKeyChecking=no" ${SSH_TARGET} ls -al
echo "---- list artifacts to upload:"
ls -R ARTIFACTS || true
DOWNLOAD_DIR=${ECLIPSE_BASE_DIR}/${{ needs.preps.outputs.PKG_VERSION }}
echo "---- copy artifacts into ${DOWNLOAD_DIR}"
ssh -o "StrictHostKeyChecking=no" ${SSH_TARGET} mkdir -p ${DOWNLOAD_DIR}
cd ARTIFACTS
sha256sum */* > sha256sums.txt
scp -o "StrictHostKeyChecking=no" -r * ${SSH_TARGET}:${DOWNLOAD_DIR}/
echo "---- cleanup identity"
ssh-add -D
- name: Upload Linux DEB archive for ${{ matrix.target }}
uses: actions/upload-artifact@v4
with:
name: ${{ steps.build-linux.outputs.archive-deb }}
path: ${{ steps.build-linux.outputs.archive-deb }}

eclipse:
needs: [tag, build-macos, build-linux]
runs-on: ubuntu-latest
steps:
- uses: eclipse-zenoh/ci/publish-crates-eclipse@main
with:
live-run: ${{ inputs.live-run || false }}
version: ${{ needs.tag.outputs.version }}
ssh-host: genie.zenoh@projects-storage.eclipse.org
ssh-host-path: /home/data/httpd/download.eclipse.org/zenoh/zenoh-pico
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
ssh-passphrase: ${{ secrets.SSH_PASSPHRASE }}
archive-patterns: '.*\.zip'

github:
needs: [tag, build-macos, build-linux]
runs-on: ubuntu-latest
steps:
- uses: eclipse-zenoh/ci/publish-crates-github@main
with:
repo: ${{ github.repository }}
live-run: ${{ inputs.live-run || false }}
version: ${{ needs.tag.outputs.version }}
branch: ${{ needs.tag.outputs.branch }}
github-token: ${{ secrets.BOT_TOKEN_WORKFLOW }}
archive-patterns: '.*\.zip'
1 change: 1 addition & 0 deletions .gitignore
@@ -1,6 +1,7 @@
# CMake
build
crossbuilds
CMakeFiles

# vscode
.vscode
Expand Down
18 changes: 16 additions & 2 deletions CMakeLists.txt
Expand Up @@ -13,7 +13,21 @@
#
cmake_minimum_required(VERSION 3.13)

project(zenohpico VERSION 0.11.0.0 LANGUAGES C)
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/version.txt version)

project(zenohpico VERSION ${version} LANGUAGES C)

# Configure header file to define the project version
set(ZENOH_PICO ${PROJECT_VERSION})
set(ZENOH_PICO_MAJOR ${PROJECT_VERSION_MAJOR})
set(ZENOH_PICO_MINOR ${PROJECT_VERSION_MINOR})
set(ZENOH_PICO_PATCH ${PROJECT_VERSION_PATCH})
set(ZENOH_PICO_TWEAK ${PROJECT_VERSION_TWEAK})
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/include/zenoh-pico.h.in
${CMAKE_CURRENT_SOURCE_DIR}/include/zenoh-pico.h
@ONLY
)

include(CMakePackageConfigHelpers)
include(GNUInstallDirs)
Expand Down Expand Up @@ -473,4 +487,4 @@ if(PACKAGING)
include(CPack)
endif()

endif()
endif()

0 comments on commit 6528094

Please sign in to comment.