如何修复GitHub Action向AWS EC2实例复制构建文件失败问题
问题场景
在GitHub Action中搭建AWS Lightsail实例的NodeJS应用流水线,代码拉取、构建步骤已成功,但无法将build文件夹文件复制到EC2实例。使用GitHub托管的Ubuntu运行器,已将PEM私钥配置为仓库密钥SSH_PRIVATE_KEY,执行Action时出现KEY-----: No such file or directory错误。
原流水线代码
name: Deployment QA UI on: push jobs: Get_code: runs-on: ubuntu-20.04 steps: - name: Get code uses: actions/checkout@v4 - name: Install NodeJS uses: actions/setup-node@v3 with: node-version: 10 - name: Install dependancies run: NODE_OPTIONS=--max_old_space_size=4096 npm install - name: Check Nodejs run: npx browserslist@latest --update-db - name: Build project run: NODE_OPTIONS=--max_old_space_size=4096 npm run build - name: Check the files in build folder run: | cd /home/runner/work/simple_App/simple_App/build/ ls -l - name: Deploy to the server. run: scp -i ${{ secrets.SSH_PRIVATE_KEY }} -r * centos@18.191.60.170:/var/www/html/
错误信息
cd /home/runner/work/uniconnect_ui/uniconnect_ui/build/
ls -l
scp -i ****** -r * centos@18.191.60.170:/var/www/html/
shell: /usr/bin/bash -e {0}
total 280
-rw-r--r-- 1 runner docker 6773 Sep 16 18:15 asset-manifest.json
-rw-r--r-- 1 runner docker 260158 Sep 16 18:12 favicon.ico
-rw-r--r-- 1 runner docker 4820 Sep 16 18:15 index.html
-rw-r--r-- 1 runner docker 317 Sep 16 18:12 manifest.json
drwxr-xr-x 5 runner docker 4096 Sep 16 18:15 static
KEY-----: No such file or directory
Error: Process completed with exit code 1.
修复方案
1. 正确处理SSH密钥文件
GitHub Secrets中的私钥直接传入scp -i参数时,会被当作文件路径而非密钥内容,导致找不到文件。需要先将密钥写入本地文件并设置正确权限:
在流水线的Deploy to the server步骤前添加以下步骤:
- name: Prepare SSH deployment key run: | echo "${{ secrets.SSH_PRIVATE_KEY }}" > /tmp/deploy_key chmod 600 /tmp/deploy_key
2. 修正SCP命令
修改Deploy步骤的命令,使用生成的密钥文件,同时解决主机密钥验证问题,并指定正确的build目录路径:
- name: Deploy to the server run: | scp -i /tmp/deploy_key -o StrictHostKeyChecking=no -r ./build/* centos@18.191.60.170:/var/www/html/
-o StrictHostKeyChecking=no:禁用首次连接时的主机密钥确认提示,避免脚本中断./build/*:指定仓库根目录下的build文件夹内容(GitHub Action每个step的默认工作目录是仓库根目录,之前的cd操作仅在对应step生效)
3. 验证目标目录权限
确保AWS Lightsail实例上的/var/www/html目录对centos用户有写入权限,可在实例上执行:
sudo chown -R centos:centos /var/www/html
完整修正后的流水线代码
name: Deployment QA UI on: push jobs: Get_code: runs-on: ubuntu-20.04 steps: - name: Get code uses: actions/checkout@v4 - name: Install NodeJS uses: actions/setup-node@v3 with: node-version: 10 - name: Install dependancies run: NODE_OPTIONS=--max_old_space_size=4096 npm install - name: Check Nodejs run: npx browserslist@latest --update-db - name: Build project run: NODE_OPTIONS=--max_old_space_size=4096 npm run build - name: Check the files in build folder run: | cd ./build/ ls -l - name: Prepare SSH deployment key run: | echo "${{ secrets.SSH_PRIVATE_KEY }}" > /tmp/deploy_key chmod 600 /tmp/deploy_key - name: Deploy to the server run: | scp -i /tmp/deploy_key -o StrictHostKeyChecking=no -r ./build/* centos@18.191.60.170:/var/www/html/
内容的提问来源于stack exchange,提问作者dev_sim

