Skip to content

Add comprehensive integration test suite (51 tests) #5

Add comprehensive integration test suite (51 tests)

Add comprehensive integration test suite (51 tests) #5

Workflow file for this run

name: CI and Release
on:
push:
branches:
- main
pull_request:
branches:
- main
permissions:
contents: write
jobs:
build:
name: Build (${{ matrix.target }})
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
# Linux native build (for tests)
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
artifact_name: smtp-sink
asset_name: smtp-sink-linux-amd64-gnu
use_cross: false
run_tests: true
skip_artifact: true
# Linux builds (using musl for static linking via cross)
- os: ubuntu-latest
target: x86_64-unknown-linux-musl
artifact_name: smtp-sink
asset_name: smtp-sink-linux-amd64
use_cross: true
run_tests: false
- os: ubuntu-latest
target: aarch64-unknown-linux-musl
artifact_name: smtp-sink
asset_name: smtp-sink-linux-arm64
use_cross: true
run_tests: false
# Windows builds (tests disabled due to LNK1318 PDB errors on GH runners)
- os: windows-latest
target: x86_64-pc-windows-msvc
artifact_name: smtp-sink.exe
asset_name: smtp-sink-windows-amd64
use_cross: false
run_tests: false
- os: windows-latest
target: aarch64-pc-windows-msvc
artifact_name: smtp-sink.exe
asset_name: smtp-sink-windows-arm64
use_cross: false
run_tests: false
# macOS builds
- os: macos-latest
target: x86_64-apple-darwin
artifact_name: smtp-sink
asset_name: smtp-sink-macos-amd64
use_cross: false
run_tests: false
- os: macos-latest
target: aarch64-apple-darwin
artifact_name: smtp-sink
asset_name: smtp-sink-macos-arm64
use_cross: false
run_tests: false
steps:
- uses: actions/checkout@v4
- name: Install Rust 1.86.0
uses: dtolnay/rust-toolchain@stable
with:
toolchain: 1.86.0
targets: ${{ matrix.target }}
components: clippy
- name: Install Cross
if: matrix.use_cross == true
run: cargo install cross --git https://github.com/cross-rs/cross --locked
- name: Run Clippy
run: cargo clippy --all-targets --all-features -- -D warnings
- name: Run tests
if: matrix.run_tests == true
run: cargo test --all --tests -- --nocapture
- name: Build
if: runner.os != 'Windows'
shell: bash
run: |
if [[ "${{ matrix.use_cross }}" == "true" ]]; then
cross build --release --target ${{ matrix.target }}
else
cargo build --release --target ${{ matrix.target }}
fi
- name: Build
if: runner.os == 'Windows'
shell: pwsh
run: |
if ('${{ matrix.use_cross }}' -eq 'true') {
cross build --release --target '${{ matrix.target }}'
} else {
cargo build --release --target '${{ matrix.target }}'
}
- name: Package binary
if: matrix.skip_artifact != true
shell: bash
run: |
cd target/${{ matrix.target }}/release
if [ "${{ runner.os }}" == "Windows" ]; then
7z a ../../../${{ matrix.asset_name }}.zip ${{ matrix.artifact_name }}
echo "ASSET_PATH=${{ matrix.asset_name }}.zip" >> $GITHUB_ENV
else
tar -czf ../../../${{ matrix.asset_name }}.tar.gz ${{ matrix.artifact_name }}
echo "ASSET_PATH=${{ matrix.asset_name }}.tar.gz" >> $GITHUB_ENV
fi
cd ../../../
- name: Upload Release Asset
if: matrix.skip_artifact != true
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.asset_name }}
path: ${{ env.ASSET_PATH }}
if-no-files-found: error
create_release:
name: Create Release
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
needs: build
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Determine next version
id: determine_version
run: |
LATEST_TAG=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
"https://api.github.com/repos/${{ github.repository }}/releases/latest" | jq -r .tag_name)
BASE_VERSION=$(grep '^version = ' Cargo.toml | sed 's/version = "\(.*\)"/\1/')
NEXT_VERSION=""
if [[ -z "$LATEST_TAG" || "$LATEST_TAG" == "null" ]]; then
NEXT_VERSION="$BASE_VERSION"
elif [[ "$LATEST_TAG" =~ ^v([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
MAJOR=${BASH_REMATCH[1]}
MINOR=${BASH_REMATCH[2]}
PATCH=${BASH_REMATCH[3]}
NEXT_PATCH=$((PATCH + 1))
NEXT_VERSION="${MAJOR}.${MINOR}.${NEXT_PATCH}"
else
NEXT_VERSION="$BASE_VERSION"
fi
echo "new_version=${NEXT_VERSION}" >> $GITHUB_OUTPUT
shell: bash
- name: Download all release assets
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ steps.determine_version.outputs.new_version }}
name: Release v${{ steps.determine_version.outputs.new_version }}
files: artifacts/*/*
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}