CircleCI工作目录配置失败及项目构建报错求助
CircleCI流水线问题解决:工作目录配置与环境依赖
遇到的问题
- 无法正确切换工作目录,导致任务找不到项目核心文件(如
package.json、go.mod) - Alpine镜像环境中缺少
make命令
当前配置文件
# Use the latest 2.1 version of CircleCI pipeline process engine. # See: https://circleci.com/docs/2.0/configuration-reference version: 2.1 jobs: api: working_directory: ~/api docker: - image: golang:1.19.3-alpine3.16 steps: - checkout: path: ~/api - setup_remote_docker: docker_layer_caching: true - run: pwd - run: ls -all #- run: make mod-vendor - run: go get -v -t -d ./... - run: go test -v ./... - run: go build -o main . - deploy: command: | if [ "${CIRCLE_BRANCH}" == "circle-ci-setup" ]; then docker build -t ${DOCKER_REPO} . docker login -u ${DOCKER_USER} -p ${DOCKER_PASS} https://index.docker.io/v1/ docker push ${DOCKER_REPO} fi client: working_directory: ~/client docker: - image: cimg/node:16.1.0 steps: - checkout: path: ~/client - run: pwd - run: ls -all - run: name: Install Dependencies command: yarn install --immutable - save_cache: name: Save Yarn Package Cache key: yarn-packages-{{ checksum "yarn.lock" }} paths: - .yarn/cache - .yarn/unplugged - run: name: Installing the package.json dependencies command: yarn - run: yarn build - persist_to_workspace: root: . paths: dist workflows: hobby-project-setup: jobs: - client - api
报错信息
Client任务报错
yarn run v1.22.10 error Couldn't find a package.json file in "/home/circleci/client" info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command. Exited with code exit status 1 CircleCI received exit code 1
API任务报错
#!/bin/sh -eo pipefail cd api && go get -v -t -d ./... go: go.mod file not found in current directory or any parent directory. 'go get' is no longer supported outside a module. To build and install a command, use 'go install' with a version, like 'go install example.com/cmd@latest' For more information, see https://golang.org/doc/go-get-install-deprecation or run 'go help get' or 'go help install'. Exited with code exit status 1
关键输出信息
ls -all输出(两个任务一致)
total 32 drwxr-xr-x 7 root root 4096 Dec 4 12:12 . drwx------ 1 root root 33 Dec 4 12:12 .. drwxr-xr-x 2 root root 24 Dec 4 12:12 .circleci drwxr-xr-x 4 root root 72 Dec 4 12:12 .git -rw-r--r-- 1 root root 13 Dec 4 12:12 .gitignore -rw-r--r-- 1 root root 1369 Dec 4 12:12 Makefile drwxr-xr-x 6 root root 95 Dec 4 12:12 api -rw-r--r-- 1 root root 5302 Dec 4 12:12 api.swagger.json drwxr-xr-x 5 root root 4096 Dec 4 12:12 client -rw-r--r-- 1 root root 424 Dec 4 12:12 digital-ocean-infra-config.sh -rw-r--r-- 1 root root 263 Dec 4 12:12 docker-compose.yml drwxr-xr-x 6 root root 104 Dec 4 12:12 infra
API任务pwd输出
/root/api
Client任务pwd输出
/home/circleci/client
问题分析
从ls输出可见,整个仓库被克隆到了working_directory指定的路径下(如~/api),导致项目实际的代码目录(~/api/api、~/client/client)嵌套在工作目录内,后续命令直接在工作目录根执行,自然找不到package.json、go.mod等文件。
解决方案
1. 修正工作目录配置
调整每个任务的working_directory为对应项目的子目录,并将仓库克隆到父目录,确保任务默认在项目代码目录下执行:
jobs: api: # 直接指向项目代码所在的子目录 working_directory: ~/repo/api docker: - image: golang:1.19.3-alpine3.16 steps: # 将整个仓库克隆到父目录~/repo - checkout: path: ~/repo - setup_remote_docker: docker_layer_caching: true # 此时默认在~/repo/api目录下,直接执行命令即可找到go.mod - run: pwd - run: ls -all - run: go get -v -t -d ./... - run: go test -v ./... - run: go build -o main . - deploy: command: | if [ "${CIRCLE_BRANCH}" == "circle-ci-setup" ]; then docker build -t ${DOCKER_REPO} . docker login -u ${DOCKER_USER} -p ${DOCKER_PASS} https://index.docker.io/v1/ docker push ${DOCKER_REPO} fi client: # 直接指向项目代码所在的子目录 working_directory: ~/repo/client docker: - image: cimg/node:16.1.0 steps: # 将整个仓库克隆到父目录~/repo - checkout: path: ~/repo - run: pwd - run: ls -all - run: name: Install Dependencies command: yarn install --immutable - save_cache: name: Save Yarn Package Cache key: yarn-packages-{{ checksum "yarn.lock" }} paths: - .yarn/cache - .yarn/unplugged - run: name: Installing the package.json dependencies command: yarn - run: yarn build - persist_to_workspace: root: . paths: dist
2. 安装make命令(解决Alpine镜像缺失问题)
在API任务的步骤开头添加安装命令,因为Alpine Linux默认不包含make:
jobs: api: # ... 其他配置不变 steps: - checkout: path: ~/repo # 安装make及依赖 - run: apk add --no-cache make # ... 后续步骤不变
这样修改后,任务会默认在正确的项目代码目录下执行,无需手动cd,同时也能使用make命令。
内容的提问来源于stack exchange,提问作者Mike3355
相关产品推荐
相关产品推荐

