| #!/usr/bin/env bash |
| set -euo pipefail |
|
|
| |
| |
|
|
| |
| if [ "${1:-}" = "" ]; then |
| echo "Usage: $0 <version>" >&2 |
| exit 1 |
| fi |
|
|
| VERSION="$1" |
| TAG_NAME="transports/v${VERSION}" |
|
|
| echo "π·οΈ Finalizing bifrost-http v$VERSION release..." |
|
|
| |
| CORE_VERSION="v$(tr -d '\n\r' < core/version)" |
| FRAMEWORK_VERSION="v$(tr -d '\n\r' < framework/version)" |
|
|
| |
| declare -A PLUGIN_VERSIONS |
| PLUGINS_USED=() |
|
|
| for plugin_dir in plugins/*/; do |
| if [ -d "$plugin_dir" ]; then |
| plugin_name=$(basename "$plugin_dir") |
| PLUGIN_VERSION="v$(tr -d '\n\r' < "${plugin_dir}version")" |
| PLUGIN_VERSIONS["$plugin_name"]="$PLUGIN_VERSION" |
| fi |
| done |
|
|
| |
| while IFS= read -r plugin_line; do |
| plugin_name=$(echo "$plugin_line" | awk -F'/' '{print $NF}' | awk '{print $1}') |
| plugin_version=$(echo "$plugin_line" | awk '{print $NF}') |
|
|
| |
| if [[ -n "${PLUGIN_VERSIONS[$plugin_name]:-}" ]]; then |
| PLUGINS_USED+=("$plugin_name:${PLUGIN_VERSIONS[$plugin_name]}") |
| else |
| PLUGIN_VERSIONS["$plugin_name"]="$plugin_version" |
| PLUGINS_USED+=("$plugin_name:$plugin_version") |
| fi |
| done < <(grep "github.com/maximhq/bifrost/plugins/" transports/go.mod) |
|
|
| echo "π§ Versions:" |
| echo " Core: $CORE_VERSION" |
| echo " Framework: $FRAMEWORK_VERSION" |
| echo " Plugins:" |
| for plugin_name in "${!PLUGIN_VERSIONS[@]}"; do |
| echo " - $plugin_name: ${PLUGIN_VERSIONS[$plugin_name]}" |
| done |
|
|
| |
| CHANGELOG_BODY=$(cat transports/changelog.md) |
| |
| CHANGELOG_BODY=$(echo "$CHANGELOG_BODY" | grep -v '^<!--' | grep -v '^-->') |
| |
| if [ -z "$CHANGELOG_BODY" ]; then |
| echo "β Changelog is empty" |
| exit 1 |
| fi |
| echo "π New changelog: $CHANGELOG_BODY" |
|
|
| |
| echo "π Finding previous tag..." |
| PREV_TAG=$(git tag -l "transports/v*" | sort -V | tail -1) |
| if [[ "$PREV_TAG" == "$TAG_NAME" ]]; then |
| PREV_TAG=$(git tag -l "transports/v*" | sort -V | tail -2 | head -1) |
| fi |
| echo "π Previous tag: $PREV_TAG" |
|
|
| |
| echo "π Getting previous tag message..." |
| PREV_CHANGELOG=$(git tag -l --format='%(contents)' "$PREV_TAG") |
| echo "π Previous changelog body: $PREV_CHANGELOG" |
|
|
| |
| if [[ "$PREV_CHANGELOG" == "$CHANGELOG_BODY" ]]; then |
| echo "β Changelog is the same as the previous changelog" |
| exit 1 |
| fi |
|
|
| |
| echo "π·οΈ Creating tag: $TAG_NAME" |
| git config user.name "github-actions[bot]" |
| git config user.email "41898282+github-actions[bot]@users.noreply.github.com" |
| git tag "$TAG_NAME" -m "Release transports v$VERSION" -m "$CHANGELOG_BODY" |
| git push origin "$TAG_NAME" |
|
|
| |
| TITLE="Bifrost HTTP v$VERSION" |
|
|
| |
| PRERELEASE_FLAG="" |
| if [[ "$VERSION" == *-* ]]; then |
| PRERELEASE_FLAG="--prerelease" |
| fi |
|
|
| LATEST_FLAG="" |
| if [[ "$VERSION" != *-* ]]; then |
| LATEST_FLAG="--latest" |
| fi |
|
|
| |
| PLUGIN_UPDATES="" |
| if [ ${#PLUGINS_USED[@]} -gt 0 ]; then |
| PLUGIN_UPDATES=" |
| |
| ### π Plugin Versions |
| This release includes the following plugin versions: |
| " |
| for plugin_info in "${PLUGINS_USED[@]}"; do |
| plugin_name="${plugin_info%%:*}" |
| plugin_version="${plugin_info##*:}" |
| PLUGIN_UPDATES="$PLUGIN_UPDATES- **$plugin_name**: \`$plugin_version\` |
| " |
| done |
| else |
| |
| PLUGIN_UPDATES=" |
| |
| ### π Available Plugin Versions |
| The following plugin versions are compatible with this release: |
| " |
| for plugin_name in "${!PLUGIN_VERSIONS[@]}"; do |
| plugin_version="${PLUGIN_VERSIONS[$plugin_name]}" |
| PLUGIN_UPDATES="$PLUGIN_UPDATES- **$plugin_name**: \`$plugin_version\` |
| " |
| done |
| fi |
|
|
| BODY="## Bifrost HTTP Transport Release v$VERSION |
| |
| $CHANGELOG_BODY |
| |
| ### Installation |
| |
| #### Docker |
| \`\`\`bash |
| docker run -p 8080:8080 maximhq/bifrost:v$VERSION |
| \`\`\` |
| |
| #### Binary Download |
| \`\`\`bash |
| npx @maximhq/bifrost --transport-version v$VERSION |
| \`\`\` |
| |
| ### Docker Images |
| - **\`maximhq/bifrost:v$VERSION\`** - This specific version |
| - **\`maximhq/bifrost:latest\`** - Latest version (updated with this release) |
| |
| --- |
| _This release was automatically created with dependencies: core \`$CORE_VERSION\`, framework \`$FRAMEWORK_VERSION\`. All plugins have been validated and updated._" |
|
|
| if [ -z "${GH_TOKEN:-}" ] && [ -z "${GITHUB_TOKEN:-}" ]; then |
| echo "Error: GH_TOKEN or GITHUB_TOKEN is not set. Please export one to authenticate the GitHub CLI." |
| exit 1 |
| fi |
|
|
| echo "π Creating GitHub release for $TITLE..." |
| gh release create "$TAG_NAME" \ |
| --title "$TITLE" \ |
| --notes "$BODY" \ |
| ${PRERELEASE_FLAG} ${LATEST_FLAG} |
|
|
| echo "β
Bifrost HTTP released successfully" |
|
|
| |
| if [[ "$VERSION" != *-* ]]; then |
| if [ -n "${R2_ENDPOINT:-}" ] && [ -n "${R2_BUCKET:-}" ]; then |
| echo "π€ Copying versioned binaries to latest/ on R2..." |
| R2_ENDPOINT="$(echo "$R2_ENDPOINT" | tr -d '[:space:]')" |
| aws s3 sync "s3://$R2_BUCKET/bifrost/v$VERSION/" "s3://$R2_BUCKET/bifrost/latest/" \ |
| --endpoint-url "$R2_ENDPOINT" \ |
| --profile "${R2_AWS_PROFILE:-R2}" \ |
| --no-progress \ |
| --delete |
| echo "β
Latest binaries updated on R2" |
| fi |
| fi |
|
|
| |
| echo "" |
| echo "π Release Summary:" |
| echo " π·οΈ Tag: $TAG_NAME" |
| echo " π§ Core version: $CORE_VERSION" |
| echo " π§ Framework version: $FRAMEWORK_VERSION" |
| echo " π¦ Transport: Updated" |
| if [ ${#PLUGINS_USED[@]} -gt 0 ]; then |
| echo " π Plugins used: ${PLUGINS_USED[*]}" |
| else |
| echo " π Available plugins: $(printf "%s " "${!PLUGIN_VERSIONS[@]}")" |
| fi |
| echo " π GitHub release: Created" |
|
|
| echo "success=true" >> "$GITHUB_OUTPUT" |
|
|