Sitecore SXA CI/CD Improvements
Saving compiled files in the source code is a bad practice. No one will argue that having either exe
or dll
or minified css
or minified js
is not good for your source control. But I continue to see serialized Sitecore SXA theme files added to source control. Many projects have pre-optimized-min.yml
(or separate main.yml, styles.yml, scripts.yml, etc.
) files saved in source control. And the common explanation, why it is there, is that it is hard to do on CI because it requires Sitecore to get these files. Let's figure out is it really complex and how we can avoid it.
The Problem
Firstly, let's talk about why having exe, dll, minified css, minified js
, and pre-optimized-min.yml
saved in your repository is not good for your project. All companies use version control systems for codebase management. Majorly it is Git. It is an awesome tool that allows the simultaneous work of many developers on the same project. But it works properly only when you don't save compiled (dll, exe
) or transpiled (minified css, minified js
) files. Once you start to save these files in the source control, you start to get conflicts when developers need to merge their changes. It happens because developers can work on different .cs, .js, .css, etc.
files, but these files will be compiled or transpiled into the single file and you will get a conflict there. And pre-optimized-min.yml
is the only serialization of transpiled minified js
or css
. It means that it will cause the same issue. Your developers will struggle with constant source conflicts and will spend time on resolving them. It means that it is better don't have them in source code. And there are 2 solutions, how we can get rid of them.
Solution 1
The easiest solution is to move execution of SXA gulp tasks(buildSass, buildCss, buildJs, cssOptimization, jsOptimization, uploadCss, uploadJs
) to your CI\CD pipeline. You will need:
- Remove all files produced by SXA gulp tasks from source control, including serialized theme files.
- Add execution of SXA gulp tasks to your deployment step
Solution 2
Having pre-optimized-min.yml
means that you already have either Unicorn or TDS in place. And you already delivering content to your environments using serialization. Let's look at content of this file:
---
ID: "bb97e335-fb50-4c14-b0e8-270f0f246f0a"
Parent: "e9eacb5b-ba97-46fb-af75-184cba337e1a"
Template: "962b53c4-f93b-4df9-9821-415c867b8903"
Path: "/sitecore/media library/Themes/Experiment/styles/pre-optimized-min"
DB: master
SharedFields:
- ID: "06d5295c-ed2f-4a54-9bf2-26228d113318"
Hint: __Icon
Value: "-/media/9be3803bcbfd44afaf16a8d2c94f15a2.ashx?h=16&thn=1&w=16"
- ID: "40e50ed9-ba07-4702-992e-a912738d32dc"
Hint: Blob
BlobID: "2afa94b5-0b9a-4319-82a1-8b17a411e275"
Value: 6bGVmdDtjbGVhcjpi..................=
- ID: "6954b7c7-2487-423f-8600-436cb3b6dc0e"
Hint: Size
Value: 72312410
- ID: "6f47a0a5-9c94-4b48-abeb-42d38def6054"
Hint: Mime Type
Value: text/css
- ID: "c06867fe-9a43-4c7d-b739-48780492d06f"
Hint: Extension
Value: css
Languages:
- Language: en
Versions:
- Version: 1
Fields:
- ID: "25bed78c-4957-4165-998a-ca1b52f67497"
Hint: __Created
Value: 20210526T095146Z
- ID: "5dd74568-4d4b-44c1-b513-0af5f4cda34f"
Hint: __Created by
Value: |
sitecore\anton
Almost everything that is present in this file is text. There are only 2 fields that cause merge conflicts: Blob
and Size
. Are we able to fill these 2 fields without Sitecore? Yes, we are! Blob
is base64 encoded content of the file: pre-optimized-min.css
(or pre-optimized-min.js
). And Size
is the size of this file. We can use this PowerShell script to get both these values from pre-optimized-min.css
:
<#
Get source file, convert to base64 string, put into the template, and put into destination
#>
param (
[string]$source,
[string]$destination,
[string]$template
)
$content = [IO.File]::ReadAllText($source)
$bytes = [System.Text.Encoding]::UTF8.GetBytes($content)
$encodedText =[Convert]::ToBase64String($bytes)
$size = (Get-Item $source).length
$templateContent = [IO.File]::ReadAllText($template)
$destinationContent = $templateContent -replace '\${{size}}', $size
$destinationContent = $destinationContent -replace '\${{blob}}', $encodedText
[IO.File]::WriteAllText($destination, $destinationContent)
All additional steps that you need is to create a template, with Blob
and Size
values replaced with ${{blob}}
and ${{size}}
and run this script before Unicorn sync in your CI/CD pipeline.
Conclusion
Adding binary files to the source control is a bad practice. And your serialized SXA theme files are binary files (because of the presence of base64 string). Removing these files from source control and improvement of your CI/CD pipeline will save a lot of time and the mental health of your developers. And they will be grateful for this improvement.