Githubclose
技术笔记技术笔记
2026-06-10

Github Actions 使用

提交到 Github 平台的代码可以通过 Github Actions 进行代码的持续集成和持续交付(CI/CD),可以自动执行生成、测试和部署,避免每次都要手动的去更新代码,然后重新部署。 #### 1. 在项目根目录创建一个`.github` 目录,然后在目录中创建 `workflows` 目录 #### 2. 在 workflows 目录下创建以.yml 结尾的文件,名字随意 #### 3. 按自己的需求编辑 yml 文件,如下: ```yml # 名字按自己的需求随意 name: "Test" # 触发方式 on: # 代码提交时触发(可以指定分支) push: branches: - main - dev # 提交PR时触发 pull_request: # 提交issue时触发 issues: # 定时触发 schedule: # 工作流程 jobs: test1: # 说明要在Ubuntu环境中运行 run-on: ubuntu-latest # 运行步骤 steps: # 使用GitHub市场中已经存在的工作流 - uses: actions/setup-node@v4 with: node-version: 20 cache: 'npm' - name: 安装依赖 run: npm ci - name: 运行代码检查 run: npm run lint - name: 运行测试 run: npm test ``` 更详细的教程查看官网:[GithubActions](https://docs.github.com/en/actions/get-started/quickstart) 下面示例,使用 GitHub 自动连接远程服务器然后更新代码,重新部署 ```yml name: Deploy With Github Action on: push: branches: - main jobs: deploy: runs-on: ubuntu-latest steps: - name: SSH连接服务器 uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.SERVER_HOST }} # 云服务器域名或IP username: ${{ secrets.SERVER_USER }} # SSH用户名 key: ${{ secrets.SSH_PRIVATE_KEY }} # ssh私钥内容 password: ${{ secrets.SERVER_PWD }} # ssh密码(如果使用密码登录) port: ${{ secrets.SERVER_PORT }} # ssh端口号 script: | cd app ./update.sh ``` 如果想通过 GitHub 远程连接自己的数据库,那么需要提供服务器的登录信息,登录信息最好不要直接写在文件中,可以在 GitHub 仓库的 `Settings` → `Secrets and variables` → `Actions` 中添加 例如添加以下键值对: `SERVER_HOST`:云服务器 IP 或域名 `SERVER_USER`:SSH 登录用户名(如 `root`、`ubuntu`) `SERVER_PASSWORD`:SSH 登录密码(可选,推荐使用 SSH 私钥,更安全) `SSH_PRIVATE_KEY`:SSH 私钥(内容,通常以 `-----BEGIN OPENSSH PRIVATE KEY-----` 开头) `SERVER_PORT`:SSH 端口(默认 22) #### 4. 遇到的问题 我在服务器上写了一个更新前后端项目代码并重新运行的 shell 脚本,运行需要用到 pm2 和 npm 我通过 GitHub Actions 连接服务器后直接运行部署脚本,发现有报错,提示 pm2 和 npm 不存在 排查发现 GitHub Actions 通过 SSH 登录后执行脚本的环境,和平时手动 SSH 登录服务器的环境不一样 GitHub Action 的 ssh-action 默认执行的是:`/bin/sh`或者非交互式 shell 不会加载:`.bashrc`​`.profile`​`.zshrc` 这些环境文件 所以 PATH 中没有:npm,pm2 等命令 导致:`npm: command not found`​`pm2: command not found` 然后我就想直接在 GitHub Actions 脚本命令中执行`source ./.bashrc`文件不就能加载环境变量了吗? 试了一下还是不行,`.bashrc`这个文件中都有防备,如果检测到非交互式,不会做任何事 ```bash # If not running interactively, don't do anything case $- in *i*) ;; *) return;; ``` 解决方法:在服务器上执行`witch pm2`,输出类似这种路径`/home/ubuntu/.nvm/versions/node/v22.18.0/bin` 复制,然后在我的服务器上的部署脚本里加上下面的代码, 把 Node.js 的安装目录追加到当前 Shell 的环境变量 PATH 中 ,这样就能在当前 shell 环境中使用 pm2 和 npm 了 `exportPATH=$PATH:/home/ubuntu/.nvm/versions/node/v22.18.0/bin`

标签Github