Workday Asset Pipeline
Architect & Developer
2016 - present
In 2016, I started what would become Workday's asset pipeline, responsible for optimizing, testing, publishing, and delivering a library of over 1300 to web, Android, and iOS clients. Over the years, I've evolved and expanded the pipeline as its main owner and architect. Workday's asset pipeline spans nearly the entire length of our expansive stack.
At a glance
1,302 icons
4 icon types
4 platforms (React, Workday’s XpressO, Android, iOS)
4 fonts with subsetted support for Chinese, Korean, and Japanese characters
Our needs
As Workday’s product offerings grew so too did our icon set. By 2016, we had over 500 icons and we encountered growing pains that were seemingly impossible to solve through manual design work.
Exporting
Manually exporting so many assets was no longer reliable, nor scalable for both the design and development teams. We needed a better, more automated way to deliver assets to our developers.
Quality assurance
Using Figma and Sketch as sources of truth meant that our icons could easily be changed or broken. Figma updates sometimes caused asset SVG code to be slightly different, but visually identical. We needed a scalable way to be confident in the integrity of our entire asset library.
Coloring
We needed to deliver icons with components that could be individually colored. This required constructing and applying a consistent usage pattern for designers and developers.
Extensible
Today, we have web (npm), iOS (Carthage), and Android (Maven) clients but we needed to be ready to support any new distribution systems or clients that may come along. We may also add different types of assets but using the same core pipeline.
The pipeline
Today, our assets are managed under a central project called Design Assets that’s built to accommodate for scale using both open source libraries and custom scripts.
Design Assets is a Lerna monorepo on GitHub enterprise. While we now use Figma, we still maintain a set of legacy icons in Sketch. We originally leveraged sketchtool to programmatically export SVG assets from Sketch files. Once we made the move to Figma, Figma's REST API was essential for our bulk exporting work. We used svgo, Jest, and other tools to test, optimize, and publish our icons using a pipeline that is continuously integrated and deployed.
A series of events kick off upon a change:
All assets start at a package that publishes a base format. Currently, our base format is a SVG. We use sketchtool and Figma to export SVGs and svgo, cheerio, and some custom scripts to optimize them.
We perform snapshot testing for every icon using jest-image-snapshot so we can see exactly how our icon sets have changed visually with every commit. We also perform unit testing to ensure icons are usable and have properly formatted names.
SVGs can then be transformed for their respective clients. For web, this may be as simple as adding accessibility attributes. For mobile, we may deliver PNGs or even a platform-specific format such as VectorDrawable (Android).
Icons are once again subject to another set of unit tests specific to their client’s specifications.
Each set of icons is published to the client’s package service (i.e. npm, Carthage, etc.). Clients can get the latest set of icons by simply upgrading their dependencies.
Assets are published to several CDNs.
Documentation is automatically generated that allows both designers and developers to see which icons are currently available.
We have full visibility through this entire process through Jenkins and GitHub status checks.
Ongoing challenges
Mobile
Our vision is to continuously deliver assets to all clients through one pipeline. However, my knowledge and expertise is concentrated on web technologies. I had to rely on collaborators on iOS and Android teams to help me understand their platform's requirements and how to deliver to them.
Expansive stack
Working on assets is particularly challenging because it requires more than a shallow understanding of each part of the stack our asset libraries touch. Workday has a proprietary language (XpressO) to allow developers to build features quickly. Icons are configured and accessed through an exclusive method with XpressO. However, we've also started building bespoke React applications in which icons are consumed in a more typical method through npm. iOS and Android, of course, have their own package management systems.
Technical specs
Carthage
Maven
Artifactory
Sketch
Jenkins
S3
Node.js
Jest
React
Storybook
Emotion
TypeScript
Figma