execute module replacement in a single command (#178) #15
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Release | |
on: | |
push: | |
tags: | |
- 'v*.*.*' | |
jobs: | |
release: | |
name: Release | |
strategy: | |
matrix: | |
os: [ ubuntu-latest ] | |
go: [ '1.22' ] | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Install Go | |
uses: actions/setup-go@v5 | |
with: | |
go-version: ${{ matrix.go }} | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
# Force fetch upstream tags -- because 65 minutes | |
# tl;dr: actions/checkout@v2 runs this line: | |
# git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 origin +ebc278ec98bb24f2852b61fde2a9bf2e3d83818b:refs/tags/ | |
# which makes its own local lightweight tag, losing all the annotations in the process. Our earlier script ran: | |
# git fetch --prune --unshallow | |
# which doesn't overwrite that tag because that would be destructive. | |
# Credit to @francislavoie for the investigation. | |
# https://github.com/actions/checkout/issues/290#issuecomment-680260080 | |
- name: Force fetch upstream tags | |
run: git fetch --tags --force | |
# https://github.community/t5/GitHub-Actions/How-to-get-just-the-tag-name/m-p/32167/highlight/true#M1027 | |
- name: Print Go version and environment | |
id: vars | |
run: | | |
printf "Using go at: $(which go)\n" | |
printf "Go version: $(go version)\n" | |
printf "\n\nGo environment:\n\n" | |
go env | |
printf "\n\nSystem environment:\n\n" | |
env | |
echo "version_tag=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_OUTPUT | |
echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT | |
# Add "pip install" CLI tools to PATH | |
echo ~/.local/bin >> $GITHUB_PATH | |
# Parse semver | |
TAG=${GITHUB_REF/refs\/tags\//} | |
SEMVER_RE='[^0-9]*\([0-9]*\)[.]\([0-9]*\)[.]\([0-9]*\)\([0-9A-Za-z\.-]*\)' | |
TAG_MAJOR=`echo ${TAG#v} | sed -e "s#$SEMVER_RE#\1#"` | |
TAG_MINOR=`echo ${TAG#v} | sed -e "s#$SEMVER_RE#\2#"` | |
TAG_PATCH=`echo ${TAG#v} | sed -e "s#$SEMVER_RE#\3#"` | |
TAG_SPECIAL=`echo ${TAG#v} | sed -e "s#$SEMVER_RE#\4#"` | |
echo "tag_major=${TAG_MAJOR}" >> $GITHUB_OUTPUT | |
echo "tag_minor=${TAG_MINOR}" >> $GITHUB_OUTPUT | |
echo "tag_patch=${TAG_PATCH}" >> $GITHUB_OUTPUT | |
echo "tag_special=${TAG_SPECIAL}" >> $GITHUB_OUTPUT | |
# Cloudsmith CLI tooling for pushing releases | |
# See https://help.cloudsmith.io/docs/cli | |
- name: Install Cloudsmith CLI | |
run: pip install --upgrade cloudsmith-cli | |
- name: Validate commits and tag signatures | |
run: | | |
# Import Matt Holt's key | |
curl 'https://github.com/mholt.gpg' | gpg --import | |
echo "Verifying the tag: ${{ steps.vars.outputs.version_tag }}" | |
# tags are only accepted if signed by Matt's key | |
git verify-tag "${{ steps.vars.outputs.version_tag }}" || exit 1 | |
- name: Cache the build cache | |
uses: actions/cache@v4 | |
with: | |
# In order: | |
# * Module download cache | |
# * Build cache (Linux) | |
# * Build cache (Mac) | |
# * Build cache (Windows) | |
path: | | |
~/go/pkg/mod | |
~/.cache/go-build | |
~/Library/Caches/go-build | |
~\AppData\Local\go-build | |
key: ${{ runner.os }}-go${{ matrix.go }}-release-${{ hashFiles('**/go.sum') }} | |
restore-keys: | | |
${{ runner.os }}-go${{ matrix.go }}-release | |
# GoReleaser will take care of publishing those artifacts into the release | |
- name: Run GoReleaser | |
uses: goreleaser/goreleaser-action@v5 | |
with: | |
version: latest | |
args: release --rm-dist | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
TAG: ${{ steps.vars.outputs.version_tag }} | |
# Publish only stable releases to Cloudsmith | |
# See https://cloudsmith.io/~caddy/repos/xcaddy/ | |
- name: Publish .deb to Cloudsmith | |
if: ${{ steps.vars.outputs.tag_special == '' }} | |
env: | |
CLOUDSMITH_API_KEY: ${{ secrets.CLOUDSMITH_API_KEY }} | |
run: | | |
for filename in dist/*.deb; do | |
# armv6 and armv7 are both "armhf" so we can skip the duplicate | |
if [[ "$filename" == *"armv6"* ]]; then | |
echo "Skipping $filename" | |
continue | |
fi | |
echo "Pushing $filename to 'xcaddy'" | |
cloudsmith push deb caddy/xcaddy/any-distro/any-version $filename | |
done |