Commit Bot #10229
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Commit Bot | |
# Instructions | |
# | |
# - One-time setup: create a personal access token with permissions. Then configure it here | |
# as secrets.CI_PAT. https://github.com/boostorg/boost/settings/secrets/actions | |
# The reason is explained in https://github.com/orgs/community/discussions/25702 | |
# "If an action pushes code using the repository's GITHUB_TOKEN, a new workflow will not run" | |
# | |
# - Processing of either the 'master' or 'develop' branch may be stopped by creating the variables | |
# vars.block_master or vars.block_develop with any value. | |
# https://github.com/boostorg/boost/settings/variables/actions | |
# | |
# To avoid infinite loops, don't trigger on "push" | |
on: | |
schedule: | |
- cron: "0,30 * * * *" | |
concurrency: | |
group: ${{format('commit-bot-{0}:{1}', github.repository, github.ref)}} | |
cancel-in-progress: true | |
jobs: | |
update-modules: | |
runs-on: ubuntu-latest | |
name: Commit Bot | |
if: github.repository == 'boostorg/boost' | |
steps: | |
- name: Check for module updates | |
id: branches | |
run: | | |
set -xe | |
branches="" | |
if [[ "${{ github.event_name }}" == "push" ]]; then | |
if [[ ! -n "${{ vars.block_master }}" && "${{ github.ref_name }}" == "master" ]]; then | |
branches="master" | |
elif [[ ! -n "${{ vars.block_develop }}" && "${{ github.ref_name }}" == "develop" ]]; then | |
branches="develop" | |
else | |
branches="${{ github.ref_name }}" | |
fi | |
else | |
# from a schedule: | |
if [[ ! -n "${{ vars.block_master }}" ]]; then | |
branches="master" | |
fi | |
if [[ ! -n "${{ vars.block_develop }}" ]]; then | |
branches="${branches} develop" | |
fi | |
fi | |
echo "branches=$branches" >> $GITHUB_OUTPUT | |
- name: Checkout master repository | |
uses: actions/checkout@v4 | |
if: contains(steps.branches.outputs.branches, 'master') | |
with: | |
ref: master | |
path: master | |
persist-credentials: false | |
- name: Checkout develop repository | |
uses: actions/checkout@v4 | |
if: contains(steps.branches.outputs.branches, 'develop') | |
with: | |
ref: develop | |
path: develop | |
persist-credentials: false | |
- name: Check for module updates | |
run: | | |
branches="${{ steps.branches.outputs.branches }}" | |
# Set up Git | |
git config --global user.name "boost-commitbot" | |
git config --global user.email "boost-commitbot@example.com" | |
# Update each branch | |
for branch in $branches; do | |
cd $branch | |
module_paths=$(git config --file .gitmodules --get-regexp '^submodule\..*\.path$') | |
while IFS=' ' read -r key path; do | |
submodule_name=$(echo "$key" | awk -F '.' '{print $2}') | |
submodule_path=$(echo "$path") | |
url=$(git config --file .gitmodules --get-regexp "^submodule\.$submodule_name\.url$" | awk '{print $2}') | |
if [[ ! "$url" =~ ^https:// ]]; then | |
basicreponame=$(basename $url) | |
url=${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY_OWNER}/${basicreponame} | |
fi | |
hash=$(git ls-remote "$url" "refs/heads/$branch" | cut -f 1) | |
hash="${hash#"${hash%%[![:space:]]*}"}" | |
hash="${hash%"${hash##*[![:space:]]}"}" | |
commit_id="${hash:0:8}" | |
previous_hash=$(git ls-tree HEAD "$submodule_path" | awk '{print $3}') | |
previous_hash="${previous_hash#"${previous_hash%%[![:space:]]*}"}" | |
previous_hash="${previous_hash%"${previous_hash##*[![:space:]]}"}" | |
previous_commit_id="${previous_hash:0:8}" | |
if [ "$hash" == "$previous_hash" ]; then | |
echo "$submodule_name ($commit_id): OK" | |
else | |
echo "$submodule_name: $previous_commit_id -> $commit_id" | |
set -x | |
set +e | |
git submodule update --init "$submodule_path" | |
git submodule update --remote "$submodule_path" | |
git add "$submodule_path" | |
git commit -m "Update $submodule_name from $branch" | |
set -e | |
set +x | |
fi | |
done <<< "$module_paths" | |
cd .. | |
done | |
- name: Push changes from master | |
uses: ad-m/github-push-action@v0.8.0 | |
if: contains(steps.branches.outputs.branches, 'master') | |
with: | |
# github_token: ${{ secrets.GITHUB_TOKEN }} | |
github_token: ${{ secrets.CI_PAT }} | |
branch: master | |
directory: master | |
- name: Push changes from develop | |
uses: ad-m/github-push-action@v0.8.0 | |
if: contains(steps.branches.outputs.branches, 'develop') | |
with: | |
# github_token: ${{ secrets.GITHUB_TOKEN }} | |
github_token: ${{ secrets.CI_PAT }} | |
branch: develop | |
directory: develop |