leap_salesforce 0.1.18 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 467199374ed9914ed99da0b95b4c9fbe7105eed96b1456ea469d55c1cfadc0f9
4
- data.tar.gz: 1aca36e08dca7f60197fc8809d2fa69a1468087c0114c0fc70964cb0b46c80c6
3
+ metadata.gz: 77695ebdd7c343c96054ec7feddc3f7fad3d6cd88faef0cebdeffdae3b1ff6dc
4
+ data.tar.gz: adccd0e5e0cc880e554fa0c7b8a3381fbf3a7e68142e23e59afdfef7846fdb2d
5
5
  SHA512:
6
- metadata.gz: 18f11ad55eee275cad36b44ba80eef5a34ba1de1cdba00d2c40541bf2449dedf29234f3854a1629e174d6353916ee40e834ea2ec0f4bc351a1142e0e60613a1e
7
- data.tar.gz: ed67318c6a72655e8053d02f945ed133e6bf8461a89fc00ea7dd7684402d30291375c046b418f3465a2edcf33f45ddac1345027557cfc9a75623be041ea3d2a2
6
+ metadata.gz: 04c59da4ce51c172fffdf7763dfaa6db9d3f6115016ec1afbd5dfd005b40d7592af0508c7b2d2317128f7c92118caa9349edf61fc1b4c544822ea02ea89bda9c
7
+ data.tar.gz: 7a0c30ded8226117a3480730d02daf3a3582694e9d873b37417b542f8f3e581c17fda7d4a87a4eeb3a053a302090b0a7f20e469ee8ece55b9aec1f8f2f5352ce
data/.gitignore CHANGED
@@ -19,3 +19,7 @@ config/credentials/
19
19
 
20
20
  # rspec failure tracking
21
21
  .rspec_status
22
+
23
+ # sfdx
24
+ /JWT/
25
+ /scripts/setup_env.sh
data/.gitlab-ci.yml CHANGED
@@ -10,14 +10,601 @@ variables:
10
10
  password: $password
11
11
  client_id: $client_id
12
12
  client_secret: $client_secret
