feat: theme customization#387
Merged
chance-coleman merged 20 commits intomainfrom Mar 31, 2025
Merged
Conversation
5 tasks
slaskawi
commented
Mar 26, 2025
c1dd82f to
066e801
Compare
mjnagel
reviewed
Mar 26, 2025
Collaborator
mjnagel
left a comment
There was a problem hiding this comment.
Approach looks good - small docs comments + one question on file names.
Co-authored-by: Micah Nagel <micah.nagel@defenseunicorns.com>
Co-authored-by: Micah Nagel <micah.nagel@defenseunicorns.com>
Co-authored-by: Micah Nagel <micah.nagel@defenseunicorns.com>
slaskawi
commented
Mar 28, 2025
slaskawi
added a commit
to defenseunicorns/uds-core
that referenced
this pull request
Mar 28, 2025
## Description This Pull Request introduces basic theme customization capabilities. The customization is opinionated and limited to: * Background image * Logo * Footer * Favicon This Pull Request depends on defenseunicorns/uds-identity-config#387 ## Related Issue Fixes defenseunicorns/uds-identity-config#319 ## Type of change - [ ] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [ ] Other (security config, docs update, etc) ## Steps to Validate 1. Run `uds run dev-setup && npx pepr deploy --confirm` 2. Create a Keycloak Namespace and the ConfigMap with the images: ```yaml apiVersion: v1 kind: Namespace metadata: name: keycloak labels: name: keycloak --- apiVersion: v1 kind: ConfigMap metadata: name: keycloak-theme-overrides namespace: keycloak binaryData: background.jpg: /9j/4AAQSkZJRgABAQEAAAAAAAD/2wBDAAoHBwkHBgoJCAkLCwoMDxkQDw4ODx4WFxIZJCAmJSMgIyIuKjYp logo.svg: PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIj4KICA8Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI1MCIgZmlsbD0iIzAwMDAwMCIvPgogIDxwYXRoIGQ9Ik0yNTAsNTAgQzEwMCw1MCAwLDEwIDAsMTAgQzEwLDIwIDAsMzAgMCwyMCAiIGZpbGw9IiMwMDAwMDAiLz4KPC9zdmc+Cg== favicon.svg: PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIj4KICA8Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI1MCIgZmlsbD0iIzAwMDAwMCIvPgogIDxwYXRoIGQ9Ik0yNTAsNTAgQzEwMCw1MCAwLDEwIDAsMTAgQzEwLDIwIDAsMzAgMCwyMCAiIGZpbGw9IiMwMDAwMDAiLz4KPC9zdmc+Cg== footer.png: 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 ``` 3. Apply the above to the cluster 4. Modify the Keycloak `values.yaml` and insert: ```yaml themeCustomizations: resources: images: - name: background.jpg configmap: name: keycloak-theme-overrides - name: footer.png configmap: name: keycloak-theme-overrides - name: logo.svg configmap: name: keycloak-theme-overrides - name: favicon.svg configmap: name: keycloak-theme-overrides ``` 6. Deploy Keycloak as usual - `uds run dev-deploy --set LAYER=identity-authorization` 7. Navigate to the `uds-identity-config` project with cloned defenseunicorns/uds-identity-config#387 8. (there's probably a better way, but I'm doing this) Deploy the customized initContainer: 7a. Run `uds run dev-build` 7b. Run `tag docker tag uds-core-config:keycloak ghcr.io/defenseunicorns/uds/identity-config:0.10.2` 7c. Run `k3d image import -c uds ghcr.io/defenseunicorns/uds/identity-config:0.10.2` 7d. Rotate Keycloak Pod 7e. Verify that your Keycloak is running the image from the PR 9. Go to https://sso.uds.dev and noticed changed theme <img width="441" alt="obraz" src="https://github.com/user-attachments/assets/ce334b8a-7626-414a-aa86-b42ac2fb697f" /> ## Checklist before merging - [x] Test, docs, adr added or updated as needed - [x] [Contributor Guide](https://github.com/defenseunicorns/uds-template-capability/blob/main/CONTRIBUTING.md) followed
mjnagel
reviewed
Mar 28, 2025
mjnagel
reviewed
Mar 28, 2025
Collaborator
mjnagel
left a comment
There was a problem hiding this comment.
LGTM overall, validated locally with the test theme customizations as well as some other images. Just the one doc update would be great before we merge.
chance-coleman
approved these changes
Mar 31, 2025
mjnagel
approved these changes
Mar 31, 2025
noahpb
pushed a commit
to defenseunicorns/uds-core
that referenced
this pull request
Apr 2, 2025
## Description This Pull Request introduces basic theme customization capabilities. The customization is opinionated and limited to: * Background image * Logo * Footer * Favicon This Pull Request depends on defenseunicorns/uds-identity-config#387 ## Related Issue Fixes defenseunicorns/uds-identity-config#319 ## Type of change - [ ] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [ ] Other (security config, docs update, etc) ## Steps to Validate 1. Run `uds run dev-setup && npx pepr deploy --confirm` 2. Create a Keycloak Namespace and the ConfigMap with the images: ```yaml apiVersion: v1 kind: Namespace metadata: name: keycloak labels: name: keycloak --- apiVersion: v1 kind: ConfigMap metadata: name: keycloak-theme-overrides namespace: keycloak binaryData: background.jpg: /9j/4AAQSkZJRgABAQEAAAAAAAD/2wBDAAoHBwkHBgoJCAkLCwoMDxkQDw4ODx4WFxIZJCAmJSMgIyIuKjYp logo.svg: PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIj4KICA8Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI1MCIgZmlsbD0iIzAwMDAwMCIvPgogIDxwYXRoIGQ9Ik0yNTAsNTAgQzEwMCw1MCAwLDEwIDAsMTAgQzEwLDIwIDAsMzAgMCwyMCAiIGZpbGw9IiMwMDAwMDAiLz4KPC9zdmc+Cg== favicon.svg: PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIj4KICA8Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI1MCIgZmlsbD0iIzAwMDAwMCIvPgogIDxwYXRoIGQ9Ik0yNTAsNTAgQzEwMCw1MCAwLDEwIDAsMTAgQzEwLDIwIDAsMzAgMCwyMCAiIGZpbGw9IiMwMDAwMDAiLz4KPC9zdmc+Cg== footer.png: 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 ``` 3. Apply the above to the cluster 4. Modify the Keycloak `values.yaml` and insert: ```yaml themeCustomizations: resources: images: - name: background.jpg configmap: name: keycloak-theme-overrides - name: footer.png configmap: name: keycloak-theme-overrides - name: logo.svg configmap: name: keycloak-theme-overrides - name: favicon.svg configmap: name: keycloak-theme-overrides ``` 6. Deploy Keycloak as usual - `uds run dev-deploy --set LAYER=identity-authorization` 7. Navigate to the `uds-identity-config` project with cloned defenseunicorns/uds-identity-config#387 8. (there's probably a better way, but I'm doing this) Deploy the customized initContainer: 7a. Run `uds run dev-build` 7b. Run `tag docker tag uds-core-config:keycloak ghcr.io/defenseunicorns/uds/identity-config:0.10.2` 7c. Run `k3d image import -c uds ghcr.io/defenseunicorns/uds/identity-config:0.10.2` 7d. Rotate Keycloak Pod 7e. Verify that your Keycloak is running the image from the PR 9. Go to https://sso.uds.dev and noticed changed theme <img width="441" alt="obraz" src="https://github.com/user-attachments/assets/ce334b8a-7626-414a-aa86-b42ac2fb697f" /> ## Checklist before merging - [x] Test, docs, adr added or updated as needed - [x] [Contributor Guide](https://github.com/defenseunicorns/uds-template-capability/blob/main/CONTRIBUTING.md) followed
mjnagel
pushed a commit
to BagelLab/uds-core
that referenced
this pull request
Nov 14, 2025
## Description This Pull Request introduces basic theme customization capabilities. The customization is opinionated and limited to: * Background image * Logo * Footer * Favicon This Pull Request depends on defenseunicorns/uds-identity-config#387 ## Related Issue Fixes defenseunicorns/uds-identity-config#319 ## Type of change - [ ] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [ ] Other (security config, docs update, etc) ## Steps to Validate 1. Run `uds run dev-setup && npx pepr deploy --confirm` 2. Create a Keycloak Namespace and the ConfigMap with the images: ```yaml apiVersion: v1 kind: Namespace metadata: name: keycloak labels: name: keycloak --- apiVersion: v1 kind: ConfigMap metadata: name: keycloak-theme-overrides namespace: keycloak binaryData: background.jpg: /9j/4AAQSkZJRgABAQEAAAAAAAD/2wBDAAoHBwkHBgoJCAkLCwoMDxkQDw4ODx4WFxIZJCAmJSMgIyIuKjYp logo.svg: PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIj4KICA8Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI1MCIgZmlsbD0iIzAwMDAwMCIvPgogIDxwYXRoIGQ9Ik0yNTAsNTAgQzEwMCw1MCAwLDEwIDAsMTAgQzEwLDIwIDAsMzAgMCwyMCAiIGZpbGw9IiMwMDAwMDAiLz4KPC9zdmc+Cg== favicon.svg: PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIj4KICA8Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI1MCIgZmlsbD0iIzAwMDAwMCIvPgogIDxwYXRoIGQ9Ik0yNTAsNTAgQzEwMCw1MCAwLDEwIDAsMTAgQzEwLDIwIDAsMzAgMCwyMCAiIGZpbGw9IiMwMDAwMDAiLz4KPC9zdmc+Cg== footer.png: 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 ``` 3. Apply the above to the cluster 4. Modify the Keycloak `values.yaml` and insert: ```yaml themeCustomizations: resources: images: - name: background.jpg configmap: name: keycloak-theme-overrides - name: footer.png configmap: name: keycloak-theme-overrides - name: logo.svg configmap: name: keycloak-theme-overrides - name: favicon.svg configmap: name: keycloak-theme-overrides ``` 6. Deploy Keycloak as usual - `uds run dev-deploy --set LAYER=identity-authorization` 7. Navigate to the `uds-identity-config` project with cloned defenseunicorns/uds-identity-config#387 8. (there's probably a better way, but I'm doing this) Deploy the customized initContainer: 7a. Run `uds run dev-build` 7b. Run `tag docker tag uds-core-config:keycloak ghcr.io/defenseunicorns/uds/identity-config:0.10.2` 7c. Run `k3d image import -c uds ghcr.io/defenseunicorns/uds/identity-config:0.10.2` 7d. Rotate Keycloak Pod 7e. Verify that your Keycloak is running the image from the PR 9. Go to https://sso.uds.dev and noticed changed theme <img width="441" alt="obraz" src="https://github.com/user-attachments/assets/ce334b8a-7626-414a-aa86-b42ac2fb697f" /> ## Checklist before merging - [x] Test, docs, adr added or updated as needed - [x] [Contributor Guide](https://github.com/defenseunicorns/uds-template-capability/blob/main/CONTRIBUTING.md) followed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
This Pull Request introduces basic theme customization capabilities. The customization is opinionated and limited to:
This Pull Request is required for defenseunicorns/uds-core#1382
Related Issue
Fixes #319
Type of change
Steps to Validate
See defenseunicorns/uds-core#1382
Checklist before merging