如何在GitLab的流水线中持久化Yarn安装

81次阅读
没有评论

问题描述

在GitLab的流水线中有一个需求,希望能够在不同的阶段中持久化Yarn的安装。他的流水线包括以下步骤:
1. 安装镜像依赖(如java、node、yarn和openssl)
2. 安装构建所需的node包
3. 安装PMD
4. 进行代码分析
5. 构建
6. 部署
7. 在服务器上运行测试
8. 清理

问题在于,用户需要在步骤1和2中安装的工具在后续的构建中使用。例如,步骤5到7使用了一个包,而且需要OpenSSL来解密存储在代码库中的服务器密钥(以便GitLab可以连接到服务器)。

用户无法找到一种持久化Yarn安装的方法。当流水线从第1阶段移动到第2阶段时,将使用yarn命令,并且会出现127错误代码(找不到命令),如下所示:

$ yarn global add sfdx-cli/bin/sh: eval: line 81: yarn: not found
ERROR: Job failed: exit code 127

用户想知道是否有可能在所有阶段中持久化”环境设置”。是否可以使用artifacts来实现这一点?如果可以,是否需要为每个阶段设置命令?例如:Yarn可能安装在一个将被缓存的文件夹中,但我需要将’yarn’命令指向正确的二进制文件,对吗?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在GitLab的流水线中,可以使用before_script部分来安装所需的软件包,这样在每次运行流水线时,我们都知道每个阶段存在哪些软件包。

以下是一个示例的.gitlab-ci.yml文件:

before_script:
  - apt-get update -qy
  - apt-get install -y java nodejs yarn openssl

stages:
  - install_dependencies
  - build
  - deploy
  - test
  - cleanup

install_dependencies:
  stage: install_dependencies
  script:
    - yarn install

# 其他阶段的定义

在上面的示例中,我们在before_script部分安装了所需的软件包,包括java、nodejs、yarn和openssl。这样,在每个阶段的脚本中,我们都可以使用这些软件包。

install_dependencies阶段的脚本中,我们使用yarn install命令来安装构建所需的node包。其他阶段的定义可以根据实际需求进行编写。

方案2

使用artifacts可以在不同阶段之间共享文件,但需要在每个阶段中设置命令来指向正确的二进制文件。

另一种方法是使用artifacts来共享文件。你可以将Yarn安装的文件夹作为一个artifact,在后续的阶段中使用这个artifact来指向正确的二进制文件。

以下是一个示例的.gitlab-ci.yml文件:

stages:
  - install_dependencies
  - build
  - deploy
  - test
  - cleanup

install_dependencies:
  stage: install_dependencies
  script:
    - yarn install
  artifacts:
    paths:
      - node_modules/

# 其他阶段的定义

在上面的示例中,我们在install_dependencies阶段的脚本中使用yarn install命令来安装构建所需的node包。然后,我们将node_modules/文件夹作为一个artifact,以便在后续的阶段中使用。

在后续的阶段中,你可以使用artifacts关键字来指定需要使用的artifact,并将其解压到正确的位置。例如,在build阶段的脚本中,你可以使用以下命令来解压node_modules/文件夹:

- tar -xf node_modules.tar.gz

请注意,使用artifacts需要在每个阶段中设置命令来指向正确的二进制文件,以确保使用正确的软件包。

以上是两种持久化Yarn安装的方法,你可以根据实际需求选择适合你的方法。

总结

在GitLab的流水线中持久化Yarn安装有两种方法:
1. 在.gitlab-ci.yml文件的before_script部分安装所需的软件包。
2. 使用artifacts来共享文件,并在每个阶段中设置命令来指向正确的二进制文件。

根据你的实际需求,选择适合你的方法即可。

正文完