name: "Release integration" on: pull_request_review: types: [submitted] env: TARGETS: f7 DEFAULT_TARGET: f7 jobs: release: if: | github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name && endsWith(github.event.pull_request.title, ' Release Candidate Changes') && github.event.review.author_association == 'OWNER' && startsWith(github.event.pull_request.title, 'V') && github.event.pull_request.base.ref == 'main' && github.event.pull_request.head.ref == 'dev' && github.event.pull_request.state == 'open' && github.event.pull_request.draft == false && github.event.review.state == 'APPROVED' runs-on: ubuntu-latest permissions: contents: write steps: - name: 'Checkout code' uses: actions/checkout@v3 with: fetch-depth: 0 repository: ${{ github.event.pull_request.head.repo.full_name }} ref: ${{ github.event.pull_request.head.ref }} - name: "Update version number" run: | VERSION="$(python -c "print('%04d' % int('${{ github.event.pull_request.title }}'.removeprefix('V').removesuffix(' Release Candidate Changes')), end='')")" DATE="$(python -c "from datetime import date;print(date.today().strftime('%d%m%Y'), end='')")" RELEASE_NAME="XFW-${VERSION}" RELEASE_TAG="${RELEASE_NAME}_${DATE}" echo "RELEASE_TAG=${RELEASE_TAG}" >> $GITHUB_ENV sed "s/VERSION = \"XFW-[[:digit:]]\{4\}\"/VERSION = \"${RELEASE_NAME}\"/g" scripts/version.py > scripts/version.py.new rm scripts/version.py mv scripts/version.py.new scripts/version.py sed "s/DIST_SUFFIX = \"XFW-[[:digit:]]\{4\}_[[:digit:]]\{8\}\"/DIST_SUFFIX = \"${RELEASE_TAG}\"/g" fbt_options.py > fbt_options.py.new rm fbt_options.py mv fbt_options.py.new fbt_options.py - name: 'Build the firmware' run: | set -e for TARGET in ${TARGETS}; do TARGET="$(echo "${TARGET}" | sed 's/f//')"; \ ./fbt TARGET_HW=$TARGET updater_package done - name: "Make tgz, zip and webupdater" run: | cd dist/${DEFAULT_TARGET}-* mv ${DEFAULT_TARGET}-update-* ${RELEASE_TAG} tar --format=ustar -czvf ../${RELEASE_TAG}.tgz ${RELEASE_TAG} cd ${RELEASE_TAG} 7z a ../../${RELEASE_TAG}.zip . cd ../.. python -m pip install pyncclient WEBUPDATER_URL="$(python -c "import nextcloud_client as n;c = n.Client('https://cloud.cynthialabs.net/');c.login('${{ secrets.NC_USER }}', '${{ secrets.NC_PASS }}');c.put_file('XFW-Updater/${RELEASE_TAG}.tgz', '${RELEASE_TAG}.tgz');print(c.share_file_with_link('XFW-Updater/${RELEASE_TAG}.tgz').get_link().rstrip('/') + '/download/${RELEASE_TAG}.tgz', end='')")" echo "WEBUPDATER_URL=${WEBUPDATER_URL}" >> $GITHUB_ENV - name: "Update release notes" run: | python -c "import json, os;f = '.github/workflow_data/release.md';c = json.load(open(os.environ['GITHUB_EVENT_PATH']))['pull_request']['body'];f_ = open(f);n = f_.read().format(release_tag='${RELEASE_TAG}', webupdater_url='${WEBUPDATER_URL}', changelog=c);f_.close();f_ = open(f, 'w');f_.write(n);f_.close()" - name: "Commit new version number" uses: EndBug/add-and-commit@v9 id: commit with: default_author: github_actions message: Update version number add: 'fbt_options.py scripts/version.py' - name: "Wait for checks to pass" run: | pushed=${{ steps.commit.outputs.pushed }} echo "Commit was pushed: ${pushed}" $pushed sha="${{ steps.commit.outputs.commit_long_sha }}" echo "Pushed commit sha: ${sha}" echo "Waiting for PR head to sync" while [ "$new" != "$sha" ]; do sleep 1 new="$(curl -s "https://api.github.com/repos/${{ github.event.pull_request.base.repo.full_name }}/pulls/${{ github.event.pull_request.number }}" | jq -r ".head.sha")" echo "New PR head sha: ${new}" done echo "PR synced" echo "Finding required status checks" checks="$(curl -s "https://api.github.com/repos/${{ github.event.pull_request.base.repo.full_name }}/branches/${{ github.event.pull_request.base.ref }}" | jq -r ".protection.required_status_checks.contexts[]")" for check in $checks; do echo "Started waiting for check: ${check}" found=false while ! $found; do sleep 1 echo "Querying check suites" suites="$(curl -s "https://api.github.com/repos/${{ github.event.pull_request.head.repo.full_name }}/commits/${sha}/check-suites" | jq -r ".check_suites[].id")" for suite in $suites; do completed=false while ! $completed; do sleep 1 echo "Querying check suite: ${suite}" run="$(curl -s "https://api.github.com/repos/${{ github.event.pull_request.head.repo.full_name }}/check-suites/${suite}/check-runs" | jq -r '.check_runs[] | select(.name == "${check}")')" [ "$run" != "" ] || (echo "Check suite ${suite} does not match check: ${check}" && continue 2) found=true [ "$(echo "$run" | jq -r ".status")" = "completed" ] || (echo "Check suite ${suite} not complete yet" && sleep 10 && continue) completed=true echo "Check suite ${suite} completed" [ "$(echo "$run" | jq -r ".conclusion")" = "success" ] || (echo "Check failed: ${check}" && false) echo "Check passed: ${check}" continue 3 done done done done - name: "Merge pull request" uses: "pascalgn/automerge-action@v0.15.6" env: MERGE_LABELS: "" GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - name: "Make release" uses: softprops/action-gh-release@v1 with: body_path: ".github/workflow_data/release.md" draft: false prerelease: false files: | dist/${{ env.RELEASE_TAG }}.tgz dist/${{ env.RELEASE_TAG }}.zip name: "${{ env.RELEASE_TAG }}" tag_name: "${{ env.RELEASE_TAG }}" target_commitish: ${{ github.event.pull_request.base.ref }}