Search code examples
travis-ci

Travis-ci stages - conditional logic


This is my travis.yml file followed by the latest run https://travis-ci.com/github/harryyy27/allies-art-club:

sudo: required

services:
  - docker

stages:
  - name: before_deploy
    if: branch = master
  - name: before_install
    if: branch != master
  - name: scripts
    if: branch != master

before_install:
  - docker build -t harryyy27/allies_art_club/frontend -f ./client/Dockerfile.dev ./client
  - docker build -t harryyy27/allies_art_club/backend -f ./src/Dockerfile.dev ./src
scripts:
  - docker run -e CI=true harryyy27/allies_art_club/frontend npm test
  - docker run -e CI=true harryyy27/allies_art_club/backend npm test


before_deploy:
  - docker build -t harryyy27/aac-client ./client
  - docker tag harryyy27/aac-client registry.heroku.com/$HEROKU_APP/client
  - docker build -t harryyy27/aac-src ./src
  - docker tag harryyy27/aac-src registry.heroku.com/$HEROKU_APP/src
  - docker build -t harryyy27/aac-nginx ./nginx
  - docker tag harryyy27/aac-nginx registry.heroku.com/$HEROKU_APP/nginx
# Log in to docker CLI
  - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_ID" --password-stdin
  - curl https://cli-assets.heroku.com/install.sh | sh
  - echo "$HEROKU_API" | docker login -u "$HEROKU_USERNAME" --password-stdin registry.heroku.com
deploy:
  skip_cleanup: true
  provider: script
  script:
    docker ps -a;
    docker push harryyy27/aac-client;
    docker push registry.heroku.com/$HEROKU_APP/client;
    docker push harryyy27/aac-src;
    docker push registry.heroku.com/$HEROKU_APP/src;
    docker push harryyy27/aac-nginx;
    docker push registry.heroku.com/$HEROKU_APP/nginx;
    heroku container:release client src nginx --app $HEROKU_APP;
  on:
    branch: master

However, I'd like to know why my branch != master does not work for the before_install and scripts stages. It runs both of these stages even on master branch after merging my pull request.

(I am aware of the other issues with this travis.yml, I have raised them as separate questions)


Solution

  • Resolved this, set it up differently though. See below. I think the stages have to be set up with the jobs/include object as seen below

    see new travis.yml

    sudo: required
    language: generic
    
    services:
      - docker
    
    stages:
      - dev
      - prod
    
    jobs:
      include:
        - stage: dev
          if: NOT(branch=master)
          scripts:
            - docker build -t harryyy27/allies_art_club/frontend -f ./client/Dockerfile.dev ./client
            - docker build -t harryyy27/allies_art_club/backend -f ./src/Dockerfile.dev ./src
            - docker run -e CI=true harryyy27/allies_art_club/frontend npm test
            - docker run -e CI=true harryyy27/allies_art_club/backend npm test
        - stage: prod
          if: branch=master
          before_deploy:
            - docker build -t harryyy27/aac-client ./client
            - docker tag harryyy27/aac-client registry.heroku.com/$HEROKU_APP/client
            - docker build -t harryyy27/aac-src ./src
            - docker tag harryyy27/aac-src registry.heroku.com/$HEROKU_APP/src
            - docker build -t harryyy27/aac-nginx ./nginx
            - docker tag harryyy27/aac-nginx registry.heroku.com/$HEROKU_APP/nginx
          # Log in to docker CLI
            - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_ID" --password-stdin
            - curl https://cli-assets.heroku.com/install.sh | sh
            - echo "$HEROKU_API" | docker login -u "$HEROKU_USERNAME" --password-stdin registry.heroku.com
          deploy:
            skip_cleanup: true
            provider: script
            script:
              docker ps -a;
              docker push harryyy27/aac-client;
              docker push registry.heroku.com/$HEROKU_APP/client;
              docker push harryyy27/aac-src;
              docker push registry.heroku.com/$HEROKU_APP/src;
              docker push harryyy27/aac-nginx;
              docker push registry.heroku.com/$HEROKU_APP/nginx;
              heroku container:release client src nginx --app $HEROKU_APP;
    

    ***note I had to add language to avoid a Rakefile error. Best to use generic here as using node_js will prompt travis to look for a package.json and and a "make test" error will occur