-
Notifications
You must be signed in to change notification settings - Fork 2
494 lines (429 loc) · 20.5 KB
/
UnityCloudBuild.yml
File metadata and controls
494 lines (429 loc) · 20.5 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
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
# Template/reusable workflow
# https://docs.github.com/en/actions/using-workflows/reusing-workflows
name: Build With Unity Cloud
on:
workflow_call:
inputs:
UnityCloudOrganisation:
required: true
type: string
UnityCloudProject:
required: true
type: string
UnityCloudBuildTarget:
required: true
type: string
UnityCloudTargetPlatform:
required: false
type: string
#deprecationMessage: "UnityCloudTargetPlatform is no longer needed and has no effect." # gr: cannot deprecate workflow inputs, just action inputs
UnityCloudExistingBuildNumber:
required: false
type: string # this should be a number, but to allow the input to be used from a workflow_dispatch input, numbers dont work
DownloadBinaryToArtifact:
required: false
type: boolean
ReportShareUrl:
required: false
type: boolean
SlackBotChannelId:
required: false
type: string
# temporary seperate macos-path to use https://github.com/condensereality/AppleStoreUploadAction action
UploadToMacosTestFlight:
required: false
type: boolean
AppStoreConnect_TeamIdentifier: # required to sign macos
required: false
type: string
UploadToTestFlight:
required: false
type: boolean
UploadToOculusReleaseChannel:
required: false
type: boolean
OculusReleaseChannel:
required: false
type: string
UploadToUnityGameServerHosting:
required: false
type: boolean
UnityGameServerHosting_ProjectId:
required: false
type: string
UnityGameServerHosting_Enviroment:
required: false
type: string
UnityGameServerHosting_EnviromentId:
required: false
type: string
UnityGameServerHosting_BuildOsFamily:
required: false
type: string # LINUX or WINDOWS
UnityGameServerHosting_WithDockerFile:
required: false
type: string
UploadToSteam:
required: false
type: boolean
SteamUsername:
required: false
type: string
SteamAppId:
required: false
type: string # this should be a number, but github shared workflows cannot convert number to number (tries to interpret as integer)
SteamBranch:
required: false
type: string
secrets:
UnityCloudBuildApiKey:
required: true
SlackBotAuthToken: # passing this enables slack reporting
required: false
AppStoreConnect_Auth_Key:
required: false
AppStoreConnect_Auth_P8_Base64:
required: false
AppStoreConnect_Auth_Issuer:
required: false
AppStoreConnect_SigningCertificate_P12_Base64:
required: false
AppStoreConnect_SigningCertificate_Password:
required: false
AppStoreConnect_ProvisioningProfile_Base64:
required: false
AppStoreConnect_InstallerCertificate_P12_Base64:
required: false
AppStoreConnect_InstallerCertificate_Password:
required: false
OculusAppId:
required: false
OculusAppSecret:
required: false
UnityGameServerHosting_Key:
required: false
UnityGameServerHosting_Secret:
required: false
SteamConfigVdfBase64: # base64 encoded config.vdf from steamcmd https://github.com/game-ci/steam-deploy (see readme)
required: false
jobs:
Build:
runs-on: ubuntu-22.04
outputs:
share_url: ${{ steps.build.outputs.SHARE_URL }}
artifact_filepath: ${{ steps.build.outputs.ARTIFACT_FILEPATH }}
artifact_filename: ${{ steps.build.outputs.ARTIFACT_FILENAME }}
steps:
- name: Build with Unity Cloud Build
uses: condensereality/UnityCloudBuildAction@main
id: build
with:
unity_cloud_build_api_key: ${{ secrets.UnityCloudBuildApiKey }}
unity_cloud_build_org_id: ${{ inputs.UnityCloudOrganisation }}
unity_cloud_build_project_id: ${{ inputs.UnityCloudProject }}
unity_cloud_build_polling_interval: 60
unity_cloud_build_primary_target: ${{ inputs.UnityCloudBuildTarget }}
unity_cloud_build_download_binary: ${{ inputs.DownloadBinaryToArtifact || inputs.UploadToTestFlight || inputs.UploadToMacosTestFlight || inputs.UploadToOculusReleaseChannel || inputs.UploadToUnityGameServerHosting || inputs.UploadToSteam }}
unity_cloud_build_create_share: ${{ inputs.ReportShareUrl }}
# github.ref is the fully formed ref, eg refs/pull/6/merge or refs/tag/v0.1.2
# github.head_ref is present in pull requests, and is the SOURCE branch (eg. YourFeatureBranch)
# github.base_ref is present in pull requests, and is the TARGET branch (eg. main)
unity_cloud_build_github_branch_ref: ${{ github.ref }}
unity_cloud_build_github_head_ref: ${{ github.head_ref }}
unity_cloud_build_github_commit_sha: ${{ github.sha }}
unity_cloud_build_use_existing_build_number: ${{ inputs.UnityCloudExistingBuildNumber }}
- name: Store binary as artifact
if: ${{ inputs.DownloadBinaryToArtifact || inputs.UploadToTestFlight || inputs.UploadToMacosTestFlight || inputs.UploadToOculusReleaseChannel || inputs.UploadToUnityGameServerHosting || inputs.UploadToSteam }}
uses: actions/upload-artifact@v4
with:
name: ${{ steps.build.outputs.ARTIFACT_FILENAME }}
path: ${{ steps.build.outputs.ARTIFACT_FILEPATH }}
if-no-files-found: error
UploadToMacosTestFlight:
if: ${{ inputs.UploadToMacosTestFlight }}
name: Upload to TestFlight (macos)
needs: Build
runs-on: macos-latest # AppleStoreUploadAction must run on macos
env:
ARTIFACT_FILENAME: ${{ needs.Build.outputs.artifact_filename }}
steps:
# error if artifact doesn't exist
- name: Check Artifact exists
uses: xSAVIKx/artifact-exists-action@v0
with:
name: ${{ env.ARTIFACT_FILENAME }}
- name: "Download build artifact"
uses: actions/download-artifact@v4
with:
name: ${{ env.ARTIFACT_FILENAME }}
- name: "Unzip artifact to .App"
id: ExtractArtifactApp
run: |
echo "Unzipping artifact; ${{ env.ARTIFACT_FILENAME }}, without do-not-ship files, into UnzippedArtifact/..."
ls -l ./
# -x excludes patterns when unzipping
unzip ${{ env.ARTIFACT_FILENAME }} -d "UnzippedArtifact" -x "*DoNotShip*" "*DontShip*"
echo "Listing ./UnzippedArtifact..."
ls -l ./UnzippedArtifact
export AppFilename=$(find . -name *.app)
[ -z "$AppFilename" ] && echo "Didn't find a .app file; $Filename" && exit 1
echo "ArtifactFilename=$AppFilename" >> "$GITHUB_OUTPUT"
- name: "Package, sign and upload to TestFlight"
uses: condensereality/AppleStoreUploadAction@v0.0.5
with:
AppFilename: ${{ steps.ExtractArtifactApp.outputs.ArtifactFilename }}
Upload: false # temporarily dont publish; gr: this is is still uploading!
SignApp: true
SignPackage: true
TeamIdentifier: ${{ inputs.AppStoreConnect_TeamIdentifier }}
TestFlightPlatform: macos
AppStoreConnect_Auth_Key: ${{ secrets.AppStoreConnect_Auth_Key }}
AppStoreConnect_Auth_P8_Base64: ${{ secrets.AppStoreConnect_Auth_P8_Base64 }}
AppStoreConnect_Auth_Issuer: ${{ secrets.AppStoreConnect_Auth_Issuer }}
SigningCertificate_P12_Base64: ${{ secrets.AppStoreConnect_SigningCertificate_P12_Base64 }}
SigningCertificate_Password: ${{ secrets.AppStoreConnect_SigningCertificate_Password }}
ProvisioningProfile_Base64: ${{ secrets.AppStoreConnect_ProvisioningProfile_Base64 }}
InstallerCertificate_P12_Base64: ${{ secrets.AppStoreConnect_InstallerCertificate_P12_Base64 }}
InstallerCertificate_Password: ${{ secrets.AppStoreConnect_InstallerCertificate_Password }}
UploadToTestFlight:
if: ${{ inputs.UploadToTestFlight }}
name: Upload to TestFlight
runs-on: macos-latest
needs: Build
env:
APPSTORECONNECT_AUTH_KEY: ${{ secrets.AppStoreConnect_Auth_Key }}
APPSTORECONNECT_AUTH_ISSUER: ${{ secrets.AppStoreConnect_Auth_Issuer }}
APPSTORECONNECT_AUTH_P8_BASE64: ${{ secrets.AppStoreConnect_Auth_P8_Base64 }}
ARTIFACT_FILENAME: ${{ needs.Build.outputs.artifact_filename }}
steps:
- name: Download Build Artifact
uses: actions/download-artifact@v4
with:
name: ${{ env.ARTIFACT_FILENAME }}
# put the authkey p8 in private_keys/ in the filename altool expects
- name: Get Auth Key.P8
# xxx.p8 no such file or directory, means you cannot pipe to a file in a directory that doesnt exist
run: |
mkdir -p ./private_keys
echo "$APPSTORECONNECT_AUTH_P8_BASE64" | base64 -d > ./private_keys/AuthKey_$APPSTORECONNECT_AUTH_KEY.p8
# for debugging any errors below, print out the bundle version from the IPA/plist
- name: Print Bundle Version
continue-on-error: true
env:
UNZIPPED_PATH: "$GITHUB_WORKSPACE/UnzippedIpa"
# command used on mac; requires absolute path! defaults read "$(find $(pwd)/unzipped_ipa/Payload/Showcase.app -name '*.app')/Info.plist" CFBundleShortVersionString
run: |
unzip -d $UNZIPPED_PATH ${{ env.ARTIFACT_FILENAME }}
defaults read "$(find $UNZIPPED_PATH -name '*.app')/Info.plist" CFBundleShortVersionString
- name: Upload .ipa to TestFlight
env:
IosBundleId: "xxx" # todo: extract from ipa. altool doesn't seem to need this to be correct
IosBundleVersion: 0 # doesnt seem to need this to be correct. altool uses data in the ipa
IosBundleShortVersionString: "yyy" # doesnt seem to need this to be correct. altool uses data in the ipa
run: |
xcrun altool --upload-app --file ${{ env.ARTIFACT_FILENAME }} --type ios --bundle-id ${{ env.IosBundleId }} --bundle-version ${{ env.IosBundleVersion }} --bundle-short-version-string ${{ env.IosBundleShortVersionString }} --apiKey ${APPSTORECONNECT_AUTH_KEY} --apiIssuer ${APPSTORECONNECT_AUTH_ISSUER}
UploadToOculusReleaseChannel:
if: ${{ inputs.UploadToOculusReleaseChannel }}
name: Upload to Oculus Release Channel
runs-on: macos-latest
needs: Build
env:
ARTIFACT_FILENAME: ${{ needs.Build.outputs.artifact_filename }}
steps:
# error if artifact doesn't exist
- name: Check Artifact exists
uses: xSAVIKx/artifact-exists-action@v0
with:
name: ${{ env.ARTIFACT_FILENAME }}
- name: Download Build Artifact
uses: actions/download-artifact@v4
with:
name: ${{ env.ARTIFACT_FILENAME }}
# unzip the artifact and find the apk inside, save that filename
- name: Unzip APK from artifact
id: UnzipApkFromZip
# the artifact is in fact an .apk in this case, doesn't need unzipping
#run: |
# unzip ${{ env.ARTIFACT_FILENAME }}
# echo APK_FILENAME="$(ls *.apk)" >> "$GITHUB_OUTPUT"
run: |
echo APK_FILENAME="${{ env.ARTIFACT_FILENAME }}" >> "$GITHUB_OUTPUT"
- name: Install ovr-platform-util
uses: condensereality/setup-ovr-platform-util@main
- name: Check ovr-platform-util
run: |
ovr-platform-util version
- name: Upload APK to oculus release channel
uses: condensereality/upload-meta-quest-build@main
with:
appId: ${{ secrets.OculusAppId }}
appSecret: ${{ secrets.OculusAppSecret }}
apkPath: ${{ steps.UnzipApkFromZip.outputs.APK_FILENAME }}
releaseChannel: ${{ inputs.OculusReleaseChannel }}
UploadToSteam:
if: ${{ inputs.UploadToSteam }}
name: Upload to Steam
runs-on: ubuntu-latest # will also run on macos-latest
needs: Build
env:
ARTIFACT_FILENAME: ${{ needs.Build.outputs.artifact_filename }}
steps:
- name: Download Build Artifact
uses: actions/download-artifact@v4
with:
name: ${{ env.ARTIFACT_FILENAME }}
# -x excludes patterns when unzipping
- name: Unzip Artifact
id: UnzipArtifacts
run: |
[ -z "$ARTIFACT_FILENAME" ] && echo "ARTIFACT_FILENAME env var is empty" && exit 1
echo "Unzipping artifact; ${{ env.ARTIFACT_FILENAME }}..."
ls -l ./
unzip ${{ env.ARTIFACT_FILENAME }} -d "BuildFiles" -x "*DoNotShip*" "*DontShip*"
echo ArtifactPath="BuildFiles" >> "$GITHUB_OUTPUT"
- name: Format Steam Build Description
id: SteamBuildDescription
run: |
echo BuildDescription="${{ github.ref }} ${{ github.sha }}" >> $GITHUB_OUTPUT
- name: Deploy to Steam
uses: game-ci/steam-deploy@v3 # v3 doesn't need ssfn
with:
username: ${{ inputs.SteamUsername }}
configVdf: ${{ secrets.SteamConfigVdfBase64 }}
appId: ${{ inputs.SteamAppId }}
buildDescription: ${{ steps.SteamBuildDescription.outputs.BuildDescription }}
rootPath: "."
depot1Path: ${{ steps.UnzipArtifacts.outputs.ArtifactPath }}
releaseBranch: ${{ inputs.SteamBranch }}
UploadToUnityGameServerHosting:
if: ${{ inputs.UploadToUnityGameServerHosting }}
name: Upload to UnityGameServerHosting
runs-on: ubuntu-latest # will also run on macos-latest
needs: Build
env:
ARTIFACT_FILENAME: ${{ needs.Build.outputs.artifact_filename }}
steps:
# gr; If we do this checkout later, it's overwriting our unzipped artifact...
- name: Checkout project for Docker project files
if: ${{ inputs.UnityGameServerHosting_WithDockerFile != '' }}
uses: actions/checkout@v4
with:
sparse-checkout: ${{ inputs.UnityGameServerHosting_WithDockerFile }} # only folder[s] we need
- name: Download Build Artifact
uses: actions/download-artifact@v4
with:
name: ${{ env.ARTIFACT_FILENAME }}
# -x excludes patterns when unzipping
- name: Unzip Artifact
id: UnzipArtifacts
run: |
echo "Unzipping artifact; ${{ env.ARTIFACT_FILENAME }}..."
ls -l ./
unzip ${{ env.ARTIFACT_FILENAME }} -d "BuildFiles" -x "*DoNotShip*" "*DontShip*"
echo ArtifactPath="BuildFiles" >> "$GITHUB_OUTPUT"
# any service acount key to upload needs these roles
#Game Server Hosting Allocations Admin
#Game Server Hosting API Editor
#Game Server Hosting API Manager
#Game Server Hosting API Viewer
#Unity Environments Viewer
- name: Upload To new Unity Game Hosting File-Build
if: ${{ inputs.UnityGameServerHosting_WithDockerFile == '' }}
uses: condensereality/UnityGameHostingAction@v1.1.0
with:
BuildName: ${{ github.ref }}
RemoteBuildVersion: ${{ github.sha }}
BuildFilesDirectory: ${{ steps.UnzipArtifacts.outputs.ArtifactPath }}
BuildOsFamily: ${{ inputs.UnityGameServerHosting_BuildOsFamily }}
Project: ${{ inputs.UnityGameServerHosting_ProjectId }}
Environment: ${{ inputs.UnityGameServerHosting_Enviroment }}
EnvironmentId: ${{ inputs.UnityGameServerHosting_EnviromentId }}
Key: ${{ secrets.UnityGameServerHosting_Key }}
Secret: ${{ secrets.UnityGameServerHosting_Secret }}
- name: Copy files to DockerFile source path
if: ${{ inputs.UnityGameServerHosting_WithDockerFile != '' }}
run: |
pwd
ls -l ./
#mkdir ${{ inputs.UnityGameServerHosting_WithDockerFile }}/Game
#cp --recursive ${{ steps.UnzipArtifacts.outputs.ArtifactPath }} ${{ inputs.UnityGameServerHosting_WithDockerFile }}/Game
mv ${{ steps.UnzipArtifacts.outputs.ArtifactPath }} ${{ inputs.UnityGameServerHosting_WithDockerFile }}/Game
echo "Listing ${{ inputs.UnityGameServerHosting_WithDockerFile }} ..."
ls -l -R ${{ inputs.UnityGameServerHosting_WithDockerFile }}
- name: Create Docker Image
if: ${{ inputs.UnityGameServerHosting_WithDockerFile != '' }}
uses: docker/build-push-action@v5
with:
#file: ${{ inputs.UnityGameServerHosting_WithDockerFile/Dockerfile }}
context: ${{ inputs.UnityGameServerHosting_WithDockerFile }} # base folder, containing DockerFile
push: false
tags: game:latest
- name: Upload To new Unity Game Hosting Docker-Build
if: ${{ inputs.UnityGameServerHosting_WithDockerFile != '' }}
uses: condensereality/UnityGameHostingAction@v1.1.0
with:
BuildName: ${{ github.ref }}
RemoteBuildVersion: ${{ github.sha }}
LocalBuildContainerTag: "game:latest"
BuildOsFamily: ${{ inputs.UnityGameServerHosting_BuildOsFamily }}
Project: ${{ inputs.UnityGameServerHosting_ProjectId }}
Environment: ${{ inputs.UnityGameServerHosting_Enviroment }}
EnvironmentId: ${{ inputs.UnityGameServerHosting_EnviromentId }}
Key: ${{ secrets.UnityGameServerHosting_Key }}
Secret: ${{ secrets.UnityGameServerHosting_Secret }}
ReportToSlack:
runs-on: ubuntu-22.04
# can we force this to run (always()) AND only if channel is present?
#if: ${{ inputs.SlackBotChannelId != '' }}
if: always()
needs: [Build,UploadToTestFlight,UploadToMacosTestFlight,UploadToOculusReleaseChannel,UploadToUnityGameServerHosting,UploadToSteam]
steps:
- name: Set SHARE_STRING env
if: needs.Build.outputs.share_url != ''
env:
SHARE_URL: ${{ needs.Build.outputs.share_url }}
UNITY_CLOUD_BUILD_TARGET: ${{ inputs.UnityCloudBuildTarget }}
run: |
echo "SHARE_STRING=:gift: $UNITY_CLOUD_BUILD_TARGET $SHARE_URL" >> "$GITHUB_ENV"
- name: Set TESTFLIGHTRESULT_STRING env
if: ${{ inputs.UploadToTestFlight }}
env:
TF_RESULT_STRING: ${{ needs.UploadToTestFlight.result == 'success' && ':green_heart:' || ':x:' }} ${{ needs.UploadToTestFlight.result }}
run: |
echo TESTFLIGHTRESULT_STRING="TestFlight $TF_RESULT_STRING " >> "$GITHUB_ENV"
- name: Set TESTFLIGHTMACOSRESULT_STRING env
if: ${{ inputs.UploadToMacosTestFlight }}
env:
TF_RESULT_STRING: ${{ needs.UploadToMacosTestFlight.result == 'success' && ':green_heart:' || ':x:' }} ${{ needs.UploadToMacosTestFlight.result }}
run: |
echo TESTFLIGHTMACOSRESULT_STRING="Macos TestFlight $TF_RESULT_STRING " >> "$GITHUB_ENV"
- name: Set OCULUSRELEASERESULT_STRING env
if: ${{ inputs.UploadToOculusReleaseChannel }}
env:
OR_RESULT_STRING: ${{ needs.UploadToOculusReleaseChannel.result == 'success' && ':green_heart:' || ':x:' }} ${{ needs.UploadToOculusReleaseChannel.result }}
run: |
echo OCULUSRELEASERESULT_STRING="OculusRelease $OR_RESULT_STRING " >> "$GITHUB_ENV"
- name: Set UNITYGAMEHOSTINGUPLOADRESULT_STRING env
if: ${{ inputs.UploadToUnityGameServerHosting }}
env:
UGS_RESULT_STRING: ${{ needs.UploadToUnityGameServerHosting.result == 'success' && ':green_heart:' || ':x:' }} ${{ needs.UploadToUnityGameServerHosting.result }}
run: |
echo UNITYGAMEHOSTINGUPLOADRESULT_STRING="UnityGameHosting $UGS_RESULT_STRING " >> "$GITHUB_ENV"
- name: Set UPLOADTOSTEAM_RESULT_STRING env
if: ${{ inputs.UploadToSteam }}
env:
UTS_RESULT_STRING: ${{ needs.UploadToSteam.result == 'success' && ':green_heart:' || ':x:' }} ${{ needs.UploadToSteam.result }}
run: |
echo UPLOADTOSTEAM_RESULT_STRING="UploadToSteam $UTS_RESULT_STRING " >> "$GITHUB_ENV"
- name: Notify Slack
continue-on-error: true
uses: slackapi/slack-github-action@v1.23.0
env:
SLACK_BOT_TOKEN: ${{ secrets.SlackBotAuthToken }}
RESULT_STRING: ${{ needs.Build.result == 'success' && ':green_heart:' || ':x:' }} ${{ needs.Build.result }}
RUN_URL: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
BRANCH_STRING: Branch `${{ github.ref_name }}`
COMMIT_STRING: <${{ github.event.pull_request.url || github.event.head_commit.url }}|${{ github.event.pull_request.title || github.event.head_commit.message}}>
with:
channel-id: ${{ inputs.SlackBotChannelId }}
slack-message: "`${{github.repository}}/${{github.github.ref_name}}${{github.workflow}}` Build Result: ${{env.RESULT_STRING}} ${{ env.TESTFLIGHTRESULT_STRING }} ${{ env.OCULUSRELEASERESULT_STRING }} ${{ env.UNITYGAMEHOSTINGUPLOADRESULT_STRING }} ${{ env.UPLOADTOSTEAM_RESULT_STRING }}\n:pencil2: ${{env.COMMIT_STRING}} ${{ env.BRANCH_STRING }} \n:runner: ${{env.RUN_URL}} \n${{ env.SHARE_STRING }}"