254 lines
9.6 KiB
YAML
254 lines
9.6 KiB
YAML
name: CI
|
||
|
||
on: pull_request
|
||
|
||
env:
|
||
HOMEBREW_DEVELOPER: 1
|
||
HOMEBREW_NO_AUTO_UPDATE: 1
|
||
HOMEBREW_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
|
||
jobs:
|
||
generate-matrix:
|
||
outputs:
|
||
matrix: ${{ steps.generate-matrix.outputs.matrix }}
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- name: Set up Homebrew
|
||
id: set-up-homebrew
|
||
uses: Homebrew/actions/setup-homebrew@master
|
||
with:
|
||
test-bot: false
|
||
|
||
- name: Check out Pull Request
|
||
uses: actions/checkout@v2
|
||
with:
|
||
fetch-depth: 0
|
||
persist-credentials: false
|
||
|
||
- name: Generate CI matrix
|
||
id: generate-matrix
|
||
run: |
|
||
brew ruby -- "$(brew --repository homebrew/cask)/cmd/lib/generate-matrix.rb" "${{ github.event.pull_request.url }}"
|
||
|
||
test:
|
||
name: ${{ matrix.name }}
|
||
needs: generate-matrix
|
||
runs-on: macos-latest
|
||
strategy:
|
||
matrix:
|
||
include: ${{ fromJson(needs.generate-matrix.outputs.matrix) }}
|
||
steps:
|
||
- name: Set up Homebrew
|
||
id: set-up-homebrew
|
||
uses: Homebrew/actions/setup-homebrew@master
|
||
with:
|
||
test-bot: false
|
||
|
||
- name: Check out Pull Request
|
||
uses: actions/checkout@v2
|
||
with:
|
||
fetch-depth: 0
|
||
persist-credentials: false
|
||
|
||
- name: Clean up CI machine
|
||
run: |
|
||
if ! brew list --cask visual-studio &>/dev/null; then
|
||
if ! rm -r '/Applications/Visual Studio.app'; then
|
||
echo '::warning::Removing Visual Studio is no longer necessary.'
|
||
fi
|
||
fi
|
||
|
||
if ! rm /usr/local/share/man/man1/al.1 || \
|
||
! sudo rm /etc/paths.d/mono-commands || \
|
||
! sudo rm -r /Library/Frameworks/Mono.framework || \
|
||
! sudo pkgutil --forget com.xamarin.mono-MDK.pkg; then
|
||
echo '::warning::Uninstalling Mono is no longer necessary.'
|
||
fi
|
||
|
||
if ! rm /usr/local/bin/dotnet; then
|
||
echo '::warning::Removing `dotnet` symlink is no longer necessary.'
|
||
fi
|
||
|
||
if ! rm /usr/local/bin/pod; then
|
||
echo '::warning::Removing `cocoapods` symlink is no longer necessary.'
|
||
fi
|
||
|
||
if brew tap-info adoptopenjdk/openjdk; then
|
||
brew untap adoptopenjdk/openjdk
|
||
else
|
||
echo '::warning::Untapping adoptopenjdk/openjdk is no longer necessary.'
|
||
fi
|
||
|
||
# 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 Homebrew Gems
|
||
uses: actions/cache@v2
|
||
with:
|
||
path: ${{ steps.set-up-homebrew.outputs.gems-path }}
|
||
key: ${{ runner.os }}-rubygems-${{ steps.set-up-homebrew.outputs.gems-hash }}
|
||
restore-keys: ${{ runner.os }}-rubygems-
|
||
|
||
# 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 Homebrew Gems
|
||
id: gems
|
||
run: brew install-bundler-gems
|
||
|
||
- name: Run brew style ${{ matrix.tap }}
|
||
run: brew style '${{ matrix.tap }}'
|
||
if: always() && steps.gems.outcome == 'success' && !matrix.cask
|
||
|
||
- name: Run brew fetch --cask ${{ matrix.cask.token }}
|
||
id: fetch
|
||
run: |
|
||
brew fetch --cask --retry --force '${{ matrix.cask.path }}'
|
||
timeout-minutes: 30
|
||
if: always() && steps.gems.outcome == 'success' && matrix.cask
|
||
|
||
- name: Run brew audit --cask${{ (matrix.cask && ' ') || ' --tap ' }}${{ matrix.cask.token || matrix.tap }}
|
||
id: audit
|
||
run: |
|
||
brew audit --cask ${{ join(matrix.audit_args, ' ') }}${{ (matrix.cask && ' ') || ' --tap ' }}'${{ matrix.cask.path || matrix.tap }}'
|
||
if: always() && steps.fetch.outcome == 'success' && !matrix.skip_audit
|
||
|
||
- name: Gather cask information
|
||
id: info
|
||
run: |
|
||
brew ruby <<'EOF'
|
||
require 'cask/cask_loader'
|
||
require 'cask/installer'
|
||
|
||
cask = Cask::CaskLoader.load('${{ matrix.cask.path }}')
|
||
|
||
was_installed = cask.installed?
|
||
manual_installer = cask.artifacts.any? { |artifact|
|
||
artifact.is_a?(Cask::Artifact::Installer::ManualInstaller)
|
||
}
|
||
|
||
macos_requirement_satisfied = if macos_requirement = cask.depends_on.macos
|
||
macos_requirement.satisfied?
|
||
else
|
||
true
|
||
end
|
||
|
||
cask_conflicts = cask.conflicts_with&.dig(:cask).to_a.select { |c| Cask::CaskLoader.load(c).installed? }
|
||
formula_conflicts = cask.conflicts_with&.dig(:formula).to_a.select { |f| Formula[f].any_version_installed? }
|
||
|
||
installer = Cask::Installer.new(cask)
|
||
cask_and_formula_dependencies = installer.missing_cask_and_formula_dependencies
|
||
|
||
cask_dependencies = cask_and_formula_dependencies.select { |d| d.is_a?(Cask::Cask) }.map(&:full_name)
|
||
formula_dependencies = cask_and_formula_dependencies.select { |d| d.is_a?(Formula) }.map(&:full_name)
|
||
|
||
puts "::set-output name=was_installed::#{JSON.generate(was_installed)}"
|
||
puts "::set-output name=manual_installer::#{JSON.generate(manual_installer)}"
|
||
puts "::set-output name=macos_requirement_satisfied::#{JSON.generate(macos_requirement_satisfied)}"
|
||
puts "::set-output name=cask_conflicts::#{JSON.generate(cask_conflicts)}"
|
||
puts "::set-output name=cask_dependencies::#{JSON.generate(cask_dependencies)}"
|
||
puts "::set-output name=formula_conflicts::#{JSON.generate(formula_conflicts)}"
|
||
puts "::set-output name=formula_dependencies::#{JSON.generate(formula_dependencies)}"
|
||
EOF
|
||
if: always() && steps.fetch.outcome == 'success' && matrix.cask
|
||
|
||
- name: Uninstall conflicting formulae
|
||
run: |
|
||
brew uninstall --formula ${{ join(fromJSON(steps.info.outputs.formula_conflicts), ' ') }}
|
||
if: always() && steps.info.outcome == 'success' && join(fromJSON(steps.info.outputs.formula_conflicts)) != ''
|
||
timeout-minutes: 30
|
||
|
||
- name: Uninstall conflicting casks
|
||
run: |
|
||
brew uninstall --cask ${{ join(fromJSON(steps.info.outputs.cask_conflicts), ' ') }}
|
||
if: always() && steps.info.outcome == 'success' && join(fromJSON(steps.info.outputs.cask_conflicts)) != ''
|
||
timeout-minutes: 30
|
||
|
||
- name: Run brew uninstall --cask --zap ${{ matrix.cask.token }}
|
||
run: |
|
||
brew uninstall --cask --zap '${{ matrix.cask.path }}'
|
||
if: always() && steps.info.outcome == 'success' && fromJSON(steps.info.outputs.was_installed)
|
||
timeout-minutes: 30
|
||
|
||
- name: Take snapshot of installed and running apps and services
|
||
id: snapshot
|
||
run: |
|
||
brew ruby -r "$(brew --repository homebrew/cask)/cmd/lib/check.rb" <<'EOF'
|
||
puts "::set-output name=before::#{JSON.generate(Check.all)}"
|
||
EOF
|
||
if: always() && steps.info.outcome == 'success'
|
||
|
||
- name: Run brew install --cask ${{ matrix.cask.token }}
|
||
id: install
|
||
run: brew install --cask '${{ matrix.cask.path }}'
|
||
if: >
|
||
always() && steps.info.outcome == 'success' &&
|
||
fromJSON(steps.info.outputs.macos_requirement_satisfied) &&
|
||
!matrix.skip_install
|
||
timeout-minutes: 30
|
||
env:
|
||
HOMEBREW_DEBUG: 1
|
||
|
||
- name: Run brew uninstall --cask ${{ matrix.cask.token }}
|
||
run: brew uninstall --cask '${{ matrix.cask.path }}'
|
||
if: always() && steps.install.outcome == 'success' && !fromJSON(steps.info.outputs.manual_installer)
|
||
timeout-minutes: 30
|
||
|
||
- name: Uninstall formula dependencies
|
||
run: |
|
||
brew uninstall --formula ${{ join(fromJSON(steps.info.outputs.formula_dependencies), ' ') }}
|
||
if: always() && steps.install.outcome == 'success' && join(fromJSON(steps.info.outputs.formula_dependencies)) != ''
|
||
timeout-minutes: 30
|
||
|
||
- name: Uninstall cask dependencies
|
||
run: |
|
||
brew uninstall --cask ${{ join(fromJSON(steps.info.outputs.cask_dependencies), ' ') }}
|
||
if: always() && steps.install.outcome == 'success' && join(fromJSON(steps.info.outputs.cask_dependencies)) != ''
|
||
timeout-minutes: 30
|
||
|
||
- name: Compare installed and running apps and services with snapshot
|
||
run: |
|
||
brew ruby -r "$(brew --repository homebrew/cask)/cmd/lib/check.rb" <<'EOF'
|
||
require "cask/cask_loader"
|
||
require "utils/github/actions"
|
||
|
||
before = JSON.parse(<<~'EOS').transform_keys(&:to_sym)
|
||
${{ steps.snapshot.outputs.before }}
|
||
EOS
|
||
after = Check.all
|
||
|
||
cask = Cask::CaskLoader.load('${{ matrix.cask.path }}')
|
||
errors = Check.errors(before, after, cask: cask)
|
||
|
||
errors.each do |error|
|
||
onoe error
|
||
puts GitHub::Actions::Annotation.new(:error, error, file: '${{ matrix.cask.path }}')
|
||
end
|
||
|
||
exit 1 if errors.any?
|
||
EOF
|
||
if: always() && steps.snapshot.outcome == 'success'
|
||
|
||
# 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}"
|
||
conclusion:
|
||
name: conclusion
|
||
needs: test
|
||
runs-on: ubuntu-latest
|
||
if: always()
|
||
steps:
|
||
- name: Result
|
||
run: ${{ needs.test.result == 'success' }}
|