这可能是因为在 Gitlab CI pipeline 中,每个 stage 都是在不同的容器中运行的。因此,在一个 stage 中生成的文件并不能自动传递给下一个 stage。
如果您需要将文件从一个 stage 传递到另一个 stage,您需要使用 artifacts(构件物)机制来实现。在一个 stage 中生成的文件可以通过将其打包为 artifact,然后将其上传到 Gitlab CI 的服务器上。在下一个 stage 中,您可以使用 job 来下载这些 artifact,并在容器中解压它们以使用其中的文件。
例如,如果您在一个 Maven 构建 stage 中使用 Sonarqube 进行静态代码分析,则可以使用以下 Gitlab CI 配置文件:
stages:
- build
- sonar
build:
image: maven:3.6-jdk-11-slim
stage: build
script:
- mvn clean package
sonar:
image: sonarsource/sonar-scanner-cli:latest
stage: sonar
dependencies:
- build
script:
- sonar-scanner \
-Dsonar.projectKey=my-project \
-Dsonar.sources=. \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.login=$SONAR_TOKEN
artifacts:
paths:
- target/
在这个例子中,build
stage 使用 maven:3.6-jdk-11-slim
镜像来构建 Maven 项目,并在 target/
目录中生成构建产物。然后,sonar
stage 使用 sonarsource/sonar-scanner-cli:latest
镜像来运行 Sonarqube 分析,它依赖于 build
stage 并使用 Maven 项目中的源代码进行分析。最后,使用 artifacts
将 target/
目录中的构建产物上传到 Gitlab CI 的服务器上,以便下一个 stage 可以下载并使用其中的文件。
请注意,您需要在 sonar
stage 中指定 artifacts,因为这是唯一一个需要访问建筑产物的 stage。如果您没有指定 artifacts,则默认情况下不会将任何文件传递给下一个 stage。