Skip to content

Update bootstrap.sh

Update bootstrap.sh #5

Workflow file for this run

name: "lint & build changed ports"
on:
pull_request:
branches:
- master
paths-ignore:
- '.github/**'
push:
branches-ignore:
- master
permissions:
contents: read
jobs:
build:
name: ${{ matrix.os }}
timeout-minutes: 525600
concurrency:
cancel-in-progress: true
group: ${{ github.ref }}/${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macos-11, macos-12, macos-13, macos-14]
steps:
- name: Checkout ports
uses: actions/checkout@v3
with:
fetch-depth: 64
path: ports
- name: Checkout mpbb
uses: actions/checkout@v3
with:
repository: macports/mpbb
path: mpbb
- name: Bootstrap MacPorts
run: . ports/.github/workflows/bootstrap.sh
- name: Determine list of changed ports
id: portlist
run: |
set -eu
# Add getopt, mpbb and the MacPorts paths to $PATH for the subsequent
# steps.
# shellcheck disable=SC2129
echo "/opt/mports/bin" >> "${GITHUB_PATH}"
echo "${PWD}/mpbb" >> "${GITHUB_PATH}"
echo "/opt/local/bin" >> "${GITHUB_PATH}"
echo "/opt/local/sbin" >> "${GITHUB_PATH}"
portlist=$( \
git -C ports/ diff --name-only --diff-filter=AM macports/master...@ \
| grep -E '^[^._/][^/]*/[^/]+/(Portfile$|files/)' \
| cut -d/ -f2 \
| sort -u \
| tr '\n' ' ' \
| sed 's/ $//')
echo "${portlist}"
echo "portlist=${portlist}" >> "${GITHUB_OUTPUT}"
- name: Determine list of subports from portlist
id: subportlist
run: |
set -eu
echo "#### Changed Ports" >> "${GITHUB_STEP_SUMMARY}"
subportlist=""
echo "::group::Listing subports"
# shellcheck disable=SC2086
new_subports=$(mpbb \
--work-dir /tmp/mpbb \
list-subports \
--archive-site= \
--archive-site-private= \
--include-deps=no \
$portlist \
| tr '\n' ' ')
for subport in ${new_subports}; do
echo "${subport}"
echo "- ${subport}" >> "${GITHUB_STEP_SUMMARY}"
subportlist="${subportlist} ${subport}"
done
echo "::endgroup::"
echo "subportlist=${subportlist}" >> "${GITHUB_OUTPUT}"
env:
portlist: ${{ steps.portlist.outputs.portlist }}
- name: Run port lint for all changed subports
run: |
set -eu
echo "#### Lint Results" >> "${GITHUB_STEP_SUMMARY}"
fail=0
for subport in ${subportlist}; do
echo "::group::${subport}"
path=$(port file "${subport}")
messagetype="warning"
if ! messages=$(port -q lint "${subport}" 2>&1); then
messagetype="error"
fail=1
fi
if [ -n "${messages}" ]; then
echo "${messages}"
if [ "$fail" -eq 1 ]; then
echo "##### ❌ ${subport}" >> "${GITHUB_STEP_SUMMARY}"
else
echo "##### ⚠️ ${subport}" >> "${GITHUB_STEP_SUMMARY}"
fi
# shellcheck disable=SC2016
printf '```\n%s```\n' "$messages" >> "${GITHUB_STEP_SUMMARY}"
# See https://github.com/actions/toolkit/issues/193#issuecomment-605394935
encoded_messages="port lint ${subport}:%0A"
encoded_messages+="$(echo "${messages}" | sed -E 's/$/%0A/g' | tr -d '\n')"
echo "::${messagetype} file=${path#"${PWD}"/ports/},line=1,col=1::${encoded_messages}"
else
echo "##### ✅ ${subport}" >> "${GITHUB_STEP_SUMMARY}"
fi
echo "::endgroup::"
done
exit "${fail}"
env:
subportlist: ${{ steps.subportlist.outputs.subportlist }}
- name: Build changed subports
run: |
set -eu
echo "#### Build Results" >> "${GITHUB_STEP_SUMMARY}"
fail=0
for subport in ${subportlist}; do
workdir="/tmp/mpbb/${subport}"
mkdir -p "${workdir}/logs"
echo "##### ${subport}" >> "${GITHUB_STEP_SUMMARY}"
touch "${workdir}/logs/dependencies-progress.txt"
echo "::group::Cleaning up between ports"
sudo mpbb --work-dir "${workdir}" cleanup
echo "::endgroup::"
echo "::group::Installing dependencies for ${subport}"
# shellcheck disable=2024
sudo mpbb \
--work-dir "${workdir}" \
install-dependencies \
"${subport}" >"${workdir}/logs/install-dependencies.log" 2>&1 &
deps_pid=$!
tail -f "${workdir}/logs/dependencies-progress.txt" 2>/dev/null &
tail_pid=$!
set +e
wait "${deps_pid}"
deps_exit=$?
set -e
kill "${tail_pid}" || true
if [ "${deps_exit}" -ne 0 ]; then
echo "::endgroup::"
echo "::error::Failed to install dependencies for ${subport}"
echo "⚠️ Failed to install dependencies" >> "${GITHUB_STEP_SUMMARY}"
fail=1
continue
fi
echo "::endgroup::"
echo "::group::Installing ${subport}"
set +e
sudo mpbb \
--work-dir "${workdir}" \
install-port \
--source \
"$subport"
install_exit=$?
set -e
if [ "${install_exit}" -ne 0 ]; then
echo "::endgroup::"
echo "::error::Failed to install ${subport}"
echo "❌ Failed to install, see the log for more details" >> "${GITHUB_STEP_SUMMARY}"
lognum=0
# shellcheck disable=2044,2046
for logfile in $(find $(port work "${subport}") -name config.log \
-or -name CMakeError.log -or -name meson-log.txt); do
mkdir -p "${workdir}/logs/${lognum}"
echo "${logfile}" > "${workdir}/logs/${lognum}/path.txt"
cp "${logfile}" "${workdir}/logs/${lognum}/"
# shellcheck disable=2004
lognum=$(( $lognum + 1))
done
fail=1
continue
fi
echo "✅ Successfully built" >> "${GITHUB_STEP_SUMMARY}"
echo "::endgroup::"
echo "::group::Testing ${subport}"
test_fail=0
set +e
sudo mpbb \
--work-dir "${workdir}" \
test-port \
--builtin-only \
"${subport}"
test_exit=$?
set -e
if [ "${test_exit}" -ne 0 ]; then
echo "::endgroup::"
echo "::error::Tests failed for ${subport}"
echo "❌ Tests failed, see the log for more details" >> "${GITHUB_STEP_SUMMARY}"
# Not setting fail=1 as a 100% passing test suite is not considered
# essential to merge a PR.
test_fail=1
fi
test_msgs=$(port log --phase test --level warn "${subport}")
if [ -n "${test_msgs}" ]; then
echo "${test_msgs}"
echo "⚠️ Test warnings" >> "${GITHUB_STEP_SUMMARY}"
# shellcheck disable=2016
printf '```\n%s\n```\n' "${test_msgs}" >> "${GITHUB_STEP_SUMMARY}"
path=$(port file "${subport}")
# See https://github.com/actions/toolkit/issues/193#issuecomment-605394935
encoded_messages="port test ${subport}:%0A"
encoded_messages+="$(echo "${test_msgs}" | sed -E 's/$/%0A/g' | tr -d '\n')"
echo "::warning file=${path#"${PWD}"/ports/},line=1,col=1::${encoded_messages}"
elif [ ${test_fail} -eq 0 ]; then
echo "✅ Successfully tested" >> "${GITHUB_STEP_SUMMARY}"
fi
echo "::endgroup::"
done
exit "${fail}"
env:
subportlist: ${{ steps.subportlist.outputs.subportlist }}
- name: Make logfiles readable
if: always()
run: |
mkdir -p /tmp/mpbb
sudo find \
/tmp/mpbb \
-maxdepth 1 \
-mindepth 1 \
-type d \
-print \
-exec chmod -R go+rX {} \;
- name: Archive build logs
if: always()
uses: actions/upload-artifact@v4
with:
name: logs-${{ matrix.os }}.zip
path: /tmp/mpbb/*/logs