使用工作区
工作区 #
工作区允许作业*在*构建*中*共享文件。当您希望使用先前作业的构建工件时,它们非常有用;例如,您可以创建一个稍后可以在多个作业中使用的缓存。
因此,您可以清楚地看到何时创建和使用工作区,我们建议将工作区与构建阶段一起使用,如下面的示例所示。
请注意,最好在一个阶段创建工作区,然后在后续阶段使用它。
配置 #
最小的工作区配置如下所示
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
在此示例中
- 我们在“构建二进制文件”阶段运行两个作业,每个作业都生成上传二进制文件。
- 在随后的“部署”阶段,我们获取上一阶段作业生成的工作区,并使用自定义脚本进行部署。
下面是一个更明确的示例
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
在上面的示例中
- 构建阶段“构建和测试”包括 3 个作业,每个作业都将输出生成到单独的工作区
- 构建阶段“部署”包括一个作业,该作业
- 标记所有 3 个先前创建的工作区的用法
- 从每个先前创建的工作区中提取数据并将其回显到标准输出以演示访问工作区的能力
工作区和并发 #
请注意,如果在上传工作区时没有设置竞争条件,则工作区效果最佳。由于无法保证构建阶段内作业的执行顺序,因此最好为构建阶段内的作业分配不同的工作区名称。
工作区名称必须预先确定 #
由于技术原因,工作区名称将被转义以用于 shell。换句话说,给定
workspaces:
create:
name: $TRAVIS_OS_NAME
paths: …
它必须由以下内容使用
workspaces:
use: $TRAVIS_OS_NAME
而不是
workspaces:
use: linux
即使使用者在 Linux 虚拟机上运行。
工作区与缓存的区别 #
值得重申的是,工作区旨在用于在同一构建中共享文件。对于您希望跨构建共享的文件,请使用缓存。
工作区和缓存被独立考虑 #
可以在缓存和工作区中包含单个文件。
如果您在作业中重新启动一些构建,并且您的工作区没有按预期工作,请尝试重新启动整个构建。