GitHub Workflow中npm ci的node_modules存储位置及打包部署问题
问题解答:GitHub Workflow中npm ci的node_modules存储与打包部署AWS Lambda
核心疑问
- 在GitHub Workflow里,
npm ci执行后node_modules文件夹存在哪里? - 能否通过GitHub Workflow将
node_modules打包为zip,用于部署到AWS Lambda?当前测试发现buildjob中找不到node_modules。
问题原因分析
首先明确:GitHub Actions的每个job都是运行在独立的虚拟机实例上,job之间的文件系统完全隔离。你当前的node job里通过npm ci生成的node_modules,只会存在于node job对应的虚拟机中,build job重新checkout代码后,自然找不到之前生成的node_modules。另外,build job里的if: steps.cache-dep.outputs.cache-hit != 'true'完全无效,因为steps.cache-dep是node job的步骤ID,跨job无法访问该变量。
关于第一个问题:npm ci执行后,node_modules会直接生成在当前工作目录的根层级(和你的package.json同目录),但仅限当前job的虚拟机环境内。
解决方案
方案一:合并Node安装与打包步骤到同一个Job(推荐,最简单高效)
把node和build job的步骤合并,这样npm ci生成的node_modules可以直接被打包步骤使用,无需跨job传递文件:
jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: 🛒 Checkout uses: actions/checkout@v3 - name: 🤖 Setup Node uses: actions/setup-node@v3 with: node-version: 16.13.2 registry-url: 'https://npm.pkg.github.com' cache: 'npm' cache-dependency-path: '**/package.json' - name: Cache node_modules id: cache-dep uses: actions/cache@v3 with: path: ./node_modules key: ${{ runner.os }}-pricing-scraper-${{ hashFiles('package.json') }} restore-keys: | ${{ runner.os }}-pricing-scraper- - name: Config NPM shell: bash run: npm install -g npm@8.1.2 - name: ⚙️ Install node_modules if: steps.cache-dep.outputs.cache-hit != 'true' shell: bash run: npm ci - name: 🏗 Zip files and folder shell: bash run: | echo Start running the zip script # 检查output目录是否存在 DIR="./output" if [ ! -d "$DIR" ]; then echo "Error: ${DIR} not found. Can not continue." exit 1 fi if [ ! -d "./node_modules" ]; then echo "Error: node_modules not found. Can not continue." exit 1 fi rm -rf "$DIR"/* echo Deleted prior deployment zips # 打包核心目录 zip -r "$DIR"/core.zip config node_modules shipping util # 后续可以添加部署到AWS Lambda的步骤
方案二:跨Job传递node_modules(适合必须拆分Job的场景)
如果一定要分开node和build job,需要用actions/upload-artifact将node_modules上传为工件,再在build job中下载:
- 在
nodejob末尾添加上传步骤:
# node job的最后添加 - name: Upload node_modules artifact uses: actions/upload-artifact@v3 with: name: node-modules path: ./node_modules
- 在
buildjob中添加下载步骤:
jobs: build: runs-on: ubuntu-latest needs: [node] steps: - name: 🛒 Checkout uses: actions/checkout@v3 - name: Download node_modules artifact uses: actions/download-artifact@v3 with: name: node-modules path: ./node_modules - name: 🏗 Zip files and folder shell: bash run: | # 原打包脚本内容...
额外注意事项
- 不要依赖
node_modules被提交到仓库:node_modules体积大且依赖环境,通常都在.gitignore里,Workflow里必须通过npm ci或npm install生成。 - AWS Lambda部署时,确保zip包包含所有必要依赖,且目录结构符合Lambda要求(比如入口文件在根目录,或通过Lambda配置指定handler路径)。
内容的提问来源于stack exchange,提问作者Mavelouscello
相关产品推荐
相关产品推荐