13
-
13
+ SERVER_KEY_PASSWORD: $SERVER_KEY_PASSWORD
14
+
15
+
16
+ .sfdx_helpers: &sfdx_helpers |
17
+
18
+ # Function to install the Salesforce CLI.
19
+ # No arguments.
20
+
21
+ function install_salesforce_cli() {
22
+
23
+ # Salesforce CLI Environment Variables
24
+ # https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_cli_env_variables.htm
25
+
26
+ # By default, the CLI periodically checks for and installs updates.
27
+ # Disable (false) this auto-update check to improve performance of CLI commands.
28
+ export SFDX_AUTOUPDATE_DISABLE=false
29
+
30
+ # Set to true if you want to use the generic UNIX keychain instead of the Linux libsecret library or macOS keychain.
31
+ # Specify this variable when using the CLI with ssh or "headless" in a CI environment.
32
+ export SFDX_USE_GENERIC_UNIX_KEYCHAIN=true
33
+
34
+ # Specifies the time, in seconds, that the CLI waits for the Lightning Experience custom domain to resolve and become available in a newly-created scratch org.
35
+ # If you get errors about My Domain not configured when you try to use a newly-created scratch org, increase this wait time.
36
+ export SFDX_DOMAIN_RETRY=300
37
+
38
+ # For force:package:create, disables automatic updates to the sfdx-project.json file.
39
+ export SFDX_PROJECT_AUTOUPDATE_DISABLE_FOR_PACKAGE_CREATE=true
40
+
41
+ # For force:package:version:create, disables automatic updates to the sfdx-project.json file.
42
+ export SFDX_PROJECT_AUTOUPDATE_DISABLE_FOR_PACKAGE_VERSION_CREATE=true
43
+
44
+ # Install Salesforce CLI
45
+ mkdir sfdx
46
+ CLIURL=https://developer.salesforce.com/media/salesforce-cli/sfdx-linux-amd64.tar.xz
47
+ wget -qO- $CLIURL | tar xJ -C sfdx --strip-components 1
48
+ "./sfdx/install"
49
+ export PATH=./sfdx/$(pwd):$PATH
50
+
51
+ # Output CLI version and plug-in information
52
+ sfdx update
53
+ sfdx --version
54
+ sfdx plugins --core
55
+
56
+ }
57
+
58
+
59
+ # Function to install jq json parsing library.
60
+ # No arguments.
61
+
62
+ function install_jq() {
63
+ apt update && apt -y install jq
64
+ }
65
+
66
+
67
+ # Function to install LWC Jest dependencies.
68
+ # Will create or update the package.json with { "test:lwc" : "lwc-jest" } to the scripts property.
69
+ # No arguments.
70
+
71
+ function install_lwc_jest() {
72
+
73
+ # Create a default package.json if file doesn't exist
74
+ if [ ! -f "package.json" ]; then
75
+ npm init -y
76
+ fi
77
+
78
+ # Check if the scripts property in package.json contains key for "test:lwc"
79
+ local scriptValue=$(jq -r '.scripts["test:lwc"]' < package.json)
80
+
81
+ # If no "test:lwc" script property, then add one
82
+ if [[ -z "$scriptValue" || $scriptValue == null ]]; then
83
+ local tmp=$(mktemp)
84
+ jq '.scripts["test:lwc"]="lwc-jest"' package.json > $tmp
85
+ mv $tmp package.json
86
+ echo "added test:lwc script property to package.json" >&2
87
+ cat package.json >&2
88
+ fi
89
+
90
+ # Now that we have package.json to store dependency references to
91
+ # and to run our lwc jest test scripts, run npm installer
92
+ npm install
93
+ npm install @salesforce/lwc-jest --save-dev
94
+
95
+ }
96
+
97
+
98
+ # Checks if there are LWC Jest Test files in any of the package directories of sfdx-project.json.
99
+ # This is necessary because npm will throw error if no test classes are found.
100
+ # No arguments.
101
+ # Returns `true` or `false`
102
+
103
+ function check_has_jest_tests() {
104
+ local hasJestTests=false
105
+ for pkgDir in $(jq -r '.packageDirectories[].path' < sfdx-project.json)
106
+ do
107
+ if [ -f $pkgDir ]; then
108
+ local fileCnt=$(find $pkgDir -type f -path "**/__tests__/*.test.js" | wc -l);
109
+ if [ $fileCnt -gt 0 ]; then
110
+ hasJestTests=true
111
+ fi
112
+ fi
113
+ done
114
+ echo $hasJestTests
115
+ }
116
+
117
+
118
+ # Runs `npm run test:lwc` to execute LWC Jest tests.
119
+ # Function takes no arguments.
120
+ # Should be called after `setup_lwc`.
121
+ # Uses `check_has_jest_tests` to know if there are actually any tests to run.
122
+ # If there aren't any jest tests then npm would throw an error and fail the job,
123
+ # so we skip running npm if there are no tests, essentially skipping them to avoid error.
124
+
125
+ function test_lwc_jest() {
126
+ local hasJestTests=$(check_has_jest_tests)
127
+ if [ $hasJestTests ]; then
128
+ npm run test:lwc
129
+ else
130
+ echo 'Skipping lwc tests, found no jest tests in any package directories' >&2
131
+ fi
132
+ }
133
+
134
+
135
+ # Function to test the scratch org, such as run Apex tests and/or load data.
136
+ # We leverage the script property `test:scratch` in package.json to provide developers a "hook"
137
+ # to control exactly how they want their apex test to be executed.
138
+ # Arguments:
139
+ # $1 = username or alias of org to test
140
+ # $2 = org name property
141
+ # (Assumes you've already authorized to that org)
142
+
143
+ function test_scratch_org() {
144
+
145
+ local org_username=$1
146
+
147
+ if [ ! $org_username ]; then
148
+ echo "ERROR No org username provided to 'test_scratch_org' function" >&2
149
+ exit 1;
150
+ fi
151
+
152
+ # Create a default package.json if file doesn't exist
153
+ if [ ! -f "package.json" ]; then
154
+ npm init -y
155
+ fi
156
+
157
+ # Check if the scripts property in package.json contains key for "test:scratch"
158
+ local scriptValue=$(jq -r '.scripts["test:scratch"]' < package.json)
159
+
160
+ # If no "test:scratch" script property, then add one
161
+ if [[ -z "$scriptValue" || $scriptValue == null ]]; then
162
+ local tmp=$(mktemp)
163
+ jq '.scripts["test:scratch"]="sfdx force:apex:test:run --codecoverage --resultformat human --wait 10"' package.json > $tmp
164
+ mv $tmp package.json
165
+ echo "added test:scratch script property to package.json" >&2
166
+ cat package.json >&2
167
+ fi
168
+
169
+ # Set the default username so any CLI commands
170
+ # the developer has set in their "test:scratch" script in package.json
171
+ # will operate on the correct environment.
172
+ # Afterwards, restore the original default username, just in case it was different.
173
+ local old_org_username=$(jq -r '.result[].value' <<< $(sfdx force:config:get defaultusername --json))
174
+ sfdx force:config:set defaultusername=$org_username
175
+ npm run test:scratch
176
+ sfdx force:config:set defaultusername=$old_org_username
177
+
178
+ }
179
+
180
+
181
+ # Function to authenticate to Salesforce.
182
+ # Don't expose the auth url to the logs.
183
+ # Arguments:
184
+ # $1 = alias to set
185
+ # $2 = Sfdx Auth URL
186
+ # $3 = SFDX AUth URL to use if the previous one isn't set (optional)
187
+
188
+ function authenticate() {
189
+
190
+ local alias_to_set=$1
191
+ local org_auth_url=$2
192
+ local org_auth_url_backup=$3
193
+
194
+ local file=$(mktemp)
195
+ echo $org_auth_url > $file
196
+ local cmd="sfdx force:auth:sfdxurl:store --sfdxurlfile $file --setalias $alias_to_set --json" && (echo $cmd >&2)
197
+ local output=$($cmd)
198
+
199
+ sfdx force:config:set defaultusername=$alias_to_set
200
+ sfdx force:config:set defaultdevhubusername=$alias_to_set
201
+
202
+ rm $file
203
+ }
204
+
205
+
206
+ # Function to get SFDX Auth URL for an org.
207
+ # Don't expose the force:org:display to logs to avoid exposing sensitive information like access tokens.
208
+ # Note this can only be run on a scratch org right after creating it, otherwise we won't be able to find the org
209
+ # Arguments:
210
+ # $1 = target org alias whose auth url to get
211
+ # Returns the SFDX Auth URL for the given org.
212
+
213
+ function get_org_auth_url() {
214
+
215
+ local org_username=$1
216
+ echo "org_username=$org_username" >&2
217
+
218
+ # Parse the SFDX Auth URL for the given org
219
+ local cmd="sfdx force:org:display --verbose --targetusername $org_username --json" && (echo $cmd >&2)
220
+ local output=$($cmd)
221
+ org_auth_url="$(jq -r '.result.sfdxAuthUrl' <<< $output)"
222
+
223
+ if [ ! $org_auth_url ]; then
224
+ echo "ERROR No SFDX Auth URL available for org $org_username" >&2
225
+ exit 1
226
+ fi
227
+
228
+ # Return the SFDX Auth URL
229
+ echo $org_auth_url
230
+ }
231
+
232
+
233
+ # Checks a specific limit for the given org
234
+ # and exits with error if none remaining.
235
+ # Arguments:
236
+ # $1 = target org username whose limits to check
237
+ # $2 = name of the limit to check (e.g. "DailyScratchOrgs" or "Package2VersionCreates")
238
+
239
+ function assert_within_limits() {
240
+
241
+ export local org_username=$1
242
+ export local limit_name=$2
243
+ echo "org_username=$org_username" >&2
244
+ echo "limit_name=$limit_name" >&2
245
+
246
+ local cmd="sfdx force:limits:api:display --targetusername $org_username --json" && (echo $cmd >&2)
247
+ local limits=$($cmd) && (echo $limits | jq '.' >&2)
248
+ local limit=$(jq -r '.result[] | select(.name == env.limit_name)' <<< $limits)
249
+
250
+ # If a limit was found, then check if we are within it
251
+ if [ -n "$limit" ]; then
252
+
253
+ local limit_max=$(jq -r '.max' <<< $limit)
254
+ local limit_rem=$(jq -r '.remaining' <<< $limit)
255
+
256
+ if [[ ( -z "$limit_rem" ) || ( $limit_rem == null ) || ( $limit_rem -le 0 ) ]]; then
257
+ echo "ERROR Max of $limit_max reached for limit $limit_name" >&2
258
+ exit 1
259
+ else
260
+ echo "$limit_rem of $limit_max remaining for limit $limit_name" >&2
261
+ fi
262
+
263
+ else
264
+ echo "No limits found for name $limit_name" >&2
265
+ fi
266
+ }
267
+
268
+
269
+ # Function to get package name and ID.
270
+ # Arguments:
271
+ # $1 = dev hub alias
272
+ # $2 = package name (optional, if not set then looks at $PACKAGE_NAME env variable, then in sfdx-project.json for default package directory)
273
+ # Returns the package id for the given package name owned by the given dev hub.
274
+
275
+ function get_package_id() {
276
+
277
+ # To make our local variables available to `jq` expressions,
278
+ # we need to export them to the environment. They are still scoped to this function.
279
+ export local devhub_username=$1
280
+ export local package_name=$2
281
+ echo "devhub_username=$devhub_username" >&2
282
+ echo "package_name=$package_name" >&2
283
+
284
+ # Check environment variables
285
+ if [ ! $package_name ]; then
286
+ echo "no package name argument provided, defaulting to environment variable PACKAGE_NAME" >&2
287
+ package_name=$PACKAGE_NAME
288
+ fi
289
+
290
+ # Check for default package directory in sfdx-project.json
291
+ if [ ! $package_name ]; then
292
+ echo "no PACKAGE_NAME environment variable set, defaulting to default package directory in sfdx-project.json" >&2
293
+ cat sfdx-project.json >&2
294
+ package_name=$(cat sfdx-project.json | jq -r '.packageDirectories[] | select(.default==true) | .package')
295
+ fi
296
+
297
+ # Check for any package directory in sfdx-project.json
298
+ if [ ! $package_name ]; then
299
+ echo "no package name found, defaulting to first package directory listed in sfdx-project.json" >&2
300
+ cat sfdx-project.json >&2
301
+ package_name=$(cat sfdx-project.json | jq -r '.packageDirectories | .[0] | .package')
302
+ fi
303
+
304
+ # Giving up
305
+ if [ ! $package_name ]; then
306
+ echo "ERROR Package name not specified. Set the PACKAGE_NAME environment variable or specify a default package directory in sfdx-project.json." >&2
307
+ exit 1
308
+ fi
309
+
310
+ # Retrieve package id for package name
311
+ local cmd="sfdx force:package:list --targetdevhubusername $devhub_username --json" && (echo $cmd >&2)
312
+ local output=$($cmd) && (echo $output | jq '.' >&2)
313
+ package_id=$(jq -r '.result[] | select(.Name == env.package_name) | .Id' <<< $output)
314
+ if [ ! $package_id ]; then
315
+ echo "ERROR We could not find a package with name '$package_name' owned by this Dev Hub org." >&2
316
+ exit 1
317
+ fi
318
+
319
+ echo "package_name=$package_name" >&2
320
+ echo "package_id=$package_id" >&2
321
+
322
+ # Send back the package id as the output from this command
323
+ echo $package_id
324
+ }
325
+
326
+
327
+ # Function to ensure sfdx-project.json has a package alias entry for the package id.
328
+ # Arguments:
329
+ # $1 = dev hub alias that owns the package id
330
+ # $2 = package id, the value for the package alias
331
+
332
+ function add_package_alias() {
333
+
334
+ export local devhub_username=$1
335
+ export local package_id=$2
336
+
337
+ # Retrieve package name for package id
338
+ local cmd="sfdx force:package:list --targetdevhubusername $devhub_username --json" && (echo $cmd >&2)
339
+ local output=$($cmd) && (echo $output | jq '.' >&2)
340
+ package_name=$(jq -r '.result[] | select(.Id == env.package_id) | .Name' <<< $output)
341
+ if [[ -z "$package_name" || $package_name == null ]]; then
342
+ echo "ERROR We could not find a package with id '$package_id' owned by this Dev Hub org." >&2
343
+ exit 1
344
+ fi
345
+
346
+ # Check if the alias property in sfdx-project.json contains key for package name
347
+ cat sfdx-project.json >&2
348
+ local packageAlias=$(jq -r '.packageAliases["'$package_name'"]' < sfdx-project.json)
349
+
350
+ # If no package alias, then add one
351
+ if [[ -z "$packageAlias" || $packageAlias == null ]]; then
352
+ local tmp=$(mktemp)
353
+ jq '.packageAliases["'$package_name'"]="'$package_id'"' sfdx-project.json > $tmp
354
+ mv $tmp sfdx-project.json
355
+ echo "added package alias property to sfdx-project.json" >&2
356
+ cat sfdx-project.json >&2
357
+ fi
358
+
359
+ }
360
+
361
+
362
+ # Function to build a package version.
363
+ # Arguments:
364
+ # $1 = dev hub alias
365
+ # $2 = package id
366
+ # Returns the created package version id.
367
+
368
+ function build_package_version() {
369
+
370
+ export local devhub_username=$1
371
+ export local package_id=$2
372
+ echo "devhub_username=$devhub_username" >&2
373
+ echo "package_id=$package_id" >&2
374
+
375
+ # Create a new package version
376
+ local cmd="sfdx force:package:version:create --targetdevhubusername $devhub_username --package $package_id --installationkeybypass --wait 10 --json" && (echo $cmd >&2)
377
+ local output=$($cmd) && (echo $output | jq '.' >&2)
378
+ local subscriber_package_version_id=$(jq -r '.result.SubscriberPackageVersionId' <<< $output)
379
+
380
+ if [[ -z "$subscriber_package_version_id" || $subscriber_package_version_id == null ]]; then
381
+ echo "ERROR No subscriber package version found for package id '$package_id'" >&2
382
+ exit 1
383
+ fi
384
+
385
+ # Send back the package version id as the output from this command
386
+ echo $subscriber_package_version_id
387
+ }
388
+
389
+
390
+ # Install a package version.
391
+ # Arguments:
392
+ # $1 = target username where to install package version
393
+ # $2 = package version id to install
394
+
395
+ function install_package_version() {
396
+
397
+ local org_username=$1
398
+ local package_version_id=$2
399
+
400
+ echo "org_username=$org_username" >&2
401
+ echo "package_version_id=$package_version_id" >&2
402
+
403
+ if [[ -z "$org_username" || $org_username == null ]]; then
404
+ echo "ERROR No org username provided to 'install_package_version' function" >&2
405
+ exit 1
406
+ fi
407
+
408
+ if [[ -z "$package_version_id" || $package_version_id == null ]]; then
409
+ echo "ERROR No package version id provided to 'install_package_version' function" >&2
410
+ exit 1
411
+ fi
412
+
413
+ # install the package
414
+ local cmd="sfdx force:package:install --targetusername $org_username --package $package_version_id --wait 10 --publishwait 10 --noprompt --json" && (echo $cmd >&2)
415
+ local output=$($cmd) && (echo $output | jq '.' >&2)
416
+
417
+ # assert no error response
418
+ local exit_code=$(jq -r '.exitCode' <<< $output) && (echo $exit_code >&2)
419
+ if [[ ( -n "$exit_code" ) && ( $exit_code -gt 0 ) ]]; then
420
+ exit 1
421
+ fi
422
+
423
+ }
424
+
425
+
426
+ # Promote package version.
427
+ # Only required in production.
428
+ # Arguments:
429
+ # $1 = target dev hub that owns the package to promote
430
+ # $2 = package version id to promote
431
+
432
+ function promote_package_version() {
433
+ local devhub_username=$1
434
+ local package_version_id=$2
435
+ echo "devhub_username=$devhub_username" >&2
436
+ echo "package_version_id=$package_version_id" >&2
437
+ local cmd="sfdx force:package:version:promote --targetdevhubusername $devhub_username --package $package_version_id --noprompt --json" && (echo $cmd >&2)
438
+ local output=$($cmd) && (echo $output | jq '.' >&2)
439
+ }
440
+
441
+
442
+ # Populate the URL artifact with HTML to redirect to an environment.
443
+ # Generates the URL to open the given org, and writes it to a file ENVIRONMENT.html to be shared as an artifact between stages.
444
+ # NOTE: This is a tokenized URL and must be kept secret!
445
+ # Arguments:
446
+ # $1 = org alias to get access url to
447
+ # (Assumes you are authorized to that org)
448
+
449
+ function populate_scratch_org_redirect_html() {
450
+
451
+ local org_username=$1
452
+
453
+ if [ ! $org_username ]; then
454
+ echo "ERROR No org username provided to 'populate_scratch_org_redirect_html' function" >&2
455
+ exit 1;
456
+ fi
457
+
458
+ local cmd="sfdx force:org:open --targetusername $org_username --urlonly --json" && (echo $cmd >&2)
459
+ local output=$($cmd) # don't echo/expose the output which contains the auth url
460
+ local url=$(jq -r ".result.url" <<< $output)
461
+
462
+ local environment_html="<script>window.onload=function(){window.location.href=\"$url\"}</script>"
463
+ echo "$environment_html" > ENVIRONMENT.html
464
+ echo "To browse the scratch org, click 'Browse' under 'Job artifacts' and select 'ENVIRONMENT.html'"
465
+ }
466
+
467
+
468
+ # Create a scratch org and deploy to it.
469
+ # Arguments:
470
+ # $1 = dev hub alias
471
+ # $2 = org name for the scratch org
472
+ # Populates artifacts for the username and the auth url
473
+
474
+ function deploy_scratch_org() {
475
+ local devhub=$1
476
+ local orgname=$2
477
+ assert_within_limits $devhub DailyScratchOrgs
478
+ local scratch_org_username=$(create_scratch_org $devhub $orgname)
479
+ echo $scratch_org_username > SCRATCH_ORG_USERNAME.txt
480
+ get_org_auth_url $scratch_org_username > SCRATCH_ORG_AUTH_URL.txt
481
+ push_to_scratch_org $scratch_org_username
482
+ populate_scratch_org_redirect_html $scratch_org_username
483
+ echo "Deployed to scratch org $username for $orgname"
484
+ }
485
+
486
+
487
+ # Create a new scratch org
488
+ # Arguments:
489
+ # $1 = dev hub alias
490
+ # $2 = org name for the scratch org
491
+ # Populates the artifacts for username and auth url
492
+ # Returns the newly-created scratch org username.
493
+
494
+ function create_scratch_org() {
495
+ local devhub=$1
496
+ export local orgname=$2
497
+
498
+ # Create the scratch org
499
+ local cmd="sfdx force:org:create --targetdevhubusername $devhub --wait 10 --durationdays 30 --definitionfile config/project-scratch-def.json orgName=$orgname --json" && (echo $cmd >&2)
500
+ local output=$($cmd) && (echo $output | jq '.' >&2)
501
+ scratch_org_username="$(jq -r '.result.username' <<< $output)"
502
+ echo $scratch_org_username > SCRATCH_ORG_USERNAME.txt
503
+
504
+ # Get the auth URL
505
+ local cmd="sfdx force:org:display --verbose --targetusername $org_username --json" && (echo $cmd >&2)
506
+ local output=$($cmd)
507
+ org_auth_url="$(jq -r '.result.sfdxAuthUrl' <<< $output)"
508
+ echo $org_auth_url > SCRATCH_ORG_AUTH_URL.txt
509
+
510
+ echo $scratch_org_username
511
+ }
512
+
513
+
514
+ # Get scratch org usernames
515
+ # Arguments:
516
+ # $1 = username or alias for the dev hub
517
+ # $2 = org name value for the scratch orgs
518
+ # Returns one or more usernames (newline-separated)
519
+
520
+ function get_scratch_org_usernames() {
521
+ local devhub=$1
522
+ local orgname=$2
523
+ local result=$(sfdx force:data:soql:query --targetusername $devhub --query "SELECT SignupUsername FROM ScratchOrgInfo WHERE OrgName='$orgname'" --json)
524
+ local usernames=$(jq -r ".result.records|map(.SignupUsername)|.[]" <<< $result)
525
+ echo $usernames
526
+ }
527
+
528
+
529
+ # Push to scratch org.
530
+ # Arguments
531
+ # $1 = scratch org username
532
+
533
+ function push_to_scratch_org() {
534
+
535
+ local scratch_org_username=$1
536
+
537
+ if [ ! $scratch_org_username ]; then
538
+ echo "ERROR No scratch org username provided to 'push_to_scratch_org' function" >&2
539
+ exit 1;
540
+ fi
541
+
542
+ # Create a default package.json if file doesn't exist
543
+ if [ ! -f "package.json" ]; then
544
+ npm init -y
545
+ fi
546
+
547
+ # Check if the scripts property in package.json contains key for "scratch:deploy"
548
+ cat package.json >&2
549
+ local scriptValue=$(jq -r '.scripts["scratch:deploy"]' < package.json)
550
+
551
+ # If no "scratch:deploy" script property, then add one
552
+ if [[ -z "$scriptValue" || $scriptValue == null ]]; then
553
+ local tmp=$(mktemp)
554
+ jq '.scripts["scratch:deploy"]="sfdx force:source:push"' package.json > $tmp
555
+ mv $tmp package.json
556
+ echo "added scratch:deploy script property to package.json" >&2
557
+ cat package.json >&2
558
+ fi
559
+
560
+ # Set the default username so any CLI commands
561
+ # the developer has set in their "test:apex" script in package.json
562
+ # will operate on the correct environment.
563
+ # Afterwards, restore the original default username, just in case it was different.
564
+ local old_org_username=$(jq -r '.result[].value' <<< $(sfdx force:config:get defaultusername --json))
565
+ sfdx force:config:set defaultusername=$scratch_org_username
566
+ npm run scratch:deploy
567
+ sfdx force:config:set defaultusername=$old_org_username
568
+
569
+ }
570
+
571
+
572
+ # Delete all scratch orgs associated with a ref
573
+ # Arguments
574
+ # $1 = dev hub username
575
+ # $2 = org name property of scratch orgs to delete
576
+
577
+ function delete_scratch_orgs() {
578
+ local devhub_username=$1
579
+ local scratch_org_name=$2
580
+ local usernames=$(get_scratch_org_usernames $devhub_username $scratch_org_name)
581
+ for scratch_org_username in $usernames; do
582
+ echo "Deleting $scratch_org_username"
583
+ local cmd="sfdx force:data:record:delete --sobjecttype ScratchOrgInfo --targetusername $devhub_username --where "'"SignupUsername='$scratch_org_username'"'" --json" && (echo $cmd >&2)
584
+ local output=$($cmd) && (echo $output | jq '.' >&2)
585
+ done
586
+ }
587
+
14
588
  test:
