forked from firebase/firebase-cpp-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
232 lines (217 loc) · 11.2 KB
/
update-dependencies.yml
File metadata and controls
232 lines (217 loc) · 11.2 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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
name: Update Android and iOS dependencies
on:
workflow_dispatch:
inputs:
updateAndroid:
description: 'update Android dependencies?'
default: 1
updateiOS:
description: 'update iOS dependencies?'
default: 1
includeGMA:
description: 'include GMA?'
default: 0
triggerTests:
description: 'trigger tests on PR?'
default: 1
baseBranch:
description: 'create the new branch from this base'
default: 'main'
comment:
description: 'optional comment to add to PR'
default: ''
env:
branchPrefix: "workflow/auto-update-deps-"
triggerTestsLabel: "tests-requested: quick"
jobs:
update_dependencies:
name: update-deps
runs-on: macos-13
steps:
- name: Get token for firebase-workflow-trigger
uses: tibdex/github-app-token@v1
id: generate-token
with:
app_id: ${{ secrets.WORKFLOW_TRIGGER_APP_ID }}
private_key: ${{ secrets.WORKFLOW_TRIGGER_APP_PRIVATE_KEY }}
- name: Setup python
uses: actions/setup-python@v4
with:
python-version: 3.8
- name: Check out base branch
uses: actions/checkout@v3
with:
fetch-depth: 0
ref: ${{ github.event.inputs.baseBranch }}
- name: Install prerequisites
run: |
python scripts/gha/install_prereqs_desktop.py
python -m pip install requests
- name: Name new branch
run: |
date_str=$(date "+%Y%m%d-%H%M%S")
echo "NEW_BRANCH=${{env.branchPrefix}}${{github.run_number}}-${date_str}" >> $GITHUB_ENV
- name: Create new branch
run: |
git remote update
git checkout -b "${NEW_BRANCH}"
echo "UPDATE_LOGFILE=update_log.txt" >> $GITHUB_ENV
- name: Run update script
run: |
gma_flag=
if [[ ${{ github.event.inputs.includeGMA }} -eq 1 ]]; then
gma_flag="--include_gma"
fi
if [[ ${{ github.event.inputs.updateiOS }} -eq 1 ]]; then
if [[ ${{ github.event.inputs.updateAndroid }} -eq 1 ]]; then
# Update both
echo "Updating all dependencies"
python scripts/update_android_ios_dependencies.py --logfile=${UPDATE_LOGFILE} ${gma_flag}
echo "CHOSEN_DEPS=mobile" >> $GITHUB_ENV
else
# Update iOS only
echo "Updating iOS dependencies only"
python scripts/update_android_ios_dependencies.py --skip_android --logfile=${UPDATE_LOGFILE} ${gma_flag}
echo "CHOSEN_DEPS=iOS" >> $GITHUB_ENV
fi
# iOS: Update Firestore external version to match Firestore Cocoapod version.
firestore_version=$(grep "pod 'Firebase/Firestore'" ios_pod/Podfile | sed "s/.*'\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\)'.*/\1/")
echo "Setting Firestore external version to ${firestore_version}"
sed -i~ "s/^set(version [^)]*)/set(version CocoaPods-${firestore_version})/i" cmake/external/firestore.cmake
# iOS: Update Analytics header files, used for generating constants.
analytics_version=$(grep "pod 'Firebase/Analytics'" ios_pod/Podfile | sed "s/.*'\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\)'.*/\1/")
if [[ "$(uname)" == "Darwin"* ]]; then
echo "Updating Analytics iOS headers from version ${analytics_version}"
# Unfortunately we can't just download these headers from GitHub, as
# Analytics is closed-source. If it becomes open-source, we could just
# download the header files from the iOS SDK's release branch. So instead,
# download the Firebase Analytics cocoapod (via a stub project) and get the
# header from there. This will only work on macOS.
podtmp="$(mktemp -d)"
cd "${podtmp}"
# Generate a Podfile for Firebase/Analytics. Use the Specs.git
# source to avoid any propagation delays due to CocoaPods mirror.
echo "source 'https://github.com/CocoaPods/Specs.git'" > Podfile
echo "platform :ios, '14.0'" >> Podfile
echo "pod 'Firebase/Analytics', '${analytics_version}'" >> Podfile
pod repo update
pod install || true # ignore error since there is no Xcode project
declare -a header_dirs
# Get all of the framework header directories from the xcframework.
header_dirs=(Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.xcframework/*/FirebaseAnalytics.framework/Headers)
# Just use the first directory found, the headers should be the same across
# all of the frameworks.
header_dir="${header_dirs[0]}"
cd -
cd analytics/ios_headers
for ios_header in *.h; do
# Each file in this directory matches a file in the Analytics iOS SDK.
cp -vf "${podtmp}/${header_dir}/${ios_header}" .
# If the file doesn't have a Google copyright, add one.
if ! grep -q "^// Copyright [0-9]* Google LLC" "${ios_header}"; then
copyright_line="// Copyright $(date +%Y) Google LLC\n"
else
copyright_line=
fi
# Add a note to each file about its source.
sed -i~ "s|^/// @file|${copyright_line}\n// Copied from Firebase Analytics iOS SDK ${analytics_version}.\n\n/// @file|" "${ios_header}"
rm -f "${ios_header}~" # remove backup file that sed generated
python ../../scripts/format_code.py --f "${ios_header}"
done
cd -
rm -rf "${podtmp}"
fi
# Download the zip distribution and get the Swift header files.
core_version=$(grep "pod 'Firebase/Core'" ios_pod/Podfile | sed "s/.*'\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\)'.*/\1/")
echo "Getting Swift header files from Firebase iOS SDK ${core_version} zip distribution"
ziptmp="$(mktemp -d)"
# The version might be named vX.Y.Z or simply X.Y.Z, check which exists.
declare -a zip_urls
zip_urls=("https://github.com/firebase/firebase-ios-sdk/releases/download/v${core_version}/Firebase.zip" "https://github.com/firebase/firebase-ios-sdk/releases/download/${core_version}/Firebase.zip")
for try_url in ${zip_urls[@]} error; do
curl -H 'Authorization: token ${{ github.token }}' -L -f "${try_url}" -o "${ziptmp}/Firebase.zip" 2> /dev/null && break
done
if [[ "${try_url}" == "error" ]]; then
echo "::error ::Could not download Firebase iOS prebuilt zip file, skipping Swift headers."
else
cd "${ziptmp}"
echo "Unzipping..."
unzip -q Firebase.zip '*-Swift.h'
cd -
# Copy all *-Swift.h header files into ios_pod/swift_headers/
echo "Copying headers..."
find "${ziptmp}" -name '*-Swift.h' -path '*ios*arm64*x86_64*simulator*' -print0 | xargs -0 -n 1 -J REPLACETEXT cp -f REPLACETEXT ios_pod/swift_headers/
copyright_line="// Copyright $(date +%Y) Google LLC"
# Add a note to each file about its source.
for ios_header in ios_pod/swift_headers/*.h; do
if ! grep -q "^// Copied from Firebase iOS SDK" "${ios_header}"; then
sed -i~ "s|^// Generated by Apple Swift|${copyright_line}\n// Copied from Firebase iOS SDK ${core_version}.\n\n// Generated by Apple Swift|" "${ios_header}"
fi
python3 scripts/format_code.py --f "${ios_header}"
done
fi
rm -rf ${ziptmp}
elif [[ ${{ github.event.inputs.updateAndroid }} -eq 1 ]]; then
# Update Android only
echo "Updating Android dependencies only"
python scripts/update_android_ios_dependencies.py --skip_ios --logfile=${UPDATE_LOGFILE} ${gma_flag}
echo "CHOSEN_DEPS=Android" >> $GITHUB_ENV
else
echo "::error ::Neither Android nor iOS selected. Exiting."
exit 1
fi
touch ${UPDATE_LOGFILE} # In case it wasn't generated before
cat ${UPDATE_LOGFILE}
- name: Push branch if there are changes
id: push-branch
run: |
if ! git update-index --refresh; then
# Do a bit of post-processing on the update log to split it by platform.
UPDATE_LOGFILE_PROCESSED=update_log_processed.txt
touch "${UPDATE_LOGFILE_PROCESSED}"
if grep -q ^Android: "${UPDATE_LOGFILE}"; then
echo "### Android" >> "${UPDATE_LOGFILE_PROCESSED}"
echo "" >> "${UPDATE_LOGFILE_PROCESSED}"
grep ^Android: "${UPDATE_LOGFILE}" | sed 's/^Android: /- /' >> ${UPDATE_LOGFILE_PROCESSED}
echo "" >> "${UPDATE_LOGFILE_PROCESSED}"
fi
if grep -q ^iOS: "${UPDATE_LOGFILE}"; then
echo "### iOS" >> "${UPDATE_LOGFILE_PROCESSED}"
echo "" >> "${UPDATE_LOGFILE_PROCESSED}"
grep ^iOS: "${UPDATE_LOGFILE}" | sed 's/^iOS: /- /' >> ${UPDATE_LOGFILE_PROCESSED}
echo "" >> "${UPDATE_LOGFILE_PROCESSED}"
fi
date_str=$(date "+%a %b %d %Y")
commit_title="Update ${CHOSEN_DEPS} dependencies - ${date_str}"
commit_body=
if [[ -n '${{ github.event.inputs.comment }}' ]]; then
# If a comment was provided, start with that instead of blank.
commit_body='${{ github.event.inputs.comment }}
'
fi
commit_body="${commit_body}$(cat ${UPDATE_LOGFILE_PROCESSED})
> Created by [${{github.workflow}} workflow]($GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID)."
git config user.email "firebase-workflow-trigger-bot@google.com"
git config user.name "firebase-workflow-trigger-bot"
git config core.commentChar "%" # so we can use # in git commit messages
git commit -a -m "${commit_title}
${commit_body}"
echo "branch_pushed=1" >> $GITHUB_OUTPUT
# Show changes in git log
git diff
# Push branch
git push --set-upstream origin "${NEW_BRANCH}"
# Create pull request
pr_number=$(python scripts/gha/create_pull_request.py --token ${{ steps.generate-token.outputs.token }} --head "${NEW_BRANCH}" --base "${{ github.event.inputs.baseBranch }}" --title "${commit_title}" --body "${commit_body}")
echo "created_pr_number=${pr_number}" >> $GITHUB_OUTPUT
else
echo "::warning ::No changes detected, won't create pull request."
echo "branch_pushed=0" >> $GITHUB_OUTPUT
fi
- name: Set test trigger label.
uses: actions-ecosystem/action-add-labels@v1
if: ${{ github.event.inputs.triggerTests == 1 && steps.push-branch.outputs.branch_pushed == 1 }}
with:
github_token: ${{ steps.generate-token.outputs.token }}
number: ${{ steps.push-branch.outputs.created_pr_number }}
labels: "${{ env.triggerTestsLabel }}"