What are CI/CD?
CI/CD stands for Continuous Integration (CI) and Continuous Deployment/Delivery (CD). It is a set of modern software development practices that help teams deliver code faster, with fewer errors, and in an automated way.
Continuous Integration (CI)
CI is the practice of frequently merging developers’ code changes into a shared repository, where automated tests run to detect issues early. This ensures that code changes integrate smoothly and don’t break existing functionality.
CI is not needed in Simplifier, because Simplifier avoids merge conflicts due
- Realtime Collaboration within the Application Builder
- Modularization of Applications
- Use only one active Version of Connector – because an Interface has always to be the current version of the source System, otherwise you will run into problems with data transfers
So in this Article, we describe the Continuous Delivery (CD) Process.
Continuous Delivery (CD)
CD takes CI a step further by automatically preparing code for deployment to production or staging environments. However, deployment still requires manual approval.
Prerequisites
Before you start, create Users on your source and target instances (read more) and assign the ‘SF_Administrator’ Role (read more).
Also, create at least one Release for an Application (read more). Adapt the linked Transport Package to your needs (read more).
To get the required Application-ID to the relevant Applications, open your browser’s Dev tools before opening the Application overview on your instance. Search for call ‘application’ in Network tab and see the response for the complete Application list with ID and name.
STEP 1: Export Transport from the source instance
To get the required transport file, you have to get a valid authentication token from the source instance, get the latest Release to the Application, and finally download the Transport file to that Release.
1. Get an authentication token for the source instance
First, get a valid Simplifier Token by using the created User on the source instance. You have to use the received Simplifier token as a header param in the following requests.
cURL example:
curl -L -X POST 'https://<SOURCE-INSTANCE-URL>/genToken/' -H 'Content-Type: application/json' -d '{"user":"<USERNAME>","pass":"<PASSWORD>"}'
Result example:
{ "result": "<SIMPLIFIERTOKEN>", "success": true }
2. Get the Release list to an Application
Now get the release list to the application. Get the highest release number (see property ‘num’) from the result-array.
cURL example:
curl -L -X GET 'https://<SOURCE-INSTANCE-URL>/UserInterface/api/release/AppReleaseList?appId=<APPLICATION-ID>' -H 'Simplifiertoken: <SIMPLIFIERTOKEN>'
Result example:
{ "result": [ { "metadata": { "releaseNote": "Added bonus system for ideas", "releaseNum": 2, "appName": "IdeaManagement", "createDate": "2025-02-26T09:03:06.530+01:00", "transportCollectionName": "IdeaManagement_TP", "publisher": "b8de15bf-883c-4ca8-bcdb-b455352a8e11", "publisherEmail": "klara.fall@simplifier.io", "publisherFullName": "Klara Fall", "simVersion": "2501.5" }, "num": 2, "transportRequestName": "Default0000000003" }, { "metadata": { "releaseNote": "Initial Release", "releaseNum": 1, "appName": "IdeaManagement", "createDate": "2025-02-26T08:58:07.582+01:00", "transportCollectionName": "IdeaManagement_TP", "publisher": "b8de15bf-883c-4ca8-bcdb-b455352a8e11", "publisherEmail": "klara.fall@simplifier.io", "publisherFullName": "Klara Fall", "simVersion": "2501.5" }, "num": 1, "transportRequestName": "Default0000000002" } ], "success": true }
2. Download the Transport file
Next, download and store the Transport file.
cURL example:
curl -L -X GET 'https://<SOURCE-INSTANCE-URL>/UserInterface/api/release/AppReleaseDownloader?appId=<APPLICATION-ID>&version=<RELEASE-NUMBER>' -H 'Simplifiertoken: <SIMPLIFIERTOKEN>' -o
STEP 2: Import Transport to the target instance
To import the downloaded Transport file, you have to get an authentication token, upload the file, and import it to the target instance.
1. Get an authentication token for the target instance
First, get a valid Simplifier Token by using the created User on the target instance. You have to use the received Simplifier token as a header param in the following requests.
cURL example:
curl -L -X POST 'https://<TARGET-INSTANCE-URL>/genToken/' -H 'Content-Type: application/json' -d '{"user":"<USERNAME>","pass":"<PASSWORD>"}'
Result example:
{ "result": "<SIMPLIFIERTOKEN>", "success": true }
2. Upload the Transport file
Split the downloaded file into chunks. We recommend using 8 MB-sized chunks. Each chunk has to be uploaded via the html5uploader.
cURL example:
curl -L -X POST 'https://<TARGET-INSTANCE-URL>/UserInterface/api/html5Uploader' -H 'Simplifiertoken: <SIMPLIFIERTOKEN>' -H 'Content-Type: application/json' -d '{"session":"<UPLOAD-SESSION>","start":<START-MB-CHUNK>,"end":<END-MB-CHUNK>,"dataSize":<CHUNK-SIZE>, "data":<CHUNKED-DATA>,"num":<CURRENT-CHUNK>,"count":<TOTAL-CHUNKS>}'
Result example:
{ "result": "", "success": true }
3. Import the Transport file
After the upload is finished, trigger the import of the Transport. We recommend using the import strategy ‘OVERWRITEIFCHANGED’. It only imports new artifacts and overwrites changed artifacts, but skips the import of unchanged ones.
cURL example:
curl -L -X POST 'https://<TARGET-INSTANCE-URL>/UserInterface/api/transport/import' -H 'Simplifiertoken: <SIMPLIFIERTOKEN>' -H 'Content-Type: application/json' -d '{"uploadSession":"<UPLOAD-SESSION>","strategy":"<IMPORT-STRATEGY>"}'
Result example:
{ "processId": <PROCESS-ID> }
Get the import status in intervals. As soon as the import is finished, the status of property ‘statusI18n’ has one of the following values:
- ‘transportImportStatus_Finished’ -> Successfully finished
- ‘transportImportStatus_Error’ -> There was at least one error during the import
- ‘transportImportStatus_PostProcessFailed’ -> All artifacts have been imported. Put there was an error during post-processing (e.g. App Deployment) of at least one artifact
cURL example:
curl -L -X GET 'https://<TARGET-INSTANCE-URL>/UserInterface/api/transport/import/status/<PROCESS-ID>' -H 'Simplifiertoken: <SIMPLIFIERTOKEN>' -H 'Content-Type: application/json' -d '{"uploadSession":"<UPLOAD-SESSION>","strategy":"<IMPORT-STRATEGY>"}'
Result example:
{ "processId": <PROCESS-ID>, "importer": <USER-ID>, "statusI18n": <STATUS>, "changed": "2025-02-26T11:31:14.916+01:00" }