15
589
  stage: test
16
590
  script:
591
+ - *sfdx_helpers
592
+ # Decrypt server key
593
+ - openssl aes-256-cbc -d -md md5 -in assets/server.key.enc -out assets/server.key -k $SERVER_KEY_PASSWORD
594
+ - ls -la assets
595
+ # Install jq
596
+ - apt update && apt -y install jq
597
+ - install_salesforce_cli
598
+ # Integrated test
17
599
  - ruby -v
18
600
  - which ruby
19
601
  - gem install bundler rake
20
602
  - bundle install
603
+ - sfdx force:auth:jwt:grant --clientid "$SF_CONSUMER_KEY" --jwtkeyfile assets/server.key --username "$SF_USERNAME" --setdefaultdevhubusername --setalias HubOrg
604
+ - bundle exec rake check_oauth
21
605
  - bundle exec rake leaps:create_soql_objects
22
606
  - bundle exec rake leaps:create_enums
23
- - bundle exec rake
607
+ - bundle exec rake
608
+
609
+ #before_script:
610
+ # - *sfdx_helpers
data/.idea/.rakeTasks CHANGED
@@ -1,7 +1,7 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
2
  <Settings><!--This file was automatically generated by Ruby plugin.
3
3
  You are allowed to:
4
4
  1. Remove rake task
