Skip to content

🔄 Sync with upstream #46

🔄 Sync with upstream

🔄 Sync with upstream #46

# 🔗 Links:
# Source file: https://github.com/rootstrap/react-native-template/blob/master/.github/workflows/sync-with-upstream.yml
# ✍️ Description:
# This workflow is used to keep the template up to date with the another version of the upstream repository.
# 🚨 GITHUB SECRETS REQUIRED:
# - UPDATE_FROM_UPSTREAM_PAT: A fine-grained Personal Access Token.
# This token is used to commit and push to the template repository.
# You can generate one from here: https://github.com/settings/tokens?type=beta
# Set the Repository access to "Only select repositories" and select the template repository.
# Set the following Repo permissions:
# - Contents: Read & write (to commit and push the update branch to the template repository)
# - Metadata: Read-only (mandatory by GitHub)
# - Workflows: Read and write (to create, update and delete workflows in the template repository)
# Make sure to add it to the repo secrets with the name UPDATE_FROM_UPSTREAM_PAT:
# - Go to Repository Settings > Secrets and variables > Actions > New repository secret
# - Name: UPDATE_FROM_UPSTREAM_PAT
# - Value: The Personal Access Token you created
# ℹ️ Environment variables:
# - UPSTREAM_REPOSITORY: Repository to sync with
# - DIFF_EXCLUDED_ROUTES: List of files or directories to exclude from the diff.
# Any changes in these files or directories will be ignored
# and won't be incorporated to the Pull Request.
name: 🔄 Sync with upstream
on:
schedule:
- cron: "0 12 * * 1-5" # At 12:00 UTC on every day-of-week from Monday through Friday
workflow_dispatch:
inputs:
upstream-version:
type: string
description: "Upstream release version to sync with (e.g. v1.0.0). Leave empty to sync with the latest release."
required: false
default: ""
env:
UPSTREAM_REPOSITORY: obytes/react-native-template-obytes
DIFF_EXCLUDED_ROUTES:
| # Files/directories we don't want from the upstream repository
ios
android
.cursorrules
.github/workflows/eas-build-prod.yml
.github/workflows/eas-build-qa.yml
.github/workflows/new-app-version.yml
.github/workflows/new-github-release.yml
docs/public/reviews
src/app/login.tsx
src/components/card.tsx
jobs:
sync:
runs-on: ubuntu-latest
permissions:
actions: write
contents: read
pull-requests: write
steps:
- name: Check if Personal Access Token exists
env:
PAT: ${{ secrets.UPDATE_FROM_UPSTREAM_PAT }}
if: env.PAT == ''
run: |
echo "UPDATE_FROM_UPSTREAM_PAT secret not found. Please create a fine-grained Personal Access Token following the instructions in the workflow file."
exit 1
- name: Checkout template repository
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.UPDATE_FROM_UPSTREAM_PAT }}
- name: Set upstream version to sync with
run: |
if [ -z "${{ inputs.upstream-version }}" ]; then
UPSTREAM_UPDATE_VERSION=$(curl -s https://api.github.com/repos/${{ env.UPSTREAM_REPOSITORY }}/releases/latest | jq '.tag_name' | sed 's/\"//g')
else
UPSTREAM_UPDATE_VERSION=${{ inputs.upstream-version }}
fi
echo "UPSTREAM_UPDATE_VERSION=$UPSTREAM_UPDATE_VERSION" >> $GITHUB_ENV
- name: Check if branch already exists
run: |
git fetch origin
BRANCH_NAME=update-upstream-${{ env.UPSTREAM_UPDATE_VERSION }}
echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
git branch -r | grep -q "origin/$BRANCH_NAME" && echo "BRANCH_EXISTS=true" >> $GITHUB_ENV || echo "BRANCH_EXISTS=false" >> $GITHUB_ENV
- name: Check if PR already exists
run: |
prs=$(gh pr list \
--head "$BRANCH_NAME" \
--json title \
--jq 'length')
if ((prs > 0)); then
echo "PR_EXISTS=true" >> $GITHUB_ENV
else
echo "PR_EXISTS=false" >> $GITHUB_ENV
fi
env:
GITHUB_TOKEN: ${{ secrets.UPDATE_FROM_UPSTREAM_PAT }}
- name: Checkout update release of upstream
if: ${{ env.BRANCH_EXISTS == 'false' }}
run: |
git remote add upstream https://github.com/${{ env.UPSTREAM_REPOSITORY }}.git
git fetch upstream $UPSTREAM_UPDATE_VERSION
- name: Merge latest release of upstream
if: ${{ env.BRANCH_EXISTS == 'false' }}
run: |
UPSTREAM_UPDATE_VERSION_HASH=$(git rev-parse --short FETCH_HEAD)
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
git config --global user.name "github-actions[bot]"
git merge $UPSTREAM_UPDATE_VERSION_HASH
continue-on-error: true
- name: Remove excluded files from the merge
if: ${{ env.BRANCH_EXISTS == 'false' }}
run: |
for route in $DIFF_EXCLUDED_ROUTES; do
git reset -- $route
done
- name: Commit and push changes to the update branch
if: ${{ env.BRANCH_EXISTS == 'false' }}
run: |
git add $(git diff --name-only --diff-filter=U)
git commit -m "chore: update upstream to ${{ env.UPSTREAM_UPDATE_VERSION }}" -n
git checkout -b ${{ env.BRANCH_NAME }}
git push origin ${{ env.BRANCH_NAME }}
git remote rm upstream
echo "BRANCH_EXISTS=true" >> $GITHUB_ENV
- name: 🎉 Create PR with changes
if: ${{ env.BRANCH_EXISTS == 'true' && env.PR_EXISTS == 'false' }}
run: |
gh pr create --title "chore: update upstream to ${{ env.UPSTREAM_UPDATE_VERSION }}" --body "Integrating latest changes from [obytes/react-native-template-obytes@${{ env.UPSTREAM_UPDATE_VERSION }}](https://github.com/obytes/react-native-template-obytes/releases/tag/${{ env.UPSTREAM_UPDATE_VERSION }})" --head ${{ env.BRANCH_NAME }}
env:
GITHUB_TOKEN: ${{ secrets.UPDATE_FROM_UPSTREAM_PAT }}