By clicking “Accept All Cookies”, you agree to the storing of cookies on your device to enhance site navigation, analyze site usage, and assist in our marketing efforts. View our Privacy Policy for more information.
Resources
>
Blog
>
Article
An icon of a lock and password prompt.
May 1, 2018

Using Serverless Secrets in Jenkinsfile Pipelines

In this tutorial, I’ll explain how to use Serverless secrets in Jenkinsfile pipelines

In this tutorial, I’ll explain how to use Serverless secrets in Jenkinsfile pipelines. In particular, I’ll explain how to use secrets as environment variables in Serverless applications, store those credentials in Jenkins, and have a Jenkinsfile pipeline deploy a serverless application using Docker that references those newly defined variables.

The example application used to explain these concepts will be the serverless-slack-app1 by John Agan on GitHub. This blog assumes introductory level knowledge of Git, Docker, Serverless, Jenkins, and Jenkinsfile pipelines.

To summarize, here are the goals of this Serverless secrets in Jenkinsfile pipelines tutorial:

  1. Create a basic Jenkinsfile with Docker agents that deploys a Serverless application.
  2. Convert custom variables in serverless.yml to reference environment variables.
  3. Store Serverless secrets in Jenkinfile pipelines.

Step 1: Serverless Jenkinsfile Using Docker

Example Application

If you want to DIY as opposed to just reading, feel free to start with the example application. Keep in mind you’ll need a Jenkins instance with Docker available and an Amazon Web Services account that may incur charges for deploying the serverless application. If you want to spin up a Jenkins container that has Docker and Jenkinsfile pipelines already configured, feel free to use Liatrio’s Alpine-Jenkins image.

Agent

For this Serverless application, we’re just going to use one Docker image as the agent. Since we want to keep it lightweight, we’re going with the Alpine version of Node, which comes in at roughly 71.1MB. (If you aren’t using Docker with Jenkins you can refer to the example on the Jenkins CI GitHub wiki that doesn’t use Docker.)

We’re also going to need to be running as root in the container to properly run Serverless commands, so we’ll specify running as root in the arguments.

Since we’re only using one image throughout the whole pipeline, we can define it just once in the beginning of the pipeline.

Environment

For the environment of the pipeline, we’re going to reference AWS credentials from Jenkins. For details on how to add credentials to Jenkins, refer to the Adding Docker Hub Credentials to Jenkins section from Building with Docker in Jenkins Pipelines. You can also refer to the official documentation.

These environment variables will be referenced automatically when the Serverless application is deployed. However, they will only be referenced automatically if a profile is not defined in serverless.yml. So, go ahead and delete this line in the example application’s serverless.yml file.

With this line removed, the Serverless deployment will search for the default AWS profile, which is what we have defined in the Jenkinsfile.

Simple Serverless Jenkinsfile Using Docker

A Docker icon

To keep things simple, we’re only going to define a Build stage and a Deploy stage for the Jenkinsfile. However, a Test stage could easily be added that ran an npm testcommand. Here’s the resulting Jenkinsfile that will successfully build and deploy our example application.

This deploys our Serverless application! However, this works only if the Slack secrets are defined as text in the serverless.yml file. Let’s fix that.

Step 2: Set Custom Serverless Variables

Reference Environment Variables in Serverless Configuration

As it stands, our example application has required Slack variables defined as custom variables in serverless.yml. We need to change that so the variables are obtained from the environment. Luckily, the Serverless framework has a way to do that outlined in their official docs.

Before, we had something like this where the x’s represented secrets.

We can convert these into environment variable references.

Great! Now our secrets are never defined in code.

Add Credentials to Jenkins

We need to add the SLACK_VERIFICATION_TOKEN, SLACK_CLIENT_ID, and SLACK_CLIENT_SECRET variables as secret text variables in Jenkins so that we can reference them in our Jenkinsfile. If you’re unsure how to do this, refer to the Environment section above.

Step 3: Finish Creating the Environment for Serverless Secrets in Jenkinsfile Pipelines

A lightning bolt icon

Now we need to add the newly defined credentials to our Jenkinsfile pipeline environment. We can do this the same way we defined our AWS credentials.

Serverless Secrets in Jenkinsfile Pipelines

We’ve successfully created a Jenkinsfile that automatically deploys a Serverless application using custom secrets stored in Jenkins. If you want to see all of the code implemented in this Serverless secrets in Jenkinsfile pipelines tutorial (including the complete serverless.yml and Jenkinsfile), please check out the GitHub repository.

If you run into any issues, leave a comment below or tweet us @liatrio.

Latest From Our Blog

who is liatrio?

the Enterprise Modernization Consultancy

Enterprises need consulting that will actually challenge them, drive them to succeed, and own their own destiny.

Modern challenges require more than just tools and technology — It's about evolving how you operate, think, and deliver. Our unique combination of modern engineering talent combined with transformational practices enables enterprises to achieve long term success in their digital transformation journeys. That's why we're not just any DevOps Consultancy — it's why we're THE Enterprise DevOps Consultancy.

Ready to get started?

Contact Us

We'd love to learn more about your project and determine how we can help out.