Skip to content

Commit

Permalink
Minor changes from ripgrep workflow + simplify + clarify quoting
Browse files Browse the repository at this point in the history
The release.yml workflow adapts from the corresponding workflow in
the ripgrep project, but drawing from multiple revisions of it and
also including substantial gitoxide-specific changes.

ripgrep's licensing permits this even with respect to any material
that is original to that project, since one of the licenses ripgrep
is offered under is the Unlicense, which allows arbitrary use and
adaptation without requiring even attribution.

This commit makes these changes related to that relationship:

- Note the relationship, linking to the ripgrep workflow.

- Bring in the new ripgrep comment explaining the workflow, which,
  as there, is shorter and just above the `create-release` job, not
  at the top. This makes a slight change, so as not to refer to a
  version tag scheme that differs and that we do not enforce.

- Renames both *_VERSION variables to just `VERSION`, as they now
  are in the ripgrep workflow. These variables have conceptually
  the same meaning, always take the same value, and do not clash
  because each job in the workflow has exactly one of them.

- Bring in the simplification of using `github.ref_name` to get the
  tag name to use as the version string.

There remain other significant changes to that workflow that can
and should be applied or adapted into this one, but which are not
included in this commit.

This commit also makes some other changes for simplification and
stylistic clarity:

- Change the trigger tag pattern to the glob-like `v*`, which seems
  to be what the GHA docs say will make it work (though this may
  have been tried unsuccessfully before).

- Don't specify the fetch depth, because `actions-checkout`
  defaults to a depth of 1 already.

