Skip to content

Build

Build #13

Workflow file for this run

# Nightly builds
name: Build
on:
schedule:
- cron: "15 0 * * *"
permissions:
contents: write
packages: read
concurrency: build
env:
GIT_AUTHOR_NAME: OpenSlide Automation
GIT_AUTHOR_EMAIL: openslide@openslide.org
GIT_COMMITTER_NAME: OpenSlide Automation
GIT_COMMITTER_EMAIL: openslide@openslide.org
jobs:
setup:
name: Set up
runs-on: ubuntu-latest
outputs:
linux_builder_repo_and_digest: ${{ steps.find-linux.outputs.builder_repo_and_digest }}
windows_builder_repo_and_digest: ${{ steps.find-windows.outputs.builder_repo_and_digest }}
pkgver: ${{ steps.params.outputs.pkgver }}
openslide_commit: ${{ steps.params.outputs.openslide_commit }}
java_commit: ${{ steps.params.outputs.java_commit }}
bin_commit: ${{ steps.params.outputs.bin_commit }}
changed: ${{ steps.params.outputs.changed }}
stale: ${{ steps.params.outputs.stale }}
steps:
- name: Check out repo
uses: actions/checkout@v4
- name: Find Linux builder container digest
id: find-linux
uses: openslide/openslide-bin/.github/find-container-digest@main
with:
builder_image: linux
- name: Find Windows builder container digest
id: find-windows
uses: openslide/openslide-bin/.github/find-container-digest@main
with:
builder_image: windows
- name: Calculate parameters
id: params
run: |
set -euo pipefail
pkgver="$(date +%Y%m%d)-nightly"
echo "pkgver=$pkgver" >> $GITHUB_OUTPUT
duplicate=$(jq ".builds[] | select(.pkgver == \"$pkgver\")" \
docs/index.json)
if [ -n "$duplicate" ]; then
echo "Found existing nightly build $pkgver"
exit 1
fi
# Modify the repository at least every 30 days so GitHub doesn't
# disable the workflow
if [ $(( $(jq .last_update docs/index.json) + 86400 * 30 )) -lt $(date +%s) ]; then
echo "Repository is stale"
echo "stale=true" >> $GITHUB_OUTPUT
fi
for repo in openslide openslide-java openslide-bin; do
old=$(jq -r ".builds[-1][\"${repo}\"]" docs/index.json)
new=$(curl --no-progress-meter \
-H "Accept: application/vnd.github.v3+json" \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
"https://api.github.com/repos/openslide/${repo}/commits/main" |
jq -r .sha)
echo "$repo commit: https://github.com/openslide/${repo}/commit/${new:0:10}"
echo "${repo##*-}_commit=$new" >> $GITHUB_OUTPUT
if [ "$old" != "$new" ]; then
echo " -> changed from https://github.com/openslide/${repo}/commit/${old:0:10}"
echo "changed=true" >> $GITHUB_OUTPUT
else
echo " -> unchanged"
fi
done
for repo in "linux|${{ steps.find-linux.outputs.builder_repo_and_digest }}" "windows|${{ steps.find-windows.outputs.builder_repo_and_digest }}"; do
name="${repo%%|*}"
old=$(jq -r ".builds[-1][\"${name}-builder\"]" docs/index.json)
new="${repo##*|}"
echo "$name builder container: $new"
if [ "$old" != "$new" ]; then
echo " -> changed from $old"
echo "changed=true" >> $GITHUB_OUTPUT
else
echo " -> unchanged"
fi
done
build:
name: Build
needs: setup
if: needs.setup.outputs.changed
uses: openslide/openslide-bin/.github/workflows/build.yml@main
with:
linux_builder_repo_and_digest: ${{ needs.setup.outputs.linux_builder_repo_and_digest }}
windows_builder_repo_and_digest: ${{ needs.setup.outputs.windows_builder_repo_and_digest }}
openslide_repo: openslide/openslide
openslide_ref: ${{ needs.setup.outputs.openslide_commit }}
openslide_java_repo: openslide/openslide-java
openslide_java_ref: ${{ needs.setup.outputs.java_commit }}
openslide_bin_repo: openslide/openslide-bin
openslide_bin_ref: ${{ needs.setup.outputs.bin_commit }}
pkgver: ${{ needs.setup.outputs.pkgver }}
upload:
name: Upload
needs: [setup, build]
if: needs.setup.outputs.changed
runs-on: ubuntu-latest
steps:
- name: Check out repo
uses: actions/checkout@v4
- name: Install dependencies
run: sudo apt-get install python3-dateutil python3-jinja2
- name: Download artifacts
uses: actions/download-artifact@v3
with:
name: ${{ needs.build.outputs.artifact }}
- name: Update index
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
scripts/make-index.py \
--pkgver "${{ needs.setup.outputs.pkgver }}" \
--tag "v${{ needs.setup.outputs.pkgver }}" \
--files "${{ needs.build.outputs.artifact }}" \
--linux-builder "${{ needs.setup.outputs.linux_builder_repo_and_digest }}" \
--windows-builder "${{ needs.setup.outputs.windows_builder_repo_and_digest }}" \
--openslide "${{ needs.setup.outputs.openslide_commit }}" \
--java "${{ needs.setup.outputs.java_commit }}" \
--bin "${{ needs.setup.outputs.bin_commit }}"
- name: Commit, tag, push, create release
env:
GITHUB_TOKEN: ${{ github.token }}
run: |
artifact="${{ needs.build.outputs.artifact }}"
pkgver="${{ needs.setup.outputs.pkgver }}"
unzip -j "${artifact}/openslide-win64-${pkgver}.zip" \
"openslide-win64-${pkgver}/VERSIONS.md"
# trim width for commit message limit
sed -i -e 's/ |$/|/' VERSIONS.md
pkglen=$(awk -F'|' '{print length($2) - 2; exit}' VERSIONS.md)
verlen=$(awk -F'|' '{print length($3) - 2; exit}' VERSIONS.md)
line() {
# args: friendly-name repo-name commit-hash emphasis
printf "| %-${pkglen}s | %-${verlen}s |" \
"$4$1$4" "${4}openslide/${2}@${3:0:8}${4}"
}
update_line() {
# args: friendly-name repo-name commit-hash emphasis
local new="$(line "$@")"
local escaped="$(sed 's/*/\\*/g' <<<"$4$1$4")"
sed -i -e "/$escaped/ s^.*^$new^" VERSIONS.md
}
update_line OpenSlide openslide \
"${{ needs.setup.outputs.openslide_commit }}" "**"
update_line "OpenSlide Java" openslide-java \
"${{ needs.setup.outputs.java_commit }}" "**"
line openslide-bin openslide-bin \
"${{ needs.setup.outputs.bin_commit }}" _ >> VERSIONS.md
title="Build $pkgver"
body="$(cat VERSIONS.md)"
git add docs
git commit -m "$title" -m "$body"
git tag -a "v$pkgver" -m "$title" -m "$body"
git push origin HEAD "v$pkgver"
gh release create --notes-file - --prerelease --verify-tag \
--title "$title" "v$pkgver" "${artifact}/"* <<EOF
See the [build index](https://openslide.org/builds/) for more info.
$body
EOF
keepalive:
name: Keepalive
needs: setup
if: needs.setup.outputs.stale && ! needs.setup.outputs.changed
runs-on: ubuntu-latest
steps:
- name: Check out repo
uses: actions/checkout@v4
- name: Install dependencies
run: sudo apt-get install python3-dateutil python3-jinja2
- name: Commit and push
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
scripts/make-index.py
git add docs
git commit -m "Update timestamp"
git push