5
5
  2. Add existing rake tasks
6
6
  To add existing rake tasks automatically delete this file and reload the project.
7
- --><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Build leap_salesforce-0.1.16.gem into the pkg directory" fullCmd="build" taksId="build" /><RakeTask description="Check Salesforce OAuth2 authentication is working" fullCmd="check_oauth" taksId="check_oauth" /><RakeTask description="Remove any temporary products" fullCmd="clean" taksId="clean" /><RakeTask description="Remove any generated files" fullCmd="clobber" taksId="clobber" /><RakeTask description="Build and install leap_salesforce-0.1.16.gem into system gems" fullCmd="install" taksId="install" /><RakeGroup description="" fullCmd="" taksId="install"><RakeTask description="Build and install leap_salesforce-0.1.16.gem into system gems without network access" fullCmd="install:local" taksId="local" /></RakeGroup><RakeGroup description="" fullCmd="" taksId="leaps"><RakeTask description="Create objects, fields, enums" fullCmd="leaps:create_all" taksId="create_all" /><RakeTask description="Create Enumeration objects for picklists from Salesforce Metadata" fullCmd="leaps:create_enums" taksId="create_enums" /><RakeTask description="Create Soql Data objects" fullCmd="leaps:create_soql_objects" taksId="create_soql_objects" /></RakeGroup><RakeTask description="Create tag v0.1.16 and build and push leap_salesforce-0.1.16.gem to rubygems.org" fullCmd="release[remote]" taksId="release[remote]" /><RakeTask description="Run RSpec code examples" fullCmd="spec" taksId="spec" /><RakeTask description="Create stubs for dynamic methods so they're picked up by the IDE" fullCmd="stub" taksId="stub" /><RakeGroup description="" fullCmd="" taksId="yard"><RakeTask description="Run YARD doctests" fullCmd="yard:doctest" taksId="doctest" /></RakeGroup><RakeTask description="" fullCmd="default" taksId="default" /><RakeTask description="" fullCmd="release" taksId="release" /><RakeGroup description="" fullCmd="" taksId="release"><RakeTask description="" fullCmd="release:guard_clean" taksId="guard_clean" /><RakeTask description="" fullCmd="release:rubygem_push" taksId="rubygem_push" /><RakeTask description="" fullCmd="release:source_control_push" taksId="source_control_push" /></RakeGroup></RakeGroup></Settings>
7
+ --><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Build leap_salesforce-0.2.0.gem into the pkg directory" fullCmd="build" taksId="build" /><RakeTask description="Check Salesforce OAuth2 authentication is working" fullCmd="check_oauth" taksId="check_oauth" /><RakeTask description="Remove any temporary products" fullCmd="clean" taksId="clean" /><RakeTask description="Remove any generated files" fullCmd="clobber" taksId="clobber" /><RakeTask description="Build and install leap_salesforce-0.2.0.gem into system gems" fullCmd="install" taksId="install" /><RakeGroup description="" fullCmd="" taksId="install"><RakeTask description="Build and install leap_salesforce-0.2.0.gem into system gems without network access" fullCmd="install:local" taksId="local" /></RakeGroup><RakeGroup description="" fullCmd="" taksId="leaps"><RakeTask description="Create objects, fields, enums" fullCmd="leaps:create_all" taksId="create_all" /><RakeTask description="Create Enumeration objects for picklists from Salesforce Metadata" fullCmd="leaps:create_enums" taksId="create_enums" /><RakeTask description="Create Soql Data objects" fullCmd="leaps:create_soql_objects" taksId="create_soql_objects" /></RakeGroup><RakeTask description="Create tag v0.2.0 and build and push leap_salesforce-0.2.0.gem to rubygems.org" fullCmd="release[remote]" taksId="release[remote]" /><RakeTask description="Run RSpec code examples" fullCmd="spec" taksId="spec" /><RakeTask description="Create stubs for dynamic methods so they're picked up by the IDE" fullCmd="stub" taksId="stub" /><RakeGroup description="" fullCmd="" taksId="yard"><RakeTask description="Run YARD doctests" fullCmd="yard:doctest" taksId="doctest" /></RakeGroup><RakeTask description="" fullCmd="default" taksId="default" /><RakeTask description="" fullCmd="release" taksId="release" /><RakeGroup description="" fullCmd="" taksId="release"><RakeTask description="" fullCmd="release:guard_clean" taksId="guard_clean" /><RakeTask description="" fullCmd="release:rubygem_push" taksId="rubygem_push" /><RakeTask description="" fullCmd="release:source_control_push" taksId="source_control_push" /></RakeGroup></RakeGroup></Settings>
@@ -21,7 +21,7 @@
21
21
  <orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.3, RVM: ruby-2.6.0) [gem]" level="application" />
