Skip to content

Commit 8c4edb4

Browse files
committed
feat: upstream sync workflow V2
1 parent 9ed484a commit 8c4edb4

File tree

4 files changed

+136
-39
lines changed

4 files changed

+136
-39
lines changed

.github/project-workflows/sync-with-template.yml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@
66

77
# 🚨 GITHUB SECRETS REQUIRED:
88
# - UPDATE_FROM_TEMPLATE_PAT: A fine-grained Personal Access Token.
9-
# This token is used to access the project repository and create the Pull Request.
9+
# This token is used to commit and push to the project repository.
1010
# You can generate one from here: https://github.com/settings/tokens?type=beta
1111
# Set the Repository access to "Only select repositories" and select the project repository.
1212
# Set the following Repo permissions:
1313
# - Contents: Read & write (to commit and push the update branch to the project repository)
1414
# - Metadata: Read-only (mandatory by GitHub)
15-
# - Pull requests: Read & write (to create the Pull Request in the project repository)
1615
# - Workflows: Read and write (to create, update and delete workflows in the project repository)
1716
# Make sure to add it to the repo secrets with the name UPDATE_FROM_TEMPLATE_PAT:
1817
# - Go to Repository Settings > Secrets and variables > Actions > New repository secret
@@ -29,7 +28,7 @@ name: 🔄 Sync with template
2928

3029
on:
3130
schedule:
32-
- cron: '0 12 * * *' # Everyday at 12:00 UTC
31+
- cron: '0 12 * * 1-5' # At 12:00 UTC on every day-of-week from Monday through Friday
3332
workflow_dispatch:
3433

3534
env:
@@ -42,6 +41,7 @@ env:
4241
.github/workflows/deploy-docs.yml
4342
.github/workflows/new-template-version.yml
4443
.github/workflows/upstream-to-pr.yml
44+
.github/workflows/sync-with-template.yml
4545
README-project.md
4646
4747
jobs:
@@ -50,6 +50,7 @@ jobs:
5050
permissions:
5151
actions: write
5252
contents: read
53+
pull-requests: write
5354

