Как выполнить шаг 'before_deploy' Travis CI только один раз для конфигурации с несколькими развертываниями? - PullRequest
0 голосов
/ 28 июня 2018

В моем проекте я настроил процесс сборки Travis CI, который выпускает новые версии артефакта в релизы Github. Мой .travis.yml файл:

language: java
jdk: oraclejdk8

branches:
  only:
    - master

before_install: mvn package

before_deploy:
  - export TRAVIS_TAG="1.$TRAVIS_BUILD_NUMBER"
  - echo "$TRAVIS_TAG" "$TRAVIS_COMMIT"
  - git config --local user.name "$USER_NAME"
  - git config --local user.email "$USER_EMAIL"
  - git tag "$TRAVIS_TAG" "$TRAVIS_COMMIT"

deploy:
  provider: releases
  tag_name: $TRAVIS_TAG
  target_commitish: $TRAVIS_COMMIT
  name: $TRAVIS_TAG
  overwrite: true
  skip_cleanup: true
  api_key: $GITHUB_TOKEN
  file_glob: true
  file:
    - target/my-artifact-$TRAVIS_TAG.jar
  on:
    branch: master

notifications:
  email:
    on_success: never
    on_failure: always

Я хотел добавить возможность развертывания артефакта в Heroku, и для этого я добавил второй элемент к шагу deploy, этот:

provider: heroku
api_key: $HEROKU_API_KEY
on:
  branch: master

С этими изменениями окончательная версия конфигурации Travis CI:

language: java
jdk: oraclejdk8

branches:
  only:
    - master

before_install: mvn package

before_deploy:
  - export TRAVIS_TAG="1.$TRAVIS_BUILD_NUMBER"
  - echo "$TRAVIS_TAG" "$TRAVIS_COMMIT"
  - git config --local user.name "$USER_NAME"
  - git config --local user.email "$USER_EMAIL"
  - git tag "$TRAVIS_TAG" "$TRAVIS_COMMIT"

deploy:
  - provider: releases
    tag_name: $TRAVIS_TAG
    target_commitish: $TRAVIS_COMMIT
    name: $TRAVIS_TAG
    overwrite: true
    skip_cleanup: true
    api_key: $GITHUB_TOKEN
    file_glob: true
    file:
      - target/my-artifact-$TRAVIS_TAG.jar
    on:
      branch: master
  - provider: heroku
    api_key: $HEROKU_API_KEY
    on:
      branch: master

notifications:
  email:
    on_success: never
    on_failure: always

Но сборки с такой конфигурацией терпят неудачу с сообщением

роковой: тег уже существует

Команда "git tag" $ TRAVIS_TAG "" $ TRAVIS_COMMIT "" завершилась неудачно и завершилась с 128 во время

Ваша сборка была остановлена.

Как результат - я вижу, что новая версия артефакта была выпущена в релизах Github, но развертывание в Heroku не удалось. Я исследовал проблему, и похоже, что конвейер Travis CI пытается выполнить шаг before_deploy перед каждым deploy, и когда он пытается выполнить его для развертывания в Heroku, происходит сбой из-за того, что тег * Git с таким именем уже был создан в before_deploy шаг для deploy к релизам Github.

Как я могу исправить проблему и настроить Travis CI на выполнение before_deploy шага только один раз?

1 Ответ

0 голосов
/ 28 июня 2018

Мне удалось исправить процесс выпуска, используя условие if на шаге before_deploy. Он пропустит создание тега перед выполнением второго развертывания, если переменная TRAVIS_TAG уже существует:

before_deploy:
  if ! [[ $TRAVIS_TAG ]]; then
    export TRAVIS_TAG="1.$TRAVIS_BUILD_NUMBER" &&
    git config --local user.name "$USER_NAME" &&
    git config --local user.email "$USER_EMAIL" &&
    git tag "$TRAVIS_TAG" "$TRAVIS_COMMIT";
  fi
...