forked from obytes/react-native-template-obytes
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathsync-with-template.yml
More file actions
180 lines (172 loc) · 8.05 KB
/
sync-with-template.yml
File metadata and controls
180 lines (172 loc) · 8.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# 🔗 Links:
# Source file: https://github.com/rootstrap/react-native-template/blob/master/.github/project-workflows/sync-with-template.yml
# ✍️ Description:
# This workflow is used to keep the project up to date with the latest version of the template.
# 🚨 GITHUB SECRETS REQUIRED:
# - UPDATE_FROM_TEMPLATE_PAT: A fine-grained Personal Access Token.
# This token is used to commit and push to the project 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 project repository.
# Set the following Repo permissions:
# - Contents: Read & write (to commit and push the update branch to the project repository)
# - Metadata: Read-only (mandatory by GitHub)
# - Workflows: Read and write (to create, update and delete workflows in the project repository)
# Make sure to add it to the repo secrets with the name UPDATE_FROM_TEMPLATE_PAT:
# - Go to Repository Settings > Secrets and variables > Actions > New repository secret
# - Name: UPDATE_FROM_TEMPLATE_PAT
# - Value: The Personal Access Token you created
# ℹ️ Environment variables:
# - TEMPLATE_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 template
on:
schedule:
- cron: '0 12 * * 1-5' # At 12:00 UTC on every day-of-week from Monday through Friday
workflow_dispatch:
inputs:
template-version:
type: string
description: 'Template release version to sync with (e.g. v1.0.0). Leave empty to sync with the latest release.'
required: false
default: ''
env:
TEMPLATE_REPOSITORY: rootstrap/react-native-template
DIFF_EXCLUDED_ROUTES: |
cli
docs
ios
android
.github/workflows/deploy-docs.yml
.github/workflows/new-template-version.yml
.github/workflows/upstream-to-pr.yml
.github/workflows/sync-with-upstream.yml
README-project.md
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_TEMPLATE_PAT }}
if: env.PAT == ''
run: |
echo "UPDATE_FROM_TEMPLATE_PAT secret not found. Please create a fine-grained Personal Access Token following the instructions in the workflow file."
exit 1
- name: Checkout project repository
uses: actions/checkout@v4
with:
fetch-depth: 0
path: project
token: ${{ secrets.UPDATE_FROM_TEMPLATE_PAT }}
- name: Get template version used in project from package.json
run: |
echo "PROJECT_TEMPLATE_VERSION=v$(jq -r 'if has("rsMetadata") then .rsMetadata.templateVersion else .osMetadata.initVersion end' project/package.json | sed 's/^.*@//')" >> $GITHUB_ENV
- name: Set template version to sync with
run: |
if [ -z "${{ inputs.template-version }}" ]; then
TEMPLATE_UPDATE_VERSION=$(curl -s https://api.github.com/repos/${{ env.TEMPLATE_REPOSITORY }}/releases/latest | jq '.tag_name' | sed 's/\"//g')
else
TEMPLATE_UPDATE_VERSION=${{ inputs.template-version }}
fi
echo "TEMPLATE_UPDATE_VERSION=$TEMPLATE_UPDATE_VERSION" >> $GITHUB_ENV
- name: Check if the project is up to date
run: |
if [[ $TEMPLATE_UPDATE_VERSION == $PROJECT_TEMPLATE_VERSION ]]; then
echo "Template is up to date"
cd project
gh run cancel ${{ github.run_id }}
gh run watch ${{ github.run_id }}
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Check if branch already exists
run: |
cd project
git fetch origin
BRANCH_NAME=update-template-${{ env.TEMPLATE_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: |
cd project
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.GITHUB_TOKEN }}
- name: Install dependencies
if: ${{ env.BRANCH_EXISTS == 'false' }}
run: |
sudo apt install wiggle
- name: Checkout update release of template
if: ${{ env.BRANCH_EXISTS == 'false' }}
uses: actions/checkout@v4
with:
repository: ${{ env.TEMPLATE_REPOSITORY }}
ref: ${{ env.TEMPLATE_UPDATE_VERSION }}
fetch-depth: 0
path: react-native-template
- name: Get diff between latest release and used release
if: ${{ env.BRANCH_EXISTS == 'false' }}
run: |
EXCLUDED_ROUTES=""
for route in $DIFF_EXCLUDED_ROUTES; do
EXCLUDED_ROUTES="$EXCLUDED_ROUTES ':(exclude)$route'"
done
cd react-native-template
git diff ${{ env.PROJECT_TEMPLATE_VERSION }} -- . $(echo $EXCLUDED_ROUTES | xargs) > ../update.patch
- name: Update template version in package.json
if: ${{ env.BRANCH_EXISTS == 'false' }}
run: |
cd project
jq 'del(.osMetadata)' package.json > tmp.json && mv tmp.json package.json
PLAIN_VERSION=${TEMPLATE_UPDATE_VERSION#v}
jq --arg version $PLAIN_VERSION '.rsMetadata.templateVersion = $version' package.json > tmp.json && mv tmp.json package.json
- name: Apply diff to project repository
if: ${{ env.BRANCH_EXISTS == 'false' }}
run: |
cd project
git apply --reject ../update.patch
continue-on-error: true
- name: Solve conflicts with wiggle
if: ${{ env.BRANCH_EXISTS == 'false' }}
run: |
cd project
find . -iname '*.rej' -exec sh -c 'printf "%s\n" "${0%.*}"' {} ';' | xargs -I _ wiggle --replace --merge _ _.rej
continue-on-error: true
- name: Remove wiggle's backup and .rej files
if: ${{ env.BRANCH_EXISTS == 'false' }}
run: |
cd project
find . -not -path './.git/*' -type f -name '*.porig' -delete
find . -not -path './.git/*' -type f -name '*.rej' -delete
- name: Commit and push changes to the update branch
if: ${{ env.BRANCH_EXISTS == 'false' }}
run: |
cd project
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
git config --global user.name "github-actions[bot]"
git checkout -b ${{ env.BRANCH_NAME }}
git add .
git commit -m "chore: update template to ${{ env.TEMPLATE_UPDATE_VERSION }}"
git push origin ${{ env.BRANCH_NAME }}
echo "BRANCH_EXISTS=true" >> $GITHUB_ENV
- name: 🎉 Create PR with changes
if: ${{ env.BRANCH_EXISTS == 'true' && env.PR_EXISTS == 'false' }}
run: |
cd project
gh pr create --title "chore: update template to ${{ env.TEMPLATE_UPDATE_VERSION }}" --body "Integrating latest changes from [rootstrap/react-native-template@${{ env.TEMPLATE_UPDATE_VERSION }}](https://github.com/rootstrap/react-native-template/releases/tag/${{ env.TEMPLATE_UPDATE_VERSION }})" --head ${{ env.BRANCH_NAME }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}