- Remove ad-hoc echos that inadvertently performed empty parameter
  expansion because they used a variable that had just been written
  in `$GITHUB_ENV`. Writes to `$GITHUB_ENV` only affect the
  environment of subsequent steps, not of subsequent commands run
  as part of the same script step. These could have been shown in a
  different way, or by expanding them straightforwardly but in a
  subsequent script step (like the existing "Show command used for
  Cargo" step), but the removed echos did not seem very important
  and the information they were showing is mostly available by
  detailed log inspection.

- Simplify some commands whose complexity was just to support those
  ineffective echos.

- Use the bash `$(< path)` syntax where applicable. This is a more
  efficient alternative to `$(cat path)`. It's a bash-ism, but bash
  is now being used to run all steps on all platforms.

- Where both (a) quoting was clearly unnecessary because of the way
  YAML parses strings and (b) quoting was being used in some places
  and not analogous other places, so the style was inconsistent,
  this removes the quoting. (This does not remove quoting in other
  situations, not even when one but not the other condition holds.)

- When quoting inline, this always uses the strongest form, of
  those that are readily available and easily readable. This
  applies both to the formation of YAML strings, which now prefer
  single quotes to double quotes, and to quotation marks that
  appear inside YAML strings that are executed by the shell. Now
  double quotes are only used when both (a) quoting for a shell
  rather than the YAML parser and (b) deliberately causing the
  shell to perform its own `$...` expansions.

  This is because double-quoted `${{ }}` interpolation can falsely
  appear to be a shell expansion, when really all `${{ }}`
  interpolation is done after YAML parsing but before the shell
  receives the code that it runs in a script step.

- Double-quote `$GITHUB_ENV` (rather than not quoting it), so all
  shell parameter expansion is double quoted except where expansion
  that quoting would suppress is wanted (currently, nowhere).

- When shell quoting is optional because the item being `${{ }}`
  interpolated is guaranteed to be parsed by the shell as a single
  argument, and where we *rely* on that effect, this quotes the
  argument. This is done more for consistency, in view of how it
  was already mostly being done, than robustness. It is still not
  truly robust because, although we never set such values,  a `'`
  character, if present in the output of interpolation, would be
  (like all output of `${{ }}` interpolation) present literally in
  the script that the shell receives, and the shell would interpret
  it as a closing quotation mark.

- Adjust spacing for consistency with the existing style.
  • Loading branch information
EliahKagan committed Jul 29, 2024
1 parent 418d71f commit 286e388
Showing 1 changed file with 37 additions and 49 deletions.
86 changes: 37 additions & 49 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,14 +1,5 @@
# The way this works is a little weird. But basically, the create-release job
# runs purely to initialize the GitHub release itself. Once done, the upload
# URL of the release is saved as an artifact.
#
# The build-release job runs only once create-release is finished. It gets
# the release upload URL by downloading the corresponding artifact (which was
# uploaded by create-release). It then builds the release executables for each
# supported platform and attaches them as release assets to the previously
# created release.
#
# The key here is that we create the release only once.
# This is largely adapted from past and recent versions of the ripgrep release workflow.
# https://github.com/BurntSushi/ripgrep/blob/master/.github/workflows/release.yml

name: release

Expand All @@ -19,7 +10,7 @@ on:
# branches:
# - fix-releases
tags:
- "v.*"
- 'v*'

env:
RUST_BACKTRACE: 1
Expand All @@ -31,38 +22,39 @@ defaults:
shell: bash

jobs:
# The create-release job runs purely to initialize the GitHub release itself,
# and names the release after the version tag that was pushed. It's separate
# from building the release so that we only create the release once.
create-release:
name: create-release
runs-on: ubuntu-latest
# env:
# # Set to force version number, e.g., when no tag exists.
# ARTIFACT_VERSION: TEST-0.0.0
# VERSION: TEST-0.0.0
steps:
- name: Create artifacts directory
run: mkdir artifacts

- name: Get the release version from the tag
if: env.ARTIFACT_VERSION == ''
run: |
echo "ARTIFACT_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
echo "version is: ${{ env.ARTIFACT_VERSION }}"
if: env.VERSION == ''
run: echo 'VERSION=${{ github.ref_name }}' >> "$GITHUB_ENV"

- name: Create GitHub release
id: release
uses: ncipollo/release-action@v1
with:
tag: ${{ env.ARTIFACT_VERSION }}
name: ${{ env.ARTIFACT_VERSION }}
tag: ${{ env.VERSION }}
name: ${{ env.VERSION }}
allowUpdates: true
omitBody: true
omitPrereleaseDuringUpdate: true
token: ${{ secrets.GITHUB_TOKEN }}

- name: Save release upload URL to artifact
run: echo "${{ steps.release.outputs.upload_url }}" > artifacts/release-upload-url
run: echo '${{ steps.release.outputs.upload_url }}' > artifacts/release-upload-url

- name: Save version number to artifact
run: echo "${{ env.ARTIFACT_VERSION }}" > artifacts/release-version
run: echo '${{ env.VERSION }}' > artifacts/release-version

- name: Upload artifacts
uses: actions/upload-artifact@v4
Expand All @@ -72,21 +64,21 @@ jobs:

build-release:
name: build-release
needs: [ "create-release" ]
needs: [ create-release ]
env:
# For some builds, we use cross to test on 32-bit and big-endian
# systems.
CARGO: cargo
# When CARGO is set to CROSS, this is set to `--target matrix.target`.
TARGET_FLAGS: ""
TARGET_FLAGS: ''
# When CARGO is set to CROSS, TARGET_DIR includes matrix.target.
TARGET_DIR: ./target
# Emit backtraces on panics.
RUST_BACKTRACE: 1
strategy:
matrix:
build: [ linux, linux-arm, macos, win-msvc, win-gnu, win32-msvc ]
feature: [ "small", "lean", "max", "max-pure" ]
feature: [ small, lean, max, max-pure ]
include:
- build: linux
os: ubuntu-latest
Expand Down Expand Up @@ -130,11 +122,10 @@ jobs:
feature: max

runs-on: ${{ matrix.os }}

steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1

- name: Install packages (Ubuntu)
# Because openssl doesn't work on musl by default, we resort to max-pure. And that won't need any dependency, so we can skip this.continue-on-error
Expand All @@ -152,15 +143,15 @@ jobs:
- name: Use Cross
run: |
cargo install cross
echo "CARGO=cross" >> $GITHUB_ENV
echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV
echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV
echo 'CARGO=cross' >> "$GITHUB_ENV"
echo 'TARGET_FLAGS=--target ${{ matrix.target }}' >> "$GITHUB_ENV"
echo 'TARGET_DIR=./target/${{ matrix.target }}' >> "$GITHUB_ENV"
- name: Show command used for Cargo
run: |
echo "cargo command is: ${{ env.CARGO }}"
echo "target flag is: ${{ env.TARGET_FLAGS }}"
echo "target dir is: ${{ env.TARGET_DIR }}"
echo 'cargo command is: ${{ env.CARGO }}'
echo 'target flag is: ${{ env.TARGET_FLAGS }}'
echo 'target dir is: ${{ env.TARGET_DIR }}'
- name: Get release download URL
uses: actions/download-artifact@v4
Expand All @@ -170,19 +161,15 @@ jobs:

- name: Set release upload URL and release version
run: |
release_upload_url="$(cat artifacts/release-upload-url)"
echo "RELEASE_UPLOAD_URL=$release_upload_url" >> $GITHUB_ENV
echo "release upload url: $RELEASE_UPLOAD_URL"
release_version="$(cat artifacts/release-version)"
echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV
echo "release version: $RELEASE_VERSION"
echo "UPLOAD_URL=$(< artifacts/release-upload-url)" >> "$GITHUB_ENV"
echo "VERSION=$(< artifacts/release-version)" >> "$GITHUB_ENV"
- name: Build release binary
run: ${{ env.CARGO }} build --verbose --release ${{ env.TARGET_FLAGS }} --no-default-features --features ${{ matrix.feature }}

- name: Strip release binary (linux and macos)
if: matrix.build == 'linux' || matrix.build == 'macos'
run: strip target/${{ matrix.target }}/release/ein target/${{ matrix.target }}/release/gix
run: strip 'target/${{ matrix.target }}/release/ein' 'target/${{ matrix.target }}/release/gix'

- name: Strip release binary (arm)
if: matrix.build == 'linux-arm'
Expand All @@ -193,31 +180,32 @@ jobs:
arm-linux-gnueabihf-strip \
/target/arm-unknown-linux-gnueabihf/release/ein \
/target/arm-unknown-linux-gnueabihf/release/gix
- name: Build archive
run: |
staging="gitoxide-${{ matrix.feature }}-${{ env.RELEASE_VERSION }}-${{ matrix.target }}"
mkdir -p "$staging"
staging='gitoxide-${{ matrix.feature }}-${{ env.VERSION }}-${{ matrix.target }}'
mkdir -p -- "$staging"
cp {README.md,LICENSE-*,CHANGELOG.md} "$staging/"
if [ "${{ matrix.os }}" = "windows-latest" ]; then
file target/${{ matrix.target }}/release/ein.exe target/${{ matrix.target }}/release/gix.exe
cp target/${{ matrix.target }}/release/ein.exe target/${{ matrix.target }}/release/gix.exe "$staging/"
if [ '${{ matrix.os }}' = 'windows-latest' ]; then
file 'target/${{ matrix.target }}/release/ein.exe' 'target/${{ matrix.target }}/release/gix.exe'
cp 'target/${{ matrix.target }}/release/ein.exe' 'target/${{ matrix.target }}/release/gix.exe' "$staging/"
7z a "$staging.zip" "$staging"
echo "ASSET=$staging.zip" >> $GITHUB_ENV
echo "ASSET=$staging.zip" >> "$GITHUB_ENV"
else
file target/${{ matrix.target }}/release/ein target/${{ matrix.target }}/release/gix
cp target/${{ matrix.target }}/release/ein target/${{ matrix.target }}/release/gix "$staging/"
file 'target/${{ matrix.target }}/release/ein' 'target/${{ matrix.target }}/release/gix'
cp 'target/${{ matrix.target }}/release/ein' 'target/${{ matrix.target }}/release/gix' "$staging/"
tar czf "$staging.tar.gz" "$staging"
echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV
echo "ASSET=$staging.tar.gz" >> "$GITHUB_ENV"
fi
- name: Upload release archive
uses: actions/upload-release-asset@v1.0.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ env.RELEASE_UPLOAD_URL }}
upload_url: ${{ env.UPLOAD_URL }}
asset_path: ${{ env.ASSET }}
asset_name: ${{ env.ASSET }}
asset_content_type: application/octet-stream

0 comments on commit 286e388

Please sign in to comment.