java - Travis CI 构建在 master 上运行部署阶段,即使不满足标记条件

标签 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 构建针对 master 运行(正确)并调用部署阶段(不正确),尝试部署到 Maven/GitHub(由于我认为是不相关的错误而失败)。

奇怪的是,它并没有启动部署作业(它没有启动;它只启动了构建作业)。它将部署阶段添加到前四个(构建)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>'

最佳答案

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

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

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

Travis CI 构建中的正常 script 指令接受序列,但 script 部署提供程序中的 script 指令不同,仅接受单个字符串,它作为单个命令调用。您甚至无法传入多行字符串。还是不行。我提交了this bug与 Travis 讨论了这个问题,在解决该问题之前,使用 before_deploy (如下)找到了该问题的临时解决方法。

其次,如果您使用顶级 deploy 指令,则部署将作为构建阶段的一部分运行,而不是作为其自己的阶段运行。文档对此并不清楚,但这是一个简单的修复。

最后,您只能加密单个文件,而不能加密多个文件,因此,如果您有多个 secret 文件,则必须使用 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

关于java - Travis CI 构建在 master 上运行部署阶段,即使不满足标记条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54274355/

相关文章:

r - 在 github 上开始新的 R 包开发

git - 删除两个提交之间的 git 提交

maven - Springboot : A child container failed during start java. util.concurrent.ExecutionException : org. apache.catalina.LifecycleException

Java:解析文本文件有什么想法吗?

Java int 比较,无法找出问题所在

java - Procfile 中要写什么?

java - Maven重新分配现有的war(无命令行)

java - mvn干净安装错误

git - 获取 git 存储库中每个文件的提交计数

java - 如果 JerseyClient (2.1.x) 响应没有正文,是否需要关闭它的连接?