name: Publish
on:
pull_request:
branches:
- main
types: [closed]
workflow_dispatch:
inputs:
tag:
description: "the version to publish, such as 3.0.0"
required: true
type: string
permissions:
contents: read
jobs:
setup:
runs-on: ubuntu-latest
permissions:
contents: write if: github.event_name == 'workflow_dispatch' || (startsWith(github.head_ref, 'release/v') && github.event.pull_request.merged == true)
outputs:
appname: sibling
tag: ${{ steps.vars.outputs.tag }}
upload_url: ${{ steps.create_release.outputs.upload_url }}
steps:
- name: Git Tag Name
id: vars
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "tag=${{ inputs.tag }}" >> $GITHUB_OUTPUT
else
echo "tag=${GITHUB_HEAD_REF##*/v}" >> $GITHUB_OUTPUT
fi
- name: Create release
id: create_release
uses: marvinpinto/action-automatic-releases@latest
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
automatic_release_tag: v${{ steps.vars.outputs.tag }}
title: Release v${{ steps.vars.outputs.tag }}
draft: false
prerelease: false
documents:
runs-on: ubuntu-latest
needs: setup
permissions:
contents: write outputs:
appname: ${{ needs.setup.outputs.appname }}
tag: ${{ needs.setup.outputs.tag }}
upload_url: ${{ needs.setup.outputs.upload_url }}
steps:
- name: Setup Hugo
uses: peaceiris/actions-hugo@v3
with:
hugo-version: '0.154.5'
extended: true
- name: Checkout
uses: actions/checkout@v4
with:
ref: main
fetch-depth: 0
- name: Build Site
run: |
git worktree add docs/public gh-pages
(cd docs ; hugo)
- name: Deploy
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./docs/public
publish:
runs-on: ${{ matrix.os }}
needs: documents
permissions:
contents: write outputs:
appname: ${{ needs.documents.outputs.appname }}
tag: ${{ needs.documents.outputs.tag }}
strategy:
matrix:
include:
- os: ubuntu-latest
target: aarch64-unknown-linux-musl
artifact_name: ${{ needs.documents.outputs.appname }}
asset_name: ${{ needs.documents.outputs.appname }}-${{ needs.documents.outputs.tag }}_linux_arm64
ext: ''
- os: ubuntu-latest
target: x86_64-unknown-linux-musl
artifact_name: ${{ needs.documents.outputs.appname }}
asset_name: ${{ needs.documents.outputs.appname }}-${{ needs.documents.outputs.tag }}_linux_amd64
ext: ''
- os: macos-latest
target: aarch64-apple-darwin
artifact_name: ${{ needs.documents.outputs.appname }}
asset_name: ${{ needs.documents.outputs.appname }}-${{ needs.documents.outputs.tag }}_darwin_arm64
ext: ''
- os: macos-latest
target: x86_64-apple-darwin
artifact_name: ${{ needs.documents.outputs.appname }}
asset_name: ${{ needs.documents.outputs.appname }}-${{ needs.documents.outputs.tag }}_darwin_amd64
ext: ''
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: main
fetch-depth: 0
- name: Setup variables
id: vars
shell: bash
run: |
DIR=$(echo "${{ needs.documents.outputs.appname }}-${{ needs.documents.outputs.tag }}")
echo "dir=$DIR" >> $GITHUB_OUTPUT
- name: Setup Rust
run: rustup update stable
- name: Setup Rust (1/2) (toolchain)
uses: taiki-e/setup-cross-toolchain-action@v1
if: matrix.os == 'ubuntu-latest'
with:
target: ${{ matrix.target }}
- name: Cross build (macOS)
if: matrix.os == 'macos-latest'
run: |
rustup target add ${{ matrix.target }}
cargo build --release --target ${{ matrix.target }}
- name: Cross build (Linux and Windows)
run: |
cargo build --release --target ${{ matrix.target }}
- name: Generate completion files
run: cargo run -- --generate-completion-files --completion-out-dir assets/completions
- name: Create release file
shell: bash
run: |
DIR=${{ steps.vars.outputs.dir }}
DIST=${{ matrix.target }}
mkdir -p dist/$DIST/$DIR
# cp -r site/public dist/$DIST/$DIR/docs
cp -r README.md LICENSE assets/completions dist/$DIST/$DIR
cp target/${{ matrix.target }}/release/${{ matrix.artifact_name }} dist/$DIST/$DIR/sibling${{ matrix.ext}}
tar cvfz dist/${{ matrix.asset_name }}.tar.gz -C dist/$DIST $DIR
- name: Upload release assets
id: upload-release-assets
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
asset_path: dist/${{ matrix.asset_name }}.tar.gz
asset_name: ${{ matrix.asset_name }}.tar.gz
asset_content_type: application/x-gzip
upload_url: ${{ needs.documents.outputs.upload_url }}
publish_to_crates_io:
runs-on: ubuntu-latest
needs: publish
permissions:
contents: read
id-token: write outputs:
appname: ${{ needs.publish.outputs.appname }}
tag: ${{ needs.publish.outputs.tag }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Authenticate with custom registry
id: auth
uses: rust-lang/crates-io-auth-action@v1
- name: publish
env:
CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}
run:
cargo publish --package sibling