前言
在日常的开发中,我们经常会遇到需要部署前端项目到服务器的情况,比如发布新版本、更新功能等。一般情况下,我们需要手动将代码上传到服务器,然后手动执行部署命令,这显然是非常麻烦的。因此,我们需要找到一种自动化的方法来实现部署,这样就可以大大节省我们的部署时间。
方案
采用gitlab-runner + docker + 自动化部署脚本
准备工作
安装docker,gitlab,gitlab-runner可以参考下面的文章
安装配置gitlab-ce-点击查看
安装GitLab Runner-点击查看
自动化部署脚本
我们可以编写一个自动化部署脚本,在gitlab-runner中执行,将前端项目编译成dist目录,然后将dist目录同步到发布服务器的指定目录,实现自动部署。
通过 GitLab CI/CD 来实现自动打包及发布。你需要在你的项目根目录下创建一个 .gitlab-ci.yml 文件,然后在这个文件中定义一个 job 来将 dist 目录同步到发布服务器的指定目录 。
这是一个 .gitlab-ci.yml 文件的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| stages: - build - deploy
build: stage: build image: node:${NODE_VERSION} cache: paths: - node_modules/ script: - yarn install --frozen-lockfile - yarn build artifacts: paths: - dist/
deploy: stage: deploy image: alpine:latest before_script: - apk add --no-cache openssh-client - eval $(ssh-agent -s) - echo "Debugging SSH key..." - mkdir -p ~/.ssh - chmod 700 ~/.ssh - echo "$SSH_PRIVATE_KEY" | base64 -d > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - echo "SSH key file content (first and last lines):" - head -n 1 ~/.ssh/id_rsa - tail -n 1 ~/.ssh/id_rsa script: - ssh-add ~/.ssh/id_rsa || (echo "Failed to add SSH key" && exit 1) - ssh-add -l - ssh-keygen -lf ~/.ssh/id_rsa || echo "Failed to show key fingerprint" - ssh-keyscan $SERVER_IP>> ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts - scp -v -r dist/* $SERVER_USER@$SERVER_IP:$REMOTE_DIR only: - main variables: NODE_VERSION: "16.14.2" SERVER_IP: "发布服务器IP" SERVER_USER: "发布服务器用户名" REMOTE_DIR: "发布目录" SSH_PRIVATE_KEY: "SSH私钥(BASE64编码)"
|
如果服务器的ssh端口不是22,比如端口改成了37582,我们需要按照下面的模板修改:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| stages: - build - deploy
build: stage: build image: node:${NODE_VERSION} cache: paths: - node_modules/ script: - yarn install --frozen-lockfile - yarn build artifacts: paths: - dist/
deploy: stage: deploy image: alpine:latest before_script: - apk add --no-cache openssh-client - eval $(ssh-agent -s) - echo "Debugging SSH key..." - mkdir -p ~/.ssh - chmod 700 ~/.ssh - echo "$SSH_PRIVATE_KEY" | base64 -d > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - echo "SSH key file content (first and last lines):" - head -n 1 ~/.ssh/id_rsa - tail -n 1 ~/.ssh/id_rsa - echo -e "Host $SERVER_IP\n\tPort 37582" > ~/.ssh/config - chmod 600 ~/.ssh/config script: - ssh-add ~/.ssh/id_rsa || (echo "Failed to add SSH key" && exit 1) - ssh-add -l - ssh-keygen -lf ~/.ssh/id_rsa || echo "Failed to show key fingerprint" - ssh-keyscan -p 37582 $SERVER_IP >> ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts - scp -v -P 37582 -r dist/* $SERVER_USER@$SERVER_IP:$REMOTE_DIR - ssh -vv $SERVER_USER@$SERVER_IP "echo 'SSH connection successful'" only: - main variables: NODE_VERSION: "16.14.2" SERVER_IP: "发布服务器IP" SERVER_USER: "发布服务器用户名" REMOTE_DIR: "发布目录" SSH_PRIVATE_KEY: "SSH私钥(BASE64编码)"
|
注意:如果按照上面的配置,前面的步骤都是没有问题,但是执行最后一步退出了,可能是因为没有开启ssh密钥登录
你需要修改这个文件中的以下部分:
- NODE_VERSION:你想使用的 Node.js 版本,与你的开发环境一致,可用
node -v
命令查看
- SERVER_IP:你要部署到的服务器的 IP 地址
- SERVER_USER:你要部署到的服务器的用户名
- REMOTE_DIR:你要部署到的服务器的目录
- SSH_PRIVATE_KEY:你的 SSH 私钥,需要用 base64 编码,可用
cat ~/.ssh/id_rsa | base64
命令获取
- main:你想部署的分支(这里是 main 分支)
遇到的问题:
- aws默认的用户不是root,这个时候用root登录上传会提示权限不足,需要修改一下登录的用户名。
比如当前登录的用户是ubuntu,而我们的发布目录所有者是root,那么我们需要修改一下发布目录的权限。.gitlab-ci.yml 文件中,SERVER_USER也需要更改成ubuntu。
1
| sudo chown -R ubuntu:ubuntu path/to/your/project
|
生成SSH公钥
1.生成 SSH 密钥对:您可以在以下任意位置生成 SSH 密钥对:
如果您对 SSH 密钥管理感到舒适,在本地机器上生成可能更方便。如果您更喜欢直接在目标环境中操作,可以在目标服务器上生成。
2.无论您在哪里生成密钥,请确保:
- 私钥(base64 编码后)被添加到 GitLab CI/CD 变量中
- 公钥被添加到目标服务器的 ~/.ssh/authorized_keys 文件中
我在目标服务器上生成 SSH 密钥对:
1.登录到目标服务器,然后运行:
1
| ssh-keygen -t rsa -b 4096 -C "deploy_key" -f ~/.ssh/gitlab_deploy_key
|
2.将公钥添加到授权键文件中。仍在目标服务器上,运行:
1
| cat ~/.ssh/gitlab_deploy_key.pub >> ~/.ssh/authorized_keys
|
3.获取私钥并转换为 base64。仍在目标服务器上,运行:
1
| cat ~/.ssh/gitlab_deploy_key | base64 -w 0
|
复制输出的 base64 编码字符串。
注意:如果您使用的是 OpenSSH 格式的私钥(以 “—–BEGIN OPENSSH PRIVATE KEY—–” 开头),可能需要转换为 RSA 格式
ssh-keygen -p -m PEM -f ~/.ssh/gitlab_deploy_key
4.更新 GitLab CI/CD 变量(可选):
- 在 GitLab 项目中,转到 Settings > CI/CD > Variables
- 更新 SSH_PRIVATE_KEY 变量:
- Value: 粘贴您刚刚生成的 base64 编码字符串
- Type: Variable (不是 File)
5.使用之前提供的 CI/CD 配置文件。(可选)
第4,5步是我写的是可选,因为我在设置环境变量后,运行脚本一直无法获取到私钥,懒得折腾,直接把变量写到本地文件中了。
运行脚本
在配置好runner后,我们可以直接在gitlab上push代码,gitlab-runner会自动执行CI/CD脚本,将前端项目编译成dist目录,然后将dist目录同步到发布服务器的指定目录,实现自动部署。
总结
通过gitlab-runner + docker + 自动化部署脚本,我们可以实现自动化部署前端项目到服务器,大大节省了我们的部署时间。
上面的脚本要根据实际情况来调整,我的环境用的是yarn,如果用npm,需要修改脚本中的命令。