├── CODEOWNERS
├── CONTRIBUTING-ARCHIVED.md
├── force-app
└── main
│ └── default
│ └── classes
│ ├── MyClass.cls
│ ├── MyClass.cls-meta.xml
│ ├── MyTest.cls-meta.xml
│ └── MyTest.cls
├── .gitignore
├── package-sfdx-project.json
├── config
└── project-scratch-def.json
├── sfdx-project.json
├── .gitlab-ci.yml
├── assets
└── server.key.enc
├── README.md
└── LICENSE
/CODEOWNERS:
--------------------------------------------------------------------------------
1 | # Comment line immediately above ownership line is reserved for related gus information. Please be careful while editing.
2 | #ECCN:Open Source
3 |
--------------------------------------------------------------------------------
/CONTRIBUTING-ARCHIVED.md:
--------------------------------------------------------------------------------
1 | # ARCHIVED
2 |
3 | This project is `Archived` and is no longer actively maintained;
4 | We are not accepting contributions or Pull Requests.
5 |
6 |
--------------------------------------------------------------------------------
/force-app/main/default/classes/MyClass.cls:
--------------------------------------------------------------------------------
1 | public with sharing class MyClass {
2 | public MyClass() {
3 |
4 | }
5 |
6 | public String getAppVersion() {
7 | return '1.0.0';
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .classpath
2 | .DS_Store
3 | .sfdx
4 | .project
5 | .salesforce
6 | node_modules
7 | .idea
8 | .tern-project
9 | .settings
10 | selenium-client-jars/
11 | test/artifacts
12 | assets/server.key
--------------------------------------------------------------------------------
/force-app/main/default/classes/MyClass.cls-meta.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 39.0
4 | Active
5 |
6 |
--------------------------------------------------------------------------------
/force-app/main/default/classes/MyTest.cls-meta.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 39.0
4 | Active
5 |
6 |
--------------------------------------------------------------------------------
/package-sfdx-project.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageDirectories": [
3 | {
4 | "path": "force-app",
5 | "default": true
6 | }
7 | ],
8 | "namespace": "",
9 | "sfdcLoginUrl": "https://login.salesforce.com",
10 | "sourceApiVersion": "44.0"
11 | }
--------------------------------------------------------------------------------
/config/project-scratch-def.json:
--------------------------------------------------------------------------------
1 | {
2 | "orgName": "CI Example",
3 | "edition": "Developer",
4 | "settings": {
5 | "lightningExperienceSettings": {
6 | "enableS1DesktopEnabled": true
7 | },
8 | "mobileSettings": {
9 | "enableS1EncryptedStoragePref2": false
10 | }
11 | }
12 | }
--------------------------------------------------------------------------------
/force-app/main/default/classes/MyTest.cls:
--------------------------------------------------------------------------------
1 | @isTest
2 | private class MyTest {
3 |
4 | @isTest
5 | static void myUnitTest() {
6 | MyClass demo = new MyClass();
7 | System.assertEquals(demo.getAppVersion(), '1.0.0');
8 | // Uncomment the following line to cause a build failure
9 | // System.assert(false);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/sfdx-project.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageDirectories": [
3 | {
4 | "path": "force-app",
5 | "default": true
6 | },
7 | {
8 | "path": "force-app/main/default",
9 | "package": "GitLab CI",
10 | "versionName": "GitLab CI - Winter '19",
11 | "versionNumber": "1.0.0.NEXT",
12 | "default": false
13 | }
14 | ],
15 | "namespace": "",
16 | "sfdcLoginUrl": "https://login.salesforce.com",
17 | "sourceApiVersion": "44.0",
18 | "packageAliases": {
19 | "GitLab CI": "0Ho0N000000CaT3SAK",
20 | "GitLab CI@1.0.0-1": "04t0N000001E1ksQAC"
21 | }
22 | }
--------------------------------------------------------------------------------
/.gitlab-ci.yml:
--------------------------------------------------------------------------------
1 | #
2 | # Download the Salesforce CLI and install it
3 | #
4 | before_script:
5 | # Install jq
6 | - apt update && apt -y install jq
7 |
8 | # Setup SFDX environment variables
9 | - export CLIURL=https://developer.salesforce.com/media/salesforce-cli/sfdx/channels/stable/sfdx-linux-x64.tar.xz
10 | - export SFDX_AUTOUPDATE_DISABLE=false
11 | - export SFDX_USE_GENERIC_UNIX_KEYCHAIN=true
12 | - export SFDX_DOMAIN_RETRY=300
13 | - export SFDX_DISABLE_APP_HUB=true
14 | - export SFDX_LOG_LEVEL=DEBUG
15 | - export ROOTDIR=force-app/main/default/
16 | - export TESTLEVEL=RunLocalTests
17 | - export PACKAGENAME=0Ho1U000000CaUzSAK
18 | - export PACKAGEVERSION=""
19 |
20 | # Create sfdx directory
21 | - mkdir ~/sfdx
22 |
23 | # Install Salesforce CLI
24 | # By default, the script installs the current version of Salesforce CLI. To install the release candidate, set the DX_CLI_URL_CUSTOM local variable to the appropriate URL
25 | - wget -qO- ${DX_CLI_URL_CUSTOM-$CLIURL} | tar xJ -C ~/sfdx --strip-components 1
26 | - export PATH=~/sfdx/bin:$PATH
27 |
28 | # Output CLI version and plug-in information
29 | - sfdx --version
30 | - sfdx plugins --core
31 |
32 | # Decrypt server key
33 | - openssl enc -nosalt -aes-256-cbc -d -in assets/server.key.enc -out assets/server.key -base64 -K $DECRYPTION_KEY -iv $DECRYPTION_IV
34 |
35 | #
36 | # Deploy metadata to scratch org
37 | #
38 | deploy:
39 | script:
40 | # Authenticate to the Dev Hub using the server key
41 | - sfdx force:auth:jwt:grant --clientid $HUB_CONSUMER_KEY --jwtkeyfile assets/server.key --username $HUB_USER_NAME --setdefaultdevhubusername --setalias HubOrg
42 |
43 | # Create scratch org
44 | - sfdx force:org:create --targetdevhubusername HubOrg --setdefaultusername --definitionfile config/project-scratch-def.json --setalias ciorg --wait 10 --durationdays 1
45 | - sfdx force:org:display --targetusername ciorg
46 |
47 | # Push source to scratch org
48 | - sfdx force:source:push --targetusername ciorg
49 |
50 | # Run unit tests in scratch org
51 | - sfdx force:apex:test:run --targetusername ciorg --wait 10 --resultformat tap --codecoverage --testlevel $TESTLEVEL
52 |
53 | # Delete scratch org
54 | - sfdx force:org:delete --targetusername ciorg --noprompt
55 |
56 | # Create package version
57 | - PACKAGEVERSION="$(sfdx force:package:version:create --package $PACKAGENAME --installationkeybypass --wait 10 --json --targetdevhubusername HubOrg | jq '.result.SubscriberPackageVersionId' | tr -d '"')"
58 | - echo ${PACKAGEVERSION}
59 |
60 | # Create scratch org
61 | - sfdx force:org:create --targetdevhubusername HubOrg --setdefaultusername --definitionfile config/project-scratch-def.json --setalias installorg --wait 10 --durationdays 1
62 | - sfdx force:org:display --targetusername installorg
63 |
64 | # Install package in scratch org
65 | - sfdx force:package:install --package $PACKAGEVERSION --publishwait 10 --wait 10 --targetusername installorg
66 |
67 | # Run unit tests in scratch org
68 | - sfdx force:apex:test:run --targetusername installorg --wait 10 --resultformat tap --codecoverage --testlevel $TESTLEVEL
69 |
70 | # Delete scratch org
71 | - sfdx force:org:delete --targetusername installorg --noprompt
72 |
--------------------------------------------------------------------------------
/assets/server.key.enc:
--------------------------------------------------------------------------------
1 | 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
69 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # sfdx-gitlab-package
2 |
3 | For a fully guided walkthrough of setting up and configuring continuous integration using scratch orgs and Salesforce CLI, see the [Continuous Integration Using Salesforce DX](https://trailhead.salesforce.com/modules/sfdx_travis_ci) Trailhead module.
4 |
5 | This repository shows one way you can successfully use scratch orgs to create new package versions with GitLab CI/CD. We make a few assumptions in this README. Continue only if you have completed these critical configuration prerequisites.
6 |
7 | - You know how to set up your GitLab repository with GitLab CI/CD. (Need help? See the GitLab [Getting Started guide](https://docs.gitlab.com/ee/ci/README.html).)
8 | - You have properly set up the JWT-based authorization flow (headless). We recommended using [these steps for generating your self-signed SSL certificate](https://devcenter.heroku.com/articles/ssl-certificate-self).
9 |
10 | ## Getting Started
11 |
12 | 1) Make sure that you have Salesforce CLI installed. Run `sfdx force --help` and confirm you see the command output. If you don't have it installed, you can download and install it from [here](https://developer.salesforce.com/tools/sfdxcli).
13 |
14 | 2) [Mirror](https://docs.gitlab.com/ee/workflow/repository_mirroring.html) this repo in to your GitLab account.
15 |
16 | 3) Clone your mirrored repo locally: `git clone https://gitlab.com//sfdx-gitlab-package.git`
17 |
18 | 4) Set up a JWT-based auth flow for the target orgs that you want to deploy to. This step creates a `server.key` file that is used in subsequent steps.
19 | (https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_auth_jwt_flow.htm)
20 |
21 | 5) Confirm that you can perform a JWT-based auth: `sfdx force:auth:jwt:grant --clientid --jwtkeyfile server.key --username --setdefaultdevhubusername`
22 |
23 | **Note:** For more info on setting up JWT-based auth, see [Authorize an Org Using the JWT-Based Flow](https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_auth_jwt_flow.htm) in the [Salesforce DX Developer Guide](https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev).
24 |
25 | 6) From your JWT-based connected app on Salesforce, retrieve the generated `Consumer Key`.
26 |
27 | 7) Set up GitLab CI/CD [environment variables](https://gitlab.com/help/ci/variables/README#variables) for your Salesforce `Consumer Key` and `Username`. Note that this username is the username that you use to access your Salesforce org.
28 |
29 | Create an environment variable named `HUB_CONSUMER_KEY` and set it as protected.
30 |
31 | Create an environment variable named `HUB_USER_NAME` and set it as protected.
32 |
33 | **Note:** Setting the variables as protected requires that you set the branch to protected as well.
34 |
35 | 8) Encrypt and store your `server.key` using the instructions below.
36 | ***IMPORTANT!*** - For security reasons, don't store the `server.key` within the project.
37 |
38 | 1. First, generate a `key` and an initializtion vector (`iv`) to encrypt your `server.key` file locally
39 | (CircleCI will use the them to decrypt your `server.key` in the build environment).
40 |
41 | ```bash
42 | $ openssl enc -aes-256-cbc -k -P -md sha1 -nosalt
43 | ```
44 |
45 | 2. Make note of the `key` and `iv` values output to the screen. You'll use them to encrypt your `server.key` in the next step.
46 |
47 | 3. Encrypt the `server.key` using the newly generated `key` and `iv` values. Use the `key` and `iv` values *only once*, and don't use them to encrypt more than the `server.key`. While you can re-use this pair to encrypt other things, it's considered a security violation to do so. Every time you run the command above, a new `key` and `iv` value is generated. You can't regenerate the same pair, so if you lose these values you'll need to generate new ones and encrypt again.
48 |
49 | ```bash
50 | $ openssl enc -nosalt -aes-256-cbc -in server.key -out assets/server.key.enc -base64 -K -iv
51 | ```
52 | This command replaces the existing `server.key.enc` with your encrypted version.
53 |
54 | 9) Set up GitLab CI/CD [environment variable](https://gitlab.com/help/ci/variables/README#variables) The `key` and `iv` used to encrypt your `server.key` file.
55 |
56 | Create an environment variable named `DECRYPTION_KEY` and set it as protected.
57 |
58 | Create an environment variable named `DECRYPTION_IV` and set it as protected.
59 |
60 | **Note:** Setting the variables as protected requires that you set the branch to protected as well.
61 |
62 |
63 | 10) Copy all the contents of `package-sfdx-project.json` into `sfdx-project.json` and save.
64 |
65 | 11) Create the sample package.
66 |
67 | `sfdx force:package:create --path force-app/main/default/ --name "GitLab CI" --description "GitLab CI Package Example" --packagetype Unlocked`
68 |
69 | 12) Create the first package version.
70 |
71 | `sfdx force:package:version:create --package "GitLab CI" --installationkeybypass --wait 10 --json --targetdevhubusername HubOrg`
72 |
73 | 13) In the `.gitlab-ci.yml` file, update the value in the `PACKAGENAME` variable to be Package ID in your `sfdx-project.json` file. This ID starts with `0Ho`.
74 |
75 | 14) Commit the updated `sfdx-project.json` and `.gitlab-ci.yml` files.
76 |
77 | Now you're ready to go! When you commit and push a change, your change kicks off a GitLab CI build.
78 |
79 | Enjoy!
80 |
81 | ## Contributing to the Repository ###
82 |
83 | If you find any issues or opportunities for improving this repository, fix them! Feel free to contribute to this project by [forking](http://help.github.com/fork-a-repo/) this repository and making changes to the content. Once you've made your changes, share them back with the community by sending a pull request. Please see [How to send pull requests](http://help.github.com/send-pull-requests/) for more information about contributing to GitHub projects.
84 |
85 | ## Reporting Issues ###
86 |
87 | If you find any issues with this demo that you can't fix, feel free to report them in the [issues](https://github.com/forcedotcom/sfdx-gitlab-package/issues) section of this repository.
88 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "{}"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright {yyyy} {name of copyright owner}
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------