5455
steps:
5556
- name: Check if Personal Access Token exists
@@ -71,7 +72,7 @@ jobs:
7172
- name: Get latest release of template from GitHub
7273
run: |
7374
echo "TEMPLATE_LATEST_VERSION=$(curl -s https://api.github.com/repos/${{ env.TEMPLATE_REPOSITORY }}/releases/latest | jq '.tag_name' | sed 's/\"//g')" >> $GITHUB_ENV
74-
- name: Check if the template is up to date
75+
- name: Check if the project is up to date
7576
run: |
7677
if [[ $TEMPLATE_LATEST_VERSION == $PROJECT_TEMPLATE_VERSION ]]; then
7778
echo "Template is up to date"
@@ -101,7 +102,7 @@ jobs:
101102
echo "PR_EXISTS=false" >> $GITHUB_ENV
102103
fi
103104
env:
104-
GITHUB_TOKEN: ${{ secrets.UPDATE_FROM_TEMPLATE_PAT }}
105+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
105106
- name: Install dependencies
106107
if: ${{ env.BRANCH_EXISTS == 'false' }}
107108
run: |
@@ -165,4 +166,4 @@ jobs:
165166
cd project
166167
gh pr create --title "chore: update template to ${{ env.TEMPLATE_LATEST_VERSION }}" --body "Integrating latest changes from [rootstrap/react-native-template@${{ env.TEMPLATE_LATEST_VERSION }}](https://github.com/rootstrap/react-native-template/releases/tag/${{ env.TEMPLATE_LATEST_VERSION }})" --head ${{ env.BRANCH_NAME }}
167168
env:
168-
GITHUB_TOKEN: ${{ secrets.UPDATE_FROM_TEMPLATE_PAT }}
169+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
# 🔗 Links:
2+
# Source file: https://github.com/rootstrap/react-native-template/blob/master/.github/workflows/sync-with-upstream.yml
3+
4+
# ✍️ Description:
5+
# This workflow is used to keep the template up to date with the another version of the upstream repository.
6+
7+
# 🚨 GITHUB SECRETS REQUIRED:
8+
# - UPDATE_FROM_UPSTREAM_PAT: A fine-grained Personal Access Token.
9+
# This token is used to commit and push to the template repository.
10+
# You can generate one from here: https://github.com/settings/tokens?type=beta
11+
# Set the Repository access to "Only select repositories" and select the template repository.
12+
# Set the following Repo permissions:
13+
# - Contents: Read & write (to commit and push the update branch to the template repository)
14+
# - Metadata: Read-only (mandatory by GitHub)
15+
# - Workflows: Read and write (to create, update and delete workflows in the template repository)
16+
# Make sure to add it to the repo secrets with the name UPDATE_FROM_UPSTREAM_PAT:
17+
# - Go to Repository Settings > Secrets and variables > Actions > New repository secret
18+
# - Name: UPDATE_FROM_UPSTREAM_PAT
19+
# - Value: The Personal Access Token you created
20+
21+
# ℹ️ Environment variables:
22+
# - UPSTREAM_REPOSITORY: Repository to sync with
23+
# - DIFF_EXCLUDED_ROUTES: List of files or directories to exclude from the diff.
24+
# Any changes in these files or directories will be ignored
25+
# and won't be incorporated to the Pull Request.
26+
27+
name: 🔄 Sync with upstream
28+
29+
on:
30+
schedule:
31+
- cron: '0 12 * * 1-5' # At 12:00 UTC on every day-of-week from Monday through Friday
32+
workflow_dispatch:
33+
inputs:
34+
upstream-version:
35+
type: string
36+
description: 'Upstream release version to sync with (e.g. v1.0.0). Leave empty to sync with the latest release.'
37+
required: false
38+
default: ''
39+
40+
env:
41+
UPSTREAM_REPOSITORY: obytes/react-native-template-obytes
42+
DIFF_EXCLUDED_ROUTES: |
43+
ios
44+
android
45+
46+
jobs:
47+
sync:
48+
runs-on: ubuntu-latest
49+
permissions:
50+
actions: write
51+
contents: read
52+
pull-requests: write
53+
54+
steps:
55+
- name: Check if Personal Access Token exists
56+
env:
57+
PAT: ${{ secrets.UPDATE_FROM_UPSTREAM_PAT }}
58+
if: env.PAT == ''
59+
run: |
60+
echo "UPDATE_FROM_UPSTREAM_PAT secret not found. Please create a fine-grained Personal Access Token following the instructions in the workflow file."
61+
exit 1
62+
- name: Checkout template repository
63+
uses: actions/checkout@v3
64+
with:
65+
fetch-depth: 0
66+
token: ${{ secrets.UPDATE_FROM_UPSTREAM_PAT }}
67+
- name: Set upstream version to sync with
68+
run: |
69+
if [ -z "${{ inputs.upstream-version }}" ]; then
70+
UPSTREAM_UPDATE_VERSION=$(curl -s https://api.github.com/repos/${{ env.UPSTREAM_REPOSITORY }}/releases/latest | jq '.tag_name' | sed 's/\"//g')
71+
else
72+
UPSTREAM_UPDATE_VERSION=${{ inputs.upstream-version }}
73+
fi
74+
echo "$UPSTREAM_UPDATE_VERSION=$$UPSTREAM_UPDATE_VERSION" >> $GITHUB_ENV
75+
- name: Check if branch already exists
76+
run: |
77+
git fetch origin
78+
BRANCH_NAME=update-upstream-${{ env.UPSTREAM_UPDATE_VERSION }}
79+
echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
80+
git branch -r | grep -q "origin/$BRANCH_NAME" && echo "BRANCH_EXISTS=true" >> $GITHUB_ENV || echo "BRANCH_EXISTS=false" >> $GITHUB_ENV
81+
- name: Check if PR already exists
82+
run: |
83+
prs=$(gh pr list \
84+
--head "$BRANCH_NAME" \
85+
--json title \
86+
--jq 'length')
87+
if ((prs > 0)); then
88+
echo "PR_EXISTS=true" >> $GITHUB_ENV
89+
else
90+
echo "PR_EXISTS=false" >> $GITHUB_ENV
91+
fi
92+
env:
93+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
94+
- name: Checkout latest release of upstream
95+
if: ${{ env.BRANCH_EXISTS == 'false' }}
96+
run: |
97+
git remote add upstream https://github.com/${{ env.UPSTREAM_REPOSITORY }}.git
98+
git fetch upstream $UPSTREAM_UPDATE_VERSION
99+
- name: Merge latest release of upstream
100+
if: ${{ env.BRANCH_EXISTS == 'false' }}
101+
run: |
102+
UPSTREAM_UPDATE_VERSION_HASH=$(git rev-parse --short FETCH_HEAD)
103+
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
104+
git config --global user.name "github-actions[bot]"
105+
git merge $UPSTREAM_UPDATE_VERSION_HASH
106+
continue-on-error: true
107+
- name: Remove excluded files from the merge
108+
if: ${{ env.BRANCH_EXISTS == 'false' }}
109+
run: |
110+
for route in $DIFF_EXCLUDED_ROUTES; do
111+
git reset -- $route
112+
done
113+
- name: Commit and push changes to the update branch
114+
if: ${{ env.BRANCH_EXISTS == 'false' }}
115+
run: |
116+
git add .
117+
git commit -m "chore: update upstream to ${{ env.UPSTREAM_UPDATE_VERSION }}"
118+
git checkout -b ${{ env.BRANCH_NAME }}
119+
git push origin ${{ env.BRANCH_NAME }}
120+
git remote rm upstream
121+
echo "BRANCH_EXISTS=true" >> $GITHUB_ENV
122+
- name: 🎉 Create PR with changes
123+
if: ${{ env.BRANCH_EXISTS == 'true' && env.PR_EXISTS == 'false' }}
124+
run: |
125+
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 }}
126+
env:
127+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.github/workflows/upstream-to-pr.yml

Lines changed: 0 additions & 22 deletions
This file was deleted.

cli/setup-project.js

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,6 @@ const updateProjectConfig = async (projectName) => {
9393
const updateGitHubWorkflows = (projectName) => {
9494
// Update useful workflows
9595
projectFilesManager.replaceFilesContent([
96-
{
97-
fileName: '.github/workflows/upstream-to-pr.yml',
98-
replacements: [
99-
{
100-
searchValue: UPSTREAM_REPOSITORY,
101-
replaceValue: TEMPLATE_REPOSITORY,
102-
},
103-
],
104-
},
10596
{
10697
fileName: '.github/workflows/new-template-version.yml',
10798
replacements: [
@@ -146,8 +137,8 @@ const updateGitHubWorkflows = (projectName) => {
146137
},
147138
]);
148139

149-
// Remove upstream update workflow, intended to be used only in the template repository
150-
projectFilesManager.removeFiles(['.github/workflows/upstream-to-pr.yml']);
140+
// Remove upstream sync workflow, intended to be used only in the template repository
141+
projectFilesManager.removeFiles(['.github/workflows/sync-with-upstream.yml']);
151142

152143
// Enable sync with template workflow
153144
projectFilesManager.renameFiles([

0 commit comments

Comments
 (0)