Skip to content

[feat]: compose project view #15

[feat]: compose project view

[feat]: compose project view #15

Workflow file for this run

name: Release
on:
release:
types: [published]
push:
tags: ['v*']
env:
CARGO_TERM_COLOR: always
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
# Build standalone binaries for all platforms (Tier 1 requirement)
build-binaries:
strategy:
matrix:
include:
# Linux builds
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
artifact_name: dprs-linux-x64
cross: false
- os: ubuntu-latest
target: aarch64-unknown-linux-gnu
artifact_name: dprs-linux-arm64
cross: true
# macOS builds
- os: macos-latest
target: x86_64-apple-darwin
artifact_name: dprs-macos-intel
cross: false
- os: macos-latest
target: aarch64-apple-darwin
artifact_name: dprs-macos-arm64
cross: false
# Windows builds
- os: windows-latest
target: x86_64-pc-windows-msvc
artifact_name: dprs-windows-x64.exe
cross: false
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Install cross-compilation tools
if: matrix.cross
run: |
cargo install cross --git https://github.com/cross-rs/cross
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-${{ matrix.target }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo index
uses: actions/cache@v4
with:
path: ~/.cargo/git
key: ${{ runner.os }}-${{ matrix.target }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo build
uses: actions/cache@v4
with:
path: target
key: ${{ runner.os }}-${{ matrix.target }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }}
- name: Build release binary
run: |
if [ "${{ matrix.cross }}" = "true" ]; then
cross build --release --target ${{ matrix.target }}
else
cargo build --release --target ${{ matrix.target }}
fi
shell: bash
- name: Package binaries
run: |
mkdir -p release
if [ "${{ matrix.os }}" = "windows-latest" ]; then
cp target/${{ matrix.target }}/release/dprs.exe release/${{ matrix.artifact_name }}
cp target/${{ matrix.target }}/release/dplw.exe release/dplw-windows-x64.exe
else
cp target/${{ matrix.target }}/release/dprs release/${{ matrix.artifact_name }}
cp target/${{ matrix.target }}/release/dplw release/dplw-${{ matrix.target }}
chmod +x release/*
fi
shell: bash
- name: Generate checksums
run: |
cd release
if [ "${{ matrix.os }}" = "windows-latest" ]; then
certutil -hashfile ${{ matrix.artifact_name }} SHA256 > ${{ matrix.artifact_name }}.sha256
else
shasum -a 256 ${{ matrix.artifact_name }} > ${{ matrix.artifact_name }}.sha256
shasum -a 256 dplw-* > dplw-${{ matrix.target }}.sha256
fi
shell: bash
- name: Upload binary artifacts
uses: actions/upload-artifact@v4
with:
name: binary-${{ matrix.target }}
path: release/*
# Build Linux distribution packages
build-deb:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: x86_64-unknown-linux-musl
- name: Install musl tools
run: sudo apt-get update && sudo apt-get install -y musl-tools
- name: Install cargo-deb
run: cargo install cargo-deb
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo index
uses: actions/cache@v4
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo build
uses: actions/cache@v4
with:
path: target
key: ${{ runner.os }}-musl-cargo-build-target-${{ hashFiles('**/Cargo.lock') }}
- name: Build static binary with musl
run: cargo build --release --target x86_64-unknown-linux-musl
- name: Build deb package
run: cargo deb --target x86_64-unknown-linux-musl --no-build
- name: Upload deb artifact
uses: actions/upload-artifact@v4
with:
name: deb-package
path: target/x86_64-unknown-linux-musl/debian/*.deb
build-rpm:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: x86_64-unknown-linux-musl
- name: Install musl tools
run: sudo apt-get update && sudo apt-get install -y musl-tools
- name: Install cargo-generate-rpm
run: cargo install cargo-generate-rpm
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo index
uses: actions/cache@v4
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo build
uses: actions/cache@v4
with:
path: target
key: ${{ runner.os }}-musl-cargo-build-target-${{ hashFiles('**/Cargo.lock') }}
- name: Build static binary with musl
run: cargo build --release --target x86_64-unknown-linux-musl
- name: Build rpm package
run: cargo generate-rpm --target x86_64-unknown-linux-musl
- name: Upload rpm artifact
uses: actions/upload-artifact@v4
with:
name: rpm-package
path: target/x86_64-unknown-linux-musl/generate-rpm/*.rpm
# Publish to crates.io (Tier 1 language-specific package manager)
publish-crates:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Publish to crates.io
run: cargo publish --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
continue-on-error: true # May already be published
# Build and publish Docker images (Tier 3 automation support)
publish-docker:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract version from tag
id: version
run: |
VERSION=${GITHUB_REF#refs/tags/v}
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
echo "MAJOR=$(echo $VERSION | cut -d. -f1)" >> $GITHUB_OUTPUT
echo "MINOR=$(echo $VERSION | cut -d. -f1-2)" >> $GITHUB_OUTPUT
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: |
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.MAJOR }}
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.MINOR }}
cache-from: type=gha
cache-to: type=gha,mode=max
# Create GitHub Release with all artifacts
release:
needs: [build-binaries, build-deb, build-rpm, publish-crates, publish-docker]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Download all binary artifacts
uses: actions/download-artifact@v4
with:
pattern: binary-*
path: artifacts/binaries
merge-multiple: true
- name: Download deb artifact
uses: actions/download-artifact@v4
with:
name: deb-package
path: artifacts/
- name: Download rpm artifact
uses: actions/download-artifact@v4
with:
name: rpm-package
path: artifacts/
- name: Create consolidated checksums
run: |
cd artifacts
find . -type f \( -name "dprs-*" -o -name "dplw-*" -o -name "*.deb" -o -name "*.rpm" \) -not -name "*.sha256" -exec shasum -a 256 {} \; > SHA256SUMS
cat SHA256SUMS
- name: Create Release
uses: softprops/action-gh-release@v1
with:
files: |
artifacts/binaries/*
artifacts/*.deb
artifacts/*.rpm
artifacts/SHA256SUMS
draft: false
prerelease: false
generate_release_notes: true
body: |
## Installation
### Quick Start
**macOS/Linux (Homebrew)** - *Coming soon in Tier 2*
```bash
brew install dprs
```
**Windows (winget)** - *Coming soon in Tier 2*
```bash
winget install dprs
```
### Standalone Binaries
Download the appropriate binary for your platform from the Assets below:
- **Linux x64**: `dprs-linux-x64`
- **Linux ARM64**: `dprs-linux-arm64`
- **macOS Intel**: `dprs-macos-intel`
- **macOS Apple Silicon**: `dprs-macos-arm64`
- **Windows x64**: `dprs-windows-x64.exe`
**Installation**:
```bash
# Linux/macOS
chmod +x dprs-*
sudo mv dprs-* /usr/local/bin/dprs
# Windows: Move dprs-windows-x64.exe to a directory in your PATH
```
**Verification**:
```bash
dprs --version
```
### Package Managers
**Rust/Cargo**:
```bash
cargo install dprs
```
**Debian/Ubuntu**:
```bash
wget https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/dprs_*.deb
sudo dpkg -i dprs_*.deb
```
**Fedora/RHEL**:
```bash
wget https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/dprs-*.rpm
sudo rpm -i dprs-*.rpm
```
### Docker
**Multi-architecture support** (amd64, arm64):
```bash
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}
docker run --rm ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }} dprs --version
```
### Checksums
Verify your download integrity using `SHA256SUMS`.
---
πŸ“¦ **Distribution Tier**: Currently at **Tier 1** (Launch Phase)
- βœ… Standalone binaries for all major platforms
- βœ… Cargo/crates.io package manager
- βœ… Docker multi-arch images
- βœ… Debian/Ubuntu packages
- βœ… Fedora/RHEL packages
πŸš€ **Coming in Tier 2** (Growth Phase):
- Homebrew formula (macOS/Linux)
- winget package (Windows)
- Self-update mechanism
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}