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