Test install script #1326
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: Test install script | |
on: | |
push: | |
paths: | |
- ".github/workflows/test-install-script.yml" | |
- "other/installation-script/install.sh" | |
pull_request: | |
paths: | |
- ".github/workflows/test-install-script.yml" | |
- "other/installation-script/install.sh" | |
schedule: | |
# Run every day at 03:00 UTC to catch breakage caused by external events | |
- cron: "0 3 * * *" | |
# workflow_dispatch event allows the workflow to be triggered manually. | |
# See: https://docs.github.com/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#workflow_dispatch | |
workflow_dispatch: | |
env: | |
SCRIPT_NAME: install.sh | |
SCRIPT_ARTIFACT_NAME: script | |
TOOL_NAME: arduino-lint # The executable's file name | |
jobs: | |
configure: | |
runs-on: ubuntu-latest | |
permissions: {} | |
env: | |
# Placeholder value of the PROJECT_OWNER variable in the template script | |
PROJECT_OWNER_PLACEHOLDER: arduino | |
# Replacement value used for the tests | |
PROJECT_OWNER: arduino | |
# Placeholder value of the PROJECT_NAME variable in the template script | |
PROJECT_NAME_PLACEHOLDER: TODO_PROJECT_NAME | |
# Replacement value used for the tests | |
PROJECT_NAME: arduino-lint | |
SCRIPT_FOLDER: other/installation-script | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Configure script for testing | |
run: | | |
sed \ | |
--in-place \ | |
's/PROJECT_OWNER="${{ env.PROJECT_OWNER_PLACEHOLDER }}"/PROJECT_OWNER="${{ env.PROJECT_OWNER }}"/' \ | |
"${{ env.SCRIPT_FOLDER }}/${{ env.SCRIPT_NAME }}" | |
sed \ | |
--in-place \ | |
's/PROJECT_NAME="${{ env.PROJECT_NAME_PLACEHOLDER }}"/PROJECT_NAME="${{ env.PROJECT_NAME }}"/' \ | |
"${{ env.SCRIPT_FOLDER }}/${{ env.SCRIPT_NAME }}" | |
- name: Save configured script as workflow artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
if-no-files-found: error | |
path: ${{ env.SCRIPT_FOLDER }}/${{ env.SCRIPT_NAME }} | |
name: ${{ env.SCRIPT_ARTIFACT_NAME }} | |
default: | |
needs: configure | |
permissions: {} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- ubuntu-latest | |
- windows-latest | |
- macos-latest | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Download script artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: ${{ env.SCRIPT_ARTIFACT_NAME }} | |
- name: Make script executable | |
run: chmod u+x "${{ github.workspace }}/${{ env.SCRIPT_NAME }}" | |
- name: Run script with defaults | |
shell: sh | |
run: | | |
"${{ github.workspace }}/${{ env.SCRIPT_NAME }}" | |
- name: Verify installation | |
shell: bash | |
run: | | |
"${PWD}/bin/${{ env.TOOL_NAME }}" --version | |
bindir: | |
needs: configure | |
permissions: {} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- ubuntu-latest | |
- windows-latest | |
- macos-latest | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Set install path environment variable | |
shell: bash | |
run: | | |
# See: https://docs.github.com/actions/writing-workflows/choosing-what-your-workflow-does/workflow-commands-for-github-actions#setting-an-environment-variable | |
echo "BINDIR=${{ runner.temp }}/custom-installation-folder" >> "$GITHUB_ENV" | |
- name: Download script artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: ${{ env.SCRIPT_ARTIFACT_NAME }} | |
- name: Make script executable | |
run: chmod u+x "${{ github.workspace }}/${{ env.SCRIPT_NAME }}" | |
- name: Run script with custom install location | |
shell: sh | |
run: | | |
mkdir -p "${{ env.BINDIR }}" | |
"${{ github.workspace }}/${{ env.SCRIPT_NAME }}" | |
- name: Verify installation | |
shell: bash | |
run: | | |
"${{ env.BINDIR }}/${{ env.TOOL_NAME }}" --version | |
version: | |
needs: configure | |
permissions: {} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- ubuntu-latest | |
- windows-latest | |
- macos-latest | |
runs-on: ${{ matrix.os }} | |
env: | |
VERSION: "1.0.0" | |
steps: | |
- name: Download script artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: ${{ env.SCRIPT_ARTIFACT_NAME }} | |
- name: Make script executable | |
run: chmod u+x "${{ github.workspace }}/${{ env.SCRIPT_NAME }}" | |
- name: Run script with version argument | |
shell: sh | |
run: | | |
"${{ github.workspace }}/${{ env.SCRIPT_NAME }}" "${{ env.VERSION }}" | |
- name: Verify installation | |
shell: bash | |
run: | | |
"${PWD}/bin/${{ env.TOOL_NAME }}" --version | grep --fixed-strings "${{ env.VERSION }}" | |
nightly: | |
needs: configure | |
permissions: {} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- ubuntu-latest | |
- windows-latest | |
- macos-latest | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Download script artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: ${{ env.SCRIPT_ARTIFACT_NAME }} | |
- name: Make script executable | |
run: chmod u+x "${{ github.workspace }}/${{ env.SCRIPT_NAME }}" | |
- name: Run script with nightly build version argument | |
shell: sh | |
run: | | |
"${{ github.workspace }}/${{ env.SCRIPT_NAME }}" "nightly-latest" | |
- name: Verify installation | |
shell: bash | |
run: | | |
"${PWD}/bin/${{ env.TOOL_NAME }}" --version | grep "^nightly-" | |
path-suggestions: | |
needs: configure | |
permissions: {} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- ubuntu-latest | |
- windows-latest | |
- macos-latest | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Set install path environment variables | |
shell: bash | |
run: | | |
# See: https://docs.github.com/actions/writing-workflows/choosing-what-your-workflow-does/workflow-commands-for-github-actions#setting-an-environment-variable | |
FIRST_INSTALLATION_FOLDER="first-installation-folder" | |
echo "FIRST_INSTALLATION_FOLDER=${FIRST_INSTALLATION_FOLDER}" >> "$GITHUB_ENV" | |
echo "FIRST_BINDIR=${{ runner.temp }}/${FIRST_INSTALLATION_FOLDER}" >> "$GITHUB_ENV" | |
SECOND_INSTALLATION_FOLDER="second-installation-folder" | |
echo "SECOND_INSTALLATION_FOLDER=${SECOND_INSTALLATION_FOLDER}" >> "$GITHUB_ENV" | |
echo "SECOND_BINDIR=${{ runner.temp }}/${SECOND_INSTALLATION_FOLDER}" >> "$GITHUB_ENV" | |
- name: Download script artifact | |
uses: actions/download-artifact@v4 | |
with: | |
name: ${{ env.SCRIPT_ARTIFACT_NAME }} | |
- name: Make script executable | |
run: chmod u+x "${{ github.workspace }}/${{ env.SCRIPT_NAME }}" | |
- name: Check script output without previous installation in PATH | |
shell: sh | |
env: | |
BINDIR: ${{ env.FIRST_BINDIR }} | |
run: | | |
mkdir -p "${{ env.BINDIR }}" | |
"${{ github.workspace }}/${{ env.SCRIPT_NAME }}" | \ | |
grep \ | |
-F \ | |
'${{ env.TOOL_NAME }} not found. You might want to add "${{ env.FIRST_BINDIR }}" to your $PATH' | |
- name: Add first installation to PATH | |
shell: bash | |
run: | | |
# See: https://docs.github.com/actions/writing-workflows/choosing-what-your-workflow-does/workflow-commands-for-github-actions#adding-a-system-path | |
echo "${{ env.FIRST_BINDIR }}" >> "$GITHUB_PATH" | |
- name: Check script output with previous installation in PATH (non-Windows) | |
if: runner.os != 'Windows' | |
shell: sh | |
env: | |
BINDIR: ${{ env.SECOND_BINDIR }} | |
run: | | |
mkdir -p "${{ env.BINDIR }}" | |
"${{ github.workspace }}/${{ env.SCRIPT_NAME }}" | \ | |
grep \ | |
-F \ | |
'${{ env.TOOL_NAME }} was found at ${{ env.FIRST_BINDIR }}/${{ env.TOOL_NAME }}. Please prepend "${{ env.BINDIR }}" to your $PATH' | |
# ${{ runner.temp }} is a Windows style path on the windows runner, but the script output uses the equivalent | |
# POSIX style path. | |
# So a regex is used for the output check on Windows. | |
- name: Check script output with previous installation in PATH (Windows) | |
if: runner.os == 'Windows' | |
shell: sh | |
env: | |
BINDIR: ${{ env.SECOND_BINDIR }} | |
run: | | |
mkdir -p "${{ env.BINDIR }}" | |
"${{ github.workspace }}/${{ env.SCRIPT_NAME }}" | \ | |
grep \ | |
'${{ env.TOOL_NAME }} was found at .*/${{ env.FIRST_INSTALLATION_FOLDER }}/${{ env.TOOL_NAME }}\. Please prepend ".*/${{ env.SECOND_INSTALLATION_FOLDER }}" to your \$PATH' |