GitLab CI中k6测试文件找不到问题求助
问题描述
在GitLab CI流水线中运行k6性能测试时,执行docker-compose --file=k6/compose.yaml run k6 run /tests/load.js命令出现文件找不到的错误:
time="2024-03-25T10:42:02Z" level=error msg="The moduleSpecifier "/tests/load.js" couldn’t be found on local disk. Make sure that you’ve specified the right path to the file.
本地执行相同命令可正常运行,但CI环境中失败。相关配置如下:
docker-compose.yaml(路径:k6/compose.yaml)
version: '3.8' networks: k6: grafana: services: influxdb: image: influxdb:1.8 networks: - k6 - grafana ports: - "8086:8086" environment: - INFLUXDB_DB=k61 grafana: image: grafana/grafana:9.3.8 networks: - grafana ports: - "3000:3000" environment: - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - GF_AUTH_ANONYMOUS_ENABLED=true - GF_AUTH_BASIC_ENABLED=false volumes: - ./grafana:/etc/grafana/provisioning/ k6: image: grafana/k6:latest networks: - k6 ports: - "6565:6565" environment: - K6_OUT=influxdb=http://influxdb:8086/k6 volumes: - ./resources:/jmanager - ./resources:/resources - ./tests:/tests - ./utils:/utils
gitlab-ci.yaml
stages: - test load_test: stage: test image: docker:latest services: - docker:dind script: - docker-compose --file=k6/compose.yaml up --build -d - docker-compose --file=k6/compose.yaml run k6 run /tests/load.js - docker-compose --file=k6/compose.yaml down --remove-orphans tags: - eks-tooling-generic
测试文件路径为k6/tests/load.js。
解决方案
问题根源是GitLab CI默认工作目录为项目根目录,而本地执行时你是在k6目录下运行docker-compose,导致相对路径解析逻辑不一致。推荐以下两种解决方法:
方法一:切换到k6目录执行docker-compose
修改gitlab-ci的script部分,先进入k6目录再执行命令,让CI环境的路径逻辑和本地完全一致:
script: - cd k6 - docker-compose up --build -d - docker-compose run k6 run /tests/load.js - docker-compose down --remove-orphans
方法二:使用绝对路径挂载卷
在docker-compose.yaml中,将相对路径替换为基于项目根目录的绝对路径,利用环境变量${PWD}获取CI工作目录:
修改k6服务的volumes配置:
volumes: - ${PWD}/k6/resources:/jmanager - ${PWD}/k6/resources:/resources - ${PWD}/k6/tests:/tests - ${PWD}/k6/utils:/utils
gitlab-ci的script部分无需修改,保持原有命令即可。
原因说明
本地执行时,你处于k6目录,./tests指向k6/tests目录,挂载到容器的/tests后能找到文件;而GitLab CI默认在项目根目录执行,此时./tests会指向项目根的tests目录(不存在),导致容器内/tests目录为空,从而找不到load.js。
内容的提问来源于stack exchange,提问作者user13632791

