version: "0.0"
env:
vars:
SHELLOPTS: "errexit:nounset:pipefail"
nodes:
"build:docs":
description: "Builds the documentation."
tasks:
- script: |
cargo doc --no-deps --document-private-items
"build:program":
description: "Builds program."
env:
vars:
SHELLOPTS: "errexit:pipefail"
matrix:
parallel: false
dimensions:
- - {}
- env:
vars:
RELEASE: --release
tasks:
- script: |
set -e
export CARGO_FLAGS=""
echo cargo flags: \"$CARGO_FLAGS\"
cargo build $CARGO_FLAGS
"dependencies:upgrade":
description: "Upgrades all dependencies."
tasks:
- script: |
cargo upgrade -i --pinned
"test:program":
description: "Tests the program."
tasks:
- script: |
cargo test --no-fail-fast
"hook:pre-push":
description: "GIT pre-push hook."
pre:
- regex: "^build:"
- name: "test:program"
tasks: []
"release:init":
description: "Initializes release folder."
pre:
- regex: "^build:"
- name: "test:program"
tasks:
- script: |
rm -rf ./.release || true
mkdir ./.release
mkdir ./.release/temp
mkdir ./.release/assets
"release:asset:generate:compile":
description: "Compiles the application."
pre:
- name: "release:init"
matrix:
parallel: true
dimensions:
- - env:
vars:
TARGET: aarch64-unknown-linux-gnu
- env:
vars:
TARGET: x86_64-unknown-linux-gnu
- env:
vars:
TARGET: aarch64-apple-darwin
- env:
vars:
TARGET: x86_64-unknown-linux-musl
tasks:
- script: |
if [[ "${TARGET}" == *"apple-darwin"* ]]; then
rustup target add ${TARGET} || true
cargo +stable build --release --target ${TARGET}
else
export DOCKER_DEFAULT_PLATFORM=linux/amd64
cross +stable build --release --target ${TARGET}
fi
cp ./target/${TARGET}/release/qop ./.release/assets/qop-${TARGET}
"release:asset:generate:manpages":
description: "Generates manpages."
pre:
- name: "release:init"
tasks:
- script: |
cargo run -- man -o ./.release/temp/manpages -f manpages
cd ./.release/temp/manpages
tar -czf ../../assets/docs-manpages.tar.gz .
"release:asset:generate:markdown":
description: "Generates manpages as markdown."
pre:
- name: "release:init"
tasks:
- script: |
cargo run -- man -o ./.release/temp/markdown -f markdown
cd ./.release/temp/markdown
tar -czf ../../assets/docs-markdown.tar.gz .
"release:asset:generate:shellcompletion":
description: "Generates shell completion files."
pre:
- name: "release:init"
matrix:
parallel: true
dimensions:
- - env:
vars:
LANGUAGE: bash
- env:
vars:
LANGUAGE: zsh
- env:
vars:
LANGUAGE: fish
- env:
vars:
LANGUAGE: elvish
- env:
vars:
LANGUAGE: powershell
tasks:
- script: |
mkdir -p "./.release/temp/shellcompletion"
cargo run -- autocomplete -o ./.release/temp/shellcompletion/${LANGUAGE} -s ${LANGUAGE}
cd ./.release/temp/shellcompletion/${LANGUAGE}
tar -czf ../../../assets/shell-completion-${LANGUAGE}.tar.gz .
"release:asset:hash":
description: "Hashes all assets."
pre:
- regex: "release:asset:generate:"
tasks:
- script: |
mkdir -p ./.release/temp/hashes
cd ./.release/assets
for file in ./*; do
echo "Hashing: ${file}"
sha256sum "${file}" > "./../temp/hashes/$(basename "${file}").sha256"
echo ""
done
"release:asset:sign":
description: "Signs all assets."
pre:
- regex: "^release:asset:generate:"
tasks:
- script: |
mkdir -p ./.release/temp/signatures
for file in ./.release/assets/*; do
echo "Signing: ${file}"
gpg --batch --yes --local-user "{{ signer }}" --armor --detach-sig --output "./.release/temp/signatures/$(basename "${file}").asc" "${file}"
echo ""
done
"release:asset:verify":
description: "Verifies all assets with their respective signatures."
pre:
- name: "release:asset:sign"
tasks:
- script: |
for sig in ./.release/temp/signatures/*.asc; do
file="./.release/assets/$(basename "${sig%.asc}")"
echo "Verifying: ${file} with signature ${sig}"
gpg --batch --yes --verify "${sig}" "${file}"
echo ""
done
"release:github:readme":
description: "Creates a README.md file for the release."
pre:
- regex: "^release:asset:"
tasks:
- script: |
mkdir -p ./.release/temp/github
printf '' > ./.release/temp/github/README.md
echo "## Assets\n" >> ./.release/temp/github/README.md
echo "### Binaries\n" >> ./.release/temp/github/README.md
for file in ./.release/assets/*; do
echo "- \`$(basename "${file}")\`" >> ./.release/temp/github/README.md
done
echo "\n### Signatures\n" >> ./.release/temp/github/README.md
for file in ./.release/temp/signatures/*; do
echo "- \`$(basename "${file}")\`" >> ./.release/temp/github/README.md
done
echo "\n### Hashes\n" >> ./.release/temp/github/README.md
for file in ./.release/temp/hashes/*; do
echo "- \`$(basename "${file}")\`" >> ./.release/temp/github/README.md
done
echo "\n## Hashes\n" >> ./.release/temp/github/README.md
echo "| Asset | SHA256 Hash |" >> ./.release/temp/github/README.md
echo "| --- | --- |" >> ./.release/temp/github/README.md
for file in ./.release/temp/hashes/*; do
asset=$(basename "${file}" .sha256)
hash=$(cut -d' ' -f1 "${file}")
echo "| \`${asset}\` | \`${hash}\` |" >> ./.release/temp/github/README.md
done
"release:github":
description: "Releases to GitHub."
pre:
- regex: "^release:github:"
tasks:
- script: |
echo "=== === ==="
echo "Releasing qop version: {{ version }}"
echo "--- --- ---"
- script: |
if ! [ -z "$(git status --porcelain)" ]; then
echo "Dirty repo. Please commit all changes before releasing."
exit 1
fi
- script: |
if ! gh auth status >/dev/null 2>&1; then
echo "You need to login: gh auth login"
exit 1
fi
- script: |
gh release create release/v{{ version }} --latest --target=master --title="Release {{ version }}" --notes-file ./.release/temp/github/README.md ./.release/assets/* ./.release/temp/hashes/* ./.release/temp/signatures/*
"release:cratesio":
description: "Releases to crates.io."
pre:
- regex: "^build:"
tasks:
- script: |
cargo publish --dry-run
cp Cargo.toml Cargo.toml.bak
sed 's/version = "0.0.0"/version = "{{ version }}"/g' Cargo.toml > Cargo.toml.tmp
mv Cargo.toml.tmp Cargo.toml
cargo publish --allow-dirty
mv Cargo.toml.bak Cargo.toml