diff --git a/.github/workflows/adjust-maintainers.yml b/.github/workflows/adjust-maintainers.yml new file mode 100644 index 000000000..77b49feeb --- /dev/null +++ b/.github/workflows/adjust-maintainers.yml @@ -0,0 +1,128 @@ +name: "Sync maintainers status" + +# Script connects to the contacts database once per hour and updates BOARD_MAINTAINER property in the board config files. +# If there are any changes, it opens a Pull Request +# +# spdx-id: GPL-2.0-or-later +# copyright-owner: @igorpecovnik + +# Dependencies: lftp, jq + +on: + schedule: + - cron: "0 * * * *" + workflow_dispatch: + +jobs: + + Build: + name: "Maintainers sync" + runs-on: ubuntu-latest + if: ${{ github.repository_owner == 'armbian' }} + steps: + + - name: "Checkout build repo" + uses: actions/checkout@v4 + with: + repository: armbian/build + ref: main + fetch-depth: 0 + clean: false + + - name: "Install SSH key for storage" + uses: shimataro/ssh-key-action@v2 + with: + key: ${{ secrets.KEY_UPLOAD }} + known_hosts: ${{ secrets.KNOWN_HOSTS_ARMBIAN_UPLOAD }} + if_key_exists: replace + + - name: "Install dependencies" + run: | + + sudo apt-get -y -qq install jq + + - name: "Download JSON file" + run: | + + # download json that is prepared for this action in another cron job + rsync -e "ssh -p ${{ secrets.HOST_UPLOAD_PORT }}" -arvc ${{ secrets.HOST_UPLOAD_USER }}@${{ secrets.HOST_UPLOAD }}:/incoming/json/armbian_maintainers.json /tmp/ + + - name: "Update maintainers" + run: | + + # reset all maintainers so we generate from scratch + sed -i "s/BOARD_MAINTAINER.*/BOARD_MAINTAINER=\"\"/" config/boards/*.{conf,wip,eos,tvb} + + # extract values fron JSON + declare -A MAINTAINERS + { + # By default, bash run the pipe command in subshells + # which make variable can't be assigned to. + # And yes, lastpipe can solve it + # But this is better. + while read -r i; do + NAME="$(echo "$i" | jq --raw-output '.First_Name')" + BOARD="$(echo "$i" | jq --raw-output '.Maintaining')" + MAINTAINER_GITHUB="$(echo "$i" | jq --raw-output '.Github' | cut -d"/" -f4)" + if [[ "$BOARD" != null && "$MAINTAINER_GITHUB" != null ]]; then + echo "- [$NAME](https://github.com/${MAINTAINER_GITHUB})" + while read -r i; do + echo -e " - $i" + MAINTAINERS["$i"]+="$MAINTAINER_GITHUB " + done < <( echo "$BOARD" | sed "s/,/\n/g" | sort -u ) + fi + done < <(jq -c '.[]' /tmp/armbian_maintainers.json) + + for cfg in config/boards/*.{conf,wip,csc,eos,tvb}; do + board_name="$(echo "${cfg##*/}" | sed -E 's/\..*//')" + declare -a maintainers + readarray -t maintainers < <(echo "${MAINTAINERS[${board_name}]}" | xargs -n1 | sort -u) + sed -i "s/BOARD_MAINTAINER=.*/BOARD_MAINTAINER=\"${maintainers[*]}\"/" "${cfg}" + done + } >> "$GITHUB_STEP_SUMMARY" + + - name: "Mark csc for no maintainer" + run: | + + grep BOARD_MAINTAINER=\"\" config/boards/*.{wip,conf} | cut -d":" -f1 | + while read -r line; do + if [[ "${line}" != "${line/.conf/.csc}" ]]; then + mv -v "$line" "${line/.conf/.csc}" + fi + if [[ "${line}" != "${line/.wip/.csc}" ]]; then + mv -v "$line" "${line/.wip/.csc}" + fi + done + + - name: "Re-generate CODEOWNERS" + run: | + + ./.github/generate_CODEOWNERS.sh + + - name: Create Pull Request + id: cpr + uses: peter-evans/create-pull-request@v6 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: '`Automatic` board configs status synchronise' + signoff: false + branch: update-maintainers + delete-branch: true + title: '`Automatic` board configs status synchronise' + body: | + Update maintainers and board status + + - synced status from the database + - rename to .`csc` where we don't have anyone + + If you want to become a board maintainer, [adjust data here](https://www.armbian.com/update-data/). + + Ref: + - [Board Maintainers Procedures and Guidelines](https://docs.armbian.com/Board_Maintainers_Procedures_and_Guidelines/) + - [Contribute](https://docs.armbian.com/Process_Contribute/) + + labels: | + Needs review + #assignees: igorpecovnik + #reviewers: Must be org collaborator + draft: false