22
22
  <orderEntry type="library" scope="PROVIDED" name="domain_name (v0.5.20190701, RVM: ruby-2.6.0) [gem]" level="application" />
23
23
  <orderEntry type="library" scope="PROVIDED" name="factory_bot (v5.0.2, RVM: ruby-2.6.0) [gem]" level="application" />
24
- <orderEntry type="library" scope="PROVIDED" name="faker (v2.1.2, RVM: ruby-2.6.0) [gem]" level="application" />
24
+ <orderEntry type="library" scope="PROVIDED" name="faker (v2.2.1, RVM: ruby-2.6.0) [gem]" level="application" />
25
25
  <orderEntry type="library" scope="PROVIDED" name="gyoku (v1.3.1, RVM: ruby-2.6.0) [gem]" level="application" />
26
26
  <orderEntry type="library" scope="PROVIDED" name="hashie (v3.6.0, RVM: ruby-2.6.0) [gem]" level="application" />
27
27
  <orderEntry type="library" scope="PROVIDED" name="http-accept (v1.7.0, RVM: ruby-2.6.0) [gem]" level="application" />
@@ -67,7 +67,7 @@
67
67
  <orderEntry type="library" scope="PROVIDED" name="sinatra (v2.0.4, RVM: ruby-2.6.0) [gem]" level="application" />
