291 lines
11 KiB
YAML
291 lines
11 KiB
YAML
name: Dispatch build bottle (for chosen OS versions)
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
runner:
|
|
description: Build runner(s) (macOS version or Linux)
|
|
required: true
|
|
formula:
|
|
description: Formula name
|
|
required: true
|
|
timeout:
|
|
description: "Build timeout (in minutes, default: 60 minutes)"
|
|
default: "60"
|
|
required: true
|
|
issue:
|
|
description: Issue number, where comment on failure would be posted
|
|
required: false
|
|
upload:
|
|
description: "Whether to upload built bottles or not (default: false)"
|
|
required: false
|
|
wheezy:
|
|
description: Whether to build the bottle in Debian Wheezy container
|
|
required: false
|
|
|
|
env:
|
|
HOMEBREW_DEVELOPER: 1
|
|
HOMEBREW_GITHUB_ACTIONS: 1
|
|
HOMEBREW_NO_AUTO_UPDATE: 1
|
|
HOMEBREW_CHANGE_ARCH_TO_ARM: 1
|
|
|
|
jobs:
|
|
prepare:
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
runners: ${{steps.runner-matrix.outputs.result}}
|
|
steps:
|
|
- name: Prepare runner matrix
|
|
id: runner-matrix
|
|
uses: actions/github-script@v5
|
|
with:
|
|
script: |
|
|
return context.payload.inputs.runner.split(",")
|
|
.map(s => s.trim())
|
|
.filter(Boolean);
|
|
bottle:
|
|
needs: prepare
|
|
strategy:
|
|
matrix:
|
|
runner: ${{fromJson(needs.prepare.outputs.runners)}}
|
|
runs-on: ${{matrix.runner}}
|
|
timeout-minutes: ${{fromJson(github.event.inputs.timeout)}}
|
|
defaults:
|
|
run:
|
|
shell: /bin/bash -e {0}
|
|
env:
|
|
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
|
HOMEBREW_GITHUB_API_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
|
steps:
|
|
- name: ${{github.event.inputs.formula}}
|
|
id: print_details
|
|
run: |
|
|
echo sender=${{github.event.sender.login}}
|
|
echo formula=${{github.event.inputs.formula}}
|
|
echo runner=${{github.event.inputs.runner}}
|
|
echo timeout=${{github.event.inputs.timeout}}
|
|
echo issue=${{github.event.inputs.issue}}
|
|
echo upload=${{github.event.inputs.upload}}
|
|
echo wheezy=${{github.event.inputs.wheezy}}
|
|
|
|
- name: Set environment variables
|
|
if: runner.os == 'macOS'
|
|
run: |
|
|
echo 'PATH=/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin' >> $GITHUB_ENV
|
|
# TODO: remove the line below once set in the runner .env file
|
|
echo 'GITHUB_ACTIONS_HOMEBREW_SELF_HOSTED=1' >> $GITHUB_ENV
|
|
|
|
- name: Run Docker container
|
|
if: runner.os == 'Linux'
|
|
env:
|
|
TAP_PATH: /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-core
|
|
run: |
|
|
docker run \
|
|
--detach \
|
|
--user linuxbrew \
|
|
--name ${{github.sha}} \
|
|
--env-file <(env | egrep 'HOMEBREW|GITHUB') \
|
|
--workdir /tmp/bottles \
|
|
--pull always \
|
|
${{github.event.inputs.wheezy && 'homebrew/debian7:latest' || 'ghcr.io/homebrew/ubuntu16.04:master'}} \
|
|
sleep inf
|
|
# Fix working directory permissions
|
|
docker exec --user root ${{github.sha}} chmod 777 /tmp/bottles
|
|
|
|
docker exec --workdir "$TAP_PATH" ${{github.sha}} git remote set-url origin ${{github.event.repository.html_url}}
|
|
docker exec --workdir "$TAP_PATH" ${{github.sha}} git fetch origin ${{github.sha}} '+refs/heads/*:refs/remotes/origin/*'
|
|
docker exec --workdir "$TAP_PATH" ${{github.sha}} git remote set-head origin --auto
|
|
docker exec --workdir "$TAP_PATH" ${{github.sha}} git checkout --force -B master FETCH_HEAD
|
|
|
|
- name: Set up Homebrew
|
|
id: set-up-homebrew
|
|
if: runner.os == 'macOS'
|
|
uses: Homebrew/actions/setup-homebrew@master
|
|
|
|
- if: runner.os == 'macOS'
|
|
run: brew test-bot --only-cleanup-before
|
|
|
|
- name: Run brew test-bot --only-setup
|
|
run: |
|
|
if [ "$RUNNER_OS" = 'macOS' ]; then
|
|
brew test-bot --only-setup
|
|
else
|
|
docker exec ${{github.sha}} brew test-bot --only-setup
|
|
fi
|
|
|
|
- name: Run brew test-bot --only-formulae --keep-old --only-json-tab --skip-online-checks --skip-dependents ${{github.event.inputs.formula}}
|
|
run: |
|
|
if [ "$RUNNER_OS" = 'macOS' ]; then
|
|
mkdir bottles
|
|
cd bottles
|
|
brew test-bot --only-formulae --keep-old --only-json-tab --skip-online-checks --skip-dependents ${{github.event.inputs.formula}}
|
|
else
|
|
docker exec ${{github.sha}} brew test-bot --only-formulae --keep-old --only-json-tab --skip-online-checks --skip-dependents ${{github.event.inputs.formula}}
|
|
fi
|
|
|
|
- name: Copy bottles from container
|
|
if: always() && runner.os == 'Linux'
|
|
run: docker cp ${{github.sha}}:/tmp/bottles .
|
|
|
|
- name: Failures summary for brew test-bot --only-formulae
|
|
if: always()
|
|
run: |
|
|
touch bottles/steps_output.txt
|
|
cat bottles/steps_output.txt
|
|
rm bottles/steps_output.txt
|
|
|
|
- name: Output brew bottle result
|
|
if: always()
|
|
run: |
|
|
cat bottles/bottle_output.txt
|
|
rm bottles/bottle_output.txt
|
|
|
|
- name: Upload logs
|
|
if: always()
|
|
uses: actions/upload-artifact@main
|
|
with:
|
|
name: logs
|
|
path: bottles/logs
|
|
|
|
- name: Delete logs and home
|
|
if: always()
|
|
run: |
|
|
rm -rvf bottles/logs
|
|
rm -rvf bottles/home
|
|
|
|
- name: Count bottles
|
|
id: bottles
|
|
if: always()
|
|
run: |
|
|
cd bottles
|
|
count=$(ls *.json | wc -l | xargs echo -n)
|
|
echo "$count bottles"
|
|
echo "::set-output name=count::$count"
|
|
failures=$(ls failed/*.json | wc -l | xargs echo -n)
|
|
echo "$failures failed bottles"
|
|
echo "::set-output name=failures::$failures"
|
|
|
|
- name: Upload failed bottles
|
|
if: always() && steps.bottles.outputs.failures > 0
|
|
uses: actions/upload-artifact@main
|
|
with:
|
|
name: bottles-${{ matrix.runner }}
|
|
path: bottles/failed
|
|
|
|
# Must be run before the `Upload bottles` step so that failed
|
|
# bottles are not included in the `bottles` artifact.
|
|
- name: Delete failed bottles
|
|
if: always()
|
|
run: rm -rvf bottles/failed
|
|
|
|
- name: Upload bottles to GitHub Actions
|
|
if: always() && steps.bottles.outputs.count > 0
|
|
uses: actions/upload-artifact@main
|
|
with:
|
|
name: bottles
|
|
path: bottles
|
|
|
|
- name: Post cleanup
|
|
if: always()
|
|
run: |
|
|
if [ "$RUNNER_OS" = 'Linux' ]; then
|
|
docker rm -f ${{github.sha}}
|
|
else
|
|
brew test-bot --only-cleanup-after
|
|
fi
|
|
rm -rvf bottles
|
|
|
|
- name: Post comment on failure
|
|
if: ${{!success() && github.event.inputs.issue > 0}}
|
|
uses: Homebrew/actions/post-comment@master
|
|
with:
|
|
token: ${{secrets.HOMEBREW_GITHUB_PUBLIC_REPO_TOKEN}}
|
|
issue: ${{github.event.inputs.issue}}
|
|
body: ":x: @${{github.actor}} bottle request for ${{github.event.inputs.formula}} [failed](${{github.event.repository.html_url}}/actions/runs/${{github.run_id}})."
|
|
bot_body: ":x: Bottle request for ${{github.event.inputs.formula}} [failed](${{github.event.repository.html_url}}/actions/runs/${{github.run_id}})."
|
|
bot: BrewTestBot
|
|
upload:
|
|
runs-on: ubuntu-latest
|
|
needs: bottle
|
|
if: github.event.inputs.upload
|
|
env:
|
|
HOMEBREW_SIMULATE_MACOS_ON_LINUX: 1
|
|
steps:
|
|
- name: Set up Homebrew
|
|
id: set-up-homebrew
|
|
uses: Homebrew/actions/setup-homebrew@master
|
|
|
|
- name: Download bottles from GitHub Actions
|
|
uses: actions/download-artifact@main
|
|
with:
|
|
name: bottles
|
|
path: ~/bottles/
|
|
|
|
# Workaround until the `cache` action uses the changes from
|
|
# https://github.com/actions/toolkit/pull/580.
|
|
- name: Unlink workspace
|
|
run: |
|
|
mv "${GITHUB_WORKSPACE}" "${GITHUB_WORKSPACE}-link"
|
|
mkdir "${GITHUB_WORKSPACE}"
|
|
|
|
- name: Cache gems
|
|
uses: actions/cache@v2
|
|
with:
|
|
path: ${{steps.set-up-homebrew.outputs.gems-path}}
|
|
key: ${{runner.os}}-rubygems-v2-${{steps.set-up-homebrew.outputs.gems-hash}}
|
|
restore-keys: ${{runner.os}}-rubygems-v2-
|
|
|
|
# Workaround until the `cache` action uses the changes from
|
|
# https://github.com/actions/toolkit/pull/580.
|
|
- name: Re-link workspace
|
|
run: |
|
|
rmdir "${GITHUB_WORKSPACE}"
|
|
mv "${GITHUB_WORKSPACE}-link" "${GITHUB_WORKSPACE}"
|
|
|
|
- name: Install gems
|
|
run: brew install-bundler-gems
|
|
|
|
- name: Configure Git user
|
|
uses: Homebrew/actions/git-user-config@master
|
|
|
|
- name: Set up commit signing
|
|
uses: Homebrew/actions/setup-commit-signing@master
|
|
with:
|
|
signing_key: ${{ secrets.BREWTESTBOT_GPG_SIGNING_SUBKEY }}
|
|
|
|
- name: Upload bottles to GitHub Packages
|
|
env:
|
|
HOMEBREW_GITHUB_PACKAGES_USER: brewtestbot
|
|
HOMEBREW_GITHUB_PACKAGES_TOKEN: ${{secrets.HOMEBREW_CORE_GITHUB_PACKAGES_TOKEN}}
|
|
HOMEBREW_GPG_PASSPHRASE: ${{ secrets.BREWTESTBOT_GPG_SIGNING_SUBKEY_PASSPHRASE }}
|
|
BREWTESTBOT_NAME_EMAIL: "BrewTestBot <1589480+BrewTestBot@users.noreply.github.com>"
|
|
run: |
|
|
cd ~/bottles
|
|
brew pr-upload --verbose --keep-old --committer="$BREWTESTBOT_NAME_EMAIL" --root-url="https://ghcr.io/v2/homebrew/core"
|
|
|
|
- name: Push commits
|
|
uses: Homebrew/actions/git-try-push@master
|
|
with:
|
|
token: ${{secrets.HOMEBREW_GITHUB_PUBLIC_REPO_TOKEN}}
|
|
env:
|
|
GIT_COMMITTER_NAME: BrewTestBot
|
|
GIT_COMMITTER_EMAIL: 1589480+BrewTestBot@users.noreply.github.com
|
|
HOMEBREW_GPG_PASSPHRASE: ${{ secrets.BREWTESTBOT_GPG_SIGNING_SUBKEY_PASSPHRASE }}
|
|
|
|
- name: Post comment on failure
|
|
if: ${{!success() && github.event.inputs.issue > 0}}
|
|
uses: Homebrew/actions/post-comment@master
|
|
with:
|
|
token: ${{secrets.HOMEBREW_GITHUB_PUBLIC_REPO_TOKEN}}
|
|
issue: ${{github.event.inputs.issue}}
|
|
body: ":x: @${{github.actor}} bottle request for ${{github.event.inputs.formula}} [failed](${{github.event.repository.html_url}}/actions/runs/${{github.run_id}})."
|
|
bot_body: ":x: Bottle request for ${{github.event.inputs.formula}} [failed](${{github.event.repository.html_url}}/actions/runs/${{github.run_id}})."
|
|
bot: BrewTestBot
|
|
|
|
# Workaround until the `cache` action uses the changes from
|
|
# https://github.com/actions/toolkit/pull/580.
|
|
- name: Unlink workspace
|
|
run: |
|
|
rm "${GITHUB_WORKSPACE}"
|
|
mkdir "${GITHUB_WORKSPACE}"
|