使用工作区

工作区 #

工作区允许作业*在*构建*中*共享文件。当您希望使用先前作业的构建工件时,它们非常有用;例如,您可以创建一个稍后可以在多个作业中使用的缓存。

因此,您可以清楚地看到何时创建和使用工作区,我们建议将工作区与构建阶段一起使用,如下面的示例所示。

请注意,最好在一个阶段创建工作区,然后在后续阶段使用它。

配置 #

最小的工作区配置如下所示

jobs:
  include:
    - stage: warm_cache
      script:
        - echo "foo" > foo.txt
      workspaces:
        create:
          name: ws1
          paths:
            - foo.txt
    - stage: use_cache
      workspaces:
        use: ws1
      script:
        - cat foo.txt || true

每个工作区在构建中都有一个唯一的名称。当使用workspaces.create创建它时,它由name键指定,当使用workspaces.use使用它时,它由值指定。

在上面的示例中,名为ws1的工作区由warm_cache阶段中唯一的作业创建。随后在use_cache阶段使用该工作区。

工作区示例 #

多个工作区示例 #

您可以在构建中使用多个工作区。

script:
  - ./build $TRAVIS_OS_NAME
jobs:
  include:
    - stage: Build binaries
      os: linux
      workspaces:
        create:
          name: linux-binaries
    - os: osx
      workspaces:
        create:
          name: osx-binaries
    - stage: Deploy
      language: minimal
      workspaces:
        use:
          - linux-binaries
          - osx-binaries
      git:
        clone: false
      script:
        - ./create_archive.sh
      deploy:
        provider: script
        script: ./upload.sh

在此示例中

  1. 我们在“构建二进制文件”阶段运行两个作业,每个作业都生成上传二进制文件。
  2. 在随后的“部署”阶段,我们获取上一阶段作业生成的工作区,并使用自定义脚本进行部署。

下面是一个更明确的示例

jobs:
  include:
    - stage: Build and Test
      name: "Job A"
      script:
        - echo "Building Job A"
        - echo "Running tests for Job A"
        - mkdir -p workspace-a
        - echo "This is data from Job A" > workspace-a/data-A.txt
      workspaces:
        create:
          name: workspace-a
          paths:
            - workspace-a

    - name: "Job B"
      script:
        - echo "Building Job B"
        - echo "Running tests for Job B"
        - mkdir -p workspace-b
        - echo "This is data from Job B" > workspace-b/data-B.txt
      workspaces:
        create:
          name: workspace-b
          paths:
            - workspace-b

    - name: "Job C"
      script:
        - echo "Building Job C"
        - echo "Running tests for Job C"
        - mkdir -p workspace-c
        - echo "This is data from Job C" > workspace-c/data-C.txt
      workspaces:
        create:
          name: workspace-c
          paths:
            - workspace-c

    - stage: Deploy
      name: "Deploy"
      script:
        - echo "Deploying using artifacts from Job A Job B and Job C"
        - cat workspace-a/data-A.txt
        - cat workspace-b/data-B.txt
        - cat workspace-c/data-C.txt
      workspaces:
        use:
          - workspace-a
          - workspace-b
          - workspace-c

在上面的示例中

  1. 构建阶段“构建和测试”包括 3 个作业,每个作业都将输出生成到单独的工作区
  2. 构建阶段“部署”包括一个作业,该作业
    1. 标记所有 3 个先前创建的工作区的用法
    2. 从每个先前创建的工作区中提取数据并将其回显到标准输出以演示访问工作区的能力

工作区和并发 #

请注意,如果在上传工作区时没有设置竞争条件,则工作区效果最佳。由于无法保证构建阶段内作业的执行顺序,因此最好为构建阶段内的作业分配不同的工作区名称。

工作区名称必须预先确定 #

由于技术原因,工作区名称将被转义以用于 shell。换句话说,给定

workspaces:
  create:
    name: $TRAVIS_OS_NAME
    paths: 

它必须由以下内容使用

workspaces:
  use: $TRAVIS_OS_NAME

而不是

workspaces:
  use: linux

即使使用者在 Linux 虚拟机上运行。

工作区与缓存的区别 #

值得重申的是,工作区旨在用于在同一构建中共享文件。对于您希望跨构建共享的文件,请使用缓存

工作区和缓存被独立考虑 #

可以在缓存和工作区中包含单个文件。

如果您在作业中重新启动一些构建,并且您的工作区没有按预期工作,请尝试重新启动整个构建。