Search code examples
environment-variablescirclecicircleci-2.0circleci-workflows

CircleCI insert environment variable


I created my first pipeline yesterday and I wanted to replace a placeholder in my bundle.gradle file with the CIRCLE_BUILD_NUM environment variable. The only method I found find was writing my own ‘sed’ command and executing the regex in a run statement. This worked fine to get up and running, since there was only one variable to replace, however this method obviously won’t scale, down the road. Is there a CircleCI feature/orb or other method to do a more comprehensive placeholder/envar swap throughout my project?

- run:
    name: Increment build id
    command: sed "s/_buildNum/${CIRCLE_BUILD_NUM}/g" -i build.gradle

EDIT

Looking for a utility/tools/orb/CircleCI best practice similar to what they have in Azure DevOps (Jenkins performs a similar feature as well): simply replace all placeholders in specified files with environment variables matching the same name.

https://marketplace.visualstudio.com/items?itemName=qetza.replacetokens


Solution

  • There is envtpl tool with myriad of implementation in various languages. It allows for interpolating variables in templates with values set in environment variables.

    The following described command installs an implementation in Rust.

    commands:
      replace-vars-from-env:
        description: Replace variables in file from environment variables.
        parameters:
           filename:
             type: string
        steps:
          - run:
             name: Replace variables in build.gradle file
        command: |
          if ! [ -x /usr/local/bin/envtpl ]; then
            curl -L https://github.com/niquola/envtpl/releases/download/0.0.3/envtpl.linux > /usr/local/bin/envtpl
            chmod +x /usr/local/bin/envtpl
          fi
          mv <<parameters.filename>> <<parameters.filename>>.tpl 
          cat <<parameters.filename>>.tpl | envtpl > <<parameters.filename>>
          rm <<parameters.filename>>
    

    and use that in other commands or as a part of your jobs. For example,

    executors:
      linux:
        machine:
          image: ubuntu-1604:201903-01
    
    jobs:
      build:
        executor: linux
        steps:
          - replace-vars-from-env:
              filename: build.gradle