All Downloads are FREE. Search and download functionalities are using the official Maven repository.

liquibase.examples.yaml.liquibase.advanced.flowfile.yaml Maven / Gradle / Ivy

There is a newer version: 4.30.0
Show newest version
##########           LIQUIBASE FLOW FILE               ##########
##########  learn more http://docs.liquibase.com/flow  ##########

## NOTE: This is an advanced example flowfile, compared to the other sample at examples/liquibase.flowfile.yaml
#### HOW TO USE THIS FILE:
#### example for CLI: liquibase flow --flow-file=liquibase.advanced.flowfile.yaml
#### example for ENV Var: LIQUIBASE_FLOW_FLOW_FILE=liquibase.advanced.flowfile.yaml

## Advanced options show in this file include:
#### non-default name of 'liquibase.advanced.flowfile.yaml' (use by setting flowfile property to this name)
#### use of 'include' to inject namespaced yaml files of key: val variables
#### use of globalVariables and stageVariables
#### use of globalArgs and cmdArgs
#### use of property substitution
#### use of a nested flowfile (in this case in the endStage, but could be elsewhere)
#### use of if: conditional which allows a -type: shell or -type: liquibase command to run
###### In the example below, we set an environment variable LIQUIBASE_CURRENT_TARGET, such as 'export LIQUIBASE_CURRENT_TARGET=dev'
###### This could be determined dynamically, of course, from the build tools, bu tthis is simpler for this example "if:" conditional
#### use of shell commands in a -type: shell block.
######  command: bash -c "the shell command || and its chained commands && go in the quotes"
########
#### POTENTIAL use of environment variables:
######  DATETIME STAMP
######## In this file, you could replace ${FLOWVARS.THISDATE} with an env var, such as ${LIQUIBASE_THISDATE} set via .bash_profile
######## for example 'export LIQUIBASE_THISDATE=$( date +'%Y-%m-%dT%H-%M-%S' )'


## Bring in and namespace an external file with yaml 'key: val' pairs for use in this file
## The variables will be used as ${namespace.variablename}, seen in this example as ${FLOWVARS.PROJNAME}
include:
  FLOWVARS: liquibase.flowvariables.yaml



## Set up some global variables for property substitution in ANY stage
globalVariables:
  DIRNAME: "./${FLOWVARS.PROJNAME}_${FLOWVARS.THISDATE}"
  STATUSFILE: "status.txt"
  UPDATELOG: "update.log"
  HISTORYFILE: "history.txt"


## Start of the stages.
stages:

  ## A prep stage. There can be more than one stage if desired.
  stage-prep:

    actions:

      - type: shell
        command: bash -c "mkdir -p ${DIRNAME}"


  ## Another stage.
  stage-dowork:

    ## set up vars for property substitution in THIS stage only
    stageVariables:

      VERBOSESTATE: TRUE


    actions:
      #
      # Do a validate command
      #
      - type: liquibase
        command: validate

      #
      # Tell me what is pending a deployment
      #
      - type: shell
        command: bash -c "liquibase --show-banner false --outputfile ./${DIRNAME}/${STATUSFILE} status --verbose ${VERBOSESTATE}"

          # This is the structured way to setup a liquibase command, if you dont want to run it as one 'bash -c' command
          #- type: liquibase
          #  command: status
          #  globalArgs:
          #    outputfile: "${DIRNAME}/${STATUSFILE}"
          #    showbanner: false
          #  cmdArgs: {verbose: "${VERBOSESTATE}"




      #
      # And then save a version in detail, if env var LIQUIBASE_FILE_OUTPUT == 1
      #
      - type: shell
        command: bash -c "echo 'LIQUIBASE_ env vars ' && env | grep 'LIQUIBASE_' "

      - type: liquibase
        ## if this var LIQUIBASE_CURRENT_TARGET is "dev", then the updatesql will run
        if: "${LIQUIBASE_CURRENT_TARGET} == dev"
        command: updatesql
        globalArgs: {outputfile: "${DIRNAME}/${UPDATELOG}"}

      - type: shell
        ## if this var LIQUIBASE_CURRENT_TARGET is not "dev", then the message will be displayed
        if: "${LIQUIBASE_CURRENT_TARGET} != dev"
        command: echo "No output files created. Set env var LIQUIBASE_CURRENT_TARGET to dev to trigger file creation."



      #
      # Quality Checks for changelog
      #
      - type: liquibase
        command: checks run
        cmdArgs: {checks-scope: changelog}

      #
      # Run update
      #
      - type: liquibase
        command: update


      #
      # Quality Checks for database
      #
      - type: liquibase
        command: checks run
        cmdArgs: {checks-scope: database}


      #
      # Create a history file
      #
      - type: liquibase
        command: history
        globalArgs: {outputfile: "${DIRNAME}/${HISTORYFILE}"}



## The endStage ALWAYS RUNS.
## So put actions here which you desire to perform whether previous stages' actions succeed or fail.
## If you do not want any actions to ALWAYS RUN, simply delete the endStage from your flow file.

endStage:
  actions:
    - type: liquibase
      ## Notice this is a flow command in a flow file, and it called a 'nested' flowfile, which in this case lives in the same dir, but could be elsewhere
      command: flow
      cmdArgs: {flowfile: liquibase.endstage.flow}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy