即使未满足标签条件,Travis CI仍会在主服务器上构建运行部署阶段

时间:2019-01-20 07:14:17

标签: java maven github travis-ci release

我的项目中有以下.travis.yml文件,该文件配置为始终构建并仅在由与特定版本字符串匹配的GitHub标记触发构建时才部署:

language: java
sudo: false
cache:
  directories:
    - "$HOME/.cache"
jobs:
  include:
    - stage: build
      os: linux
      jdk: oraclejdk8
    - stage: build
      os: linux
      jdk: openjdk8
    - stage: build
      os: linux
      jdk: oraclejdk11
    - stage: build
      os: linux
      jdk: openjdk11
    - stage: deploy
      os: linux
      jdk: openjdk8
stages:
  - build
  - name: deploy
    if: tag =~ ^[0-9]+\.[0-9]+\.[0-9]+
install:
  - gpg --version
  - mvn process-resources -B -V -e
script:
  - mvn test -B -V -e
deploy:
  - provider: script
    script:
      - openssl aes-256-cbc ... -in .travis.gpg.enc -out .travis.gpg -d
      - openssl aes-256-cbc ... -in .travis.settings.xml.enc -out .travis.settings.xml -d
      - gpg --import .travis.gpg
      - cp .travis.settings.xml $HOME/.m2/settings.xml
      - mvn clean deploy -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -P sign -B -V -e
    skip_cleanup: true
  - provider: releases
    api_key:
      secure: CKKEi9hoN...xbzZByUU80Q=
    file_glob: true
    file:
      - $HOME/.m2/repository/path/to/project-*.pom
      - $HOME/.m2/repository/path/to/porject-*.pom.asc

当我推动分支机构时,此方法运行良好:Travis CI构建已运行并表示正在跳过部署阶段,因为未满足条件。但是,当我将此分支合并到master中时,Travis CI build遇到master问题(正确)并调用了部署阶段(错误),尝试部署到Maven / GitHub(由于我认为是不相关的错误而失败)。

奇怪的是,它并不是启动了部署job(不是;它只是启动了构建job)。它将部署阶段添加到前四个(构建)job(表示stage: build的)中。这显示在下面的屏幕快照中,您可以看到它运行了四个构建作业,并且都失败了(特别是,它们都在部署阶段都失败了,但是它们不应该尝试进行部署;只有部署作业应该这样做)部署)。

Failed Travis CI build

因此,有两个问题:

  1. 我在这里做错了什么,即使它不是标签,也尝试从master部署?
  2. 您是否知道以下错误是(有幸)使部署失败的,我需要做些什么来解决它?

部署错误:

$ rvm $(travis_internal_ruby) --fuzzy do ruby -S gem install dpl
Successfully installed dpl-1.10.6
Parsing documentation for dpl-1.10.6
Installing ri documentation for dpl-1.10.6
Done installing documentation for dpl after 0 seconds
1 gem installed
dpl.1
Installing deploy dependencies
Successfully installed dpl-script-1.10.6
Parsing documentation for dpl-script-1.10.6
Installing ri documentation for dpl-script-1.10.6
Done installing documentation for dpl-script after 0 seconds
1 gem installed
/home/travis/.rvm/gems/ruby-2.4.1/gems/dpl-1.10.6/lib/dpl/cli.rb:54:in `system': wrong first argument (ArgumentError)
    from /home/travis/.rvm/gems/ruby-2.4.1/gems/dpl-1.10.6/lib/dpl/cli.rb:54:in `shell'
    from /home/travis/.rvm/gems/ruby-2.4.1/gems/dpl-script-1.10.6/lib/dpl/provider/script.rb:19:in `push_app'
    from /home/travis/.rvm/gems/ruby-2.4.1/gems/dpl-1.10.6/lib/dpl/provider.rb:199:in `block in deploy'
    from /home/travis/.rvm/gems/ruby-2.4.1/gems/dpl-1.10.6/lib/dpl/cli.rb:41:in `fold'
    from /home/travis/.rvm/gems/ruby-2.4.1/gems/dpl-1.10.6/lib/dpl/provider.rb:199:in `deploy'
    from /home/travis/.rvm/gems/ruby-2.4.1/gems/dpl-1.10.6/lib/dpl/cli.rb:32:in `run'
    from /home/travis/.rvm/gems/ruby-2.4.1/gems/dpl-1.10.6/lib/dpl/cli.rb:7:in `run'
    from /home/travis/.rvm/gems/ruby-2.4.1/gems/dpl-1.10.6/bin/dpl:5:in `<top (required)>'
    from /home/travis/.rvm/gems/ruby-2.4.1/bin/dpl:23:in `load'
    from /home/travis/.rvm/gems/ruby-2.4.1/bin/dpl:23:in `<main>'

1 个答案:

答案 0 :(得分:2)

所以,我找到了两个问题的答案。

首先,奇怪的错误是由于以下原因造成的:

deploy:
  - provider: script
    script:
      - do something
      - do something else
      - do another thing

Travis CI构建中的常规script指令接受一个序列,但是script部署提供程序中的script指令是不同的,并且仅接受单个字符串,该字符串作为单个命令。您甚至不能传递多行字符串。仍然不起作用。我向Travis提交了this bug的相关信息,在此问题解决之前,使用before_deploy(如下)找到了解决该问题的临时解决方法。

第二,如果您使用顶级deploy指令,则部署将在构建阶段而不是其自己的阶段中运行。文档尚不清楚,但这很容易解决。

最后,您只能加密单个文件,不能加密多个文件,因此,如果您有多个秘密文件,则必须使用Tar存档并将其加密。

解决所有问题后,这是Travis的工作版本:

language: java
sudo: false
cache:
  directories:
    - "$HOME/.cache"
jobs:
  include:
    - stage: build
      os: linux
      dist: trusty
      jdk: oraclejdk8
    - stage: build
      os: linux
      dist: trusty
      jdk: openjdk8
    - stage: build
      os: linux
      dist: xenial
      jdk: oraclejdk11
    - stage: build
      os: linux
      dist: xenial
      jdk: openjdk11
    - stage: deploy
      os: linux
      dist: xenial
      jdk: openjdk8
      before_deploy:
        - openssl aes-256-cbc -in .travis.secrets.tar.enc -out .travis.secrets.tar -d
        - tar -xvf .travis.secrets.tar
        - rm .travis.secrets.tar
        - gpg --import travis.gpg
        - rm travis.gpg
        - mv settings.xml $HOME/.m2/settings.xml
      deploy:
        - provider: script
          script: "mvn clean deploy -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -P sign -B -V -e"
          on:
            tags: true
          skip_cleanup: true
        - provider: releases
          api_key:
            secure: CKKEi9hoN...xbzZByUU80Q=
          file_glob: true
          file:
            - $HOME/.m2/repository/io/path/to/project-*.pom
            - $HOME/.m2/repository/io/path/to/project-*.pom.asc
          on:
            tags: true
stages:
  - build
  - name: deploy
    if: tag =~ ^[0-9]+\.[0-9]+(\.[0-9]+)?(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$
install:
  - gpg --version
  - mvn process-resources -B -V -e
script:
  - mvn test -B -V -e