68
68
  <orderEntry type="library" scope="PROVIDED" name="sinatra-basic-auth (v0.1.0, RVM: ruby-2.6.0) [gem]" level="application" />
69
69
  <orderEntry type="library" scope="PROVIDED" name="sinatra-docdsl (v0.8.6, RVM: ruby-2.6.0) [gem]" level="application" />
70
- <orderEntry type="library" scope="PROVIDED" name="soaspec (v0.2.31, RVM: ruby-2.6.0) [gem]" level="application" />
70
+ <orderEntry type="library" scope="PROVIDED" name="soaspec (v0.2.32, RVM: ruby-2.6.0) [gem]" level="application" />
71
71
  <orderEntry type="library" scope="PROVIDED" name="socksify (v1.7.1, RVM: ruby-2.6.0) [gem]" level="application" />
72
72
  <orderEntry type="library" scope="PROVIDED" name="thor (v0.20.3, RVM: ruby-2.6.0) [gem]" level="application" />
73
73
  <orderEntry type="library" scope="PROVIDED" name="thread_safe (v0.3.6, RVM: ruby-2.6.0) [gem]" level="application" />
@@ -84,4 +84,8 @@
84
84
  <orderEntry type="library" scope="PROVIDED" name="yard-doctest (v0.1.16, RVM: ruby-2.6.0) [gem]" level="application" />
85
85
  <orderEntry type="library" scope="PROVIDED" name="zeitwerk (v2.1.9, RVM: ruby-2.6.0) [gem]" level="application" />
86
86
  </component>
87
+ <component name="RModuleSettingsStorage">
88
+ <LOAD_PATH number="1" string0="$MODULE_DIR$/spec/support" />
89
+ <I18N_FOLDERS number="0" />
90
+ </component>
87
91
  </module>
data/.leap_salesforce.yml CHANGED
@@ -1,5 +1,6 @@
1
- environment: prod
1
+ environment: prod # This is irrelevant for sfdx auth which uses user/alias
2
2
  lib_folder: spec/support
3
+ sfdx: true
3
4
  soql_objects:
4
5
  - Case
5
6
  - Contact