本教程主要讲解了怎么使用 Jenkins 和 Github Actions 部署前端项目。
阅读本教程并不需要你提前了解 Jenkins 和 Github Actions 的知识,只要按照本教程的指引,就能够实现自动化部署项目。
PS:本人所用电脑操作系统为 windows,即以下所有的操作均在 windows 下运行。其他操作系统的配置大同小异,不会有太大差别。
Gitea 用于构建 Git 局域网服务器,Jenkins 是 CI/CD 工具,用于部署前端项目。
gitea-1.13-windows-4.0-amd64.exe
下载。localhost:3000
就能看到 Gitea 已经运行在你的电脑上了。SQLite3
。另外把 localhost
改成你电脑的局域网地址,例如我的电脑 IP 为 192.168.0.118
。custom\conf\app.ini
,在里面加上一行代码 START_SSH_SERVER = true
。这时就可以使用 ssh 进行 push 操作了。git config --global --unset http.proxy git config --global --unset https.proxy
Logon Type
时,选择第一个。http://localhost:8000
网站,这时需要等待一会,进行初始化。Manage Jenkins
-> Manage plugins
安装插件。可选插件
,输入 nodejs,搜索插件,然后安装。Manage Jenkins
-> Global Tool Configuration
配置 nodejs。如果你的电脑是 win7 的话,nodejs 版本最好不要太高,选择 v12 左右的就行。npm init -y
,初始化项目。npm i express
下载 express。server.js
文件,代码如下:const express = require('express') const app = express() const port = 8080 app.use(express.static('dist')) app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`) })
它将当前目录下的 dist
文件夹设为静态服务器资源目录,然后执行 node server.js
启动服务器。
由于现在没有 dist
文件夹,所以访问网站是空页面。
不过不要着急,一会就能看到内容了。
新建 Item
创建项目。源码管理
,输入你的 Gitea 上的仓库地址。execute windows batch command
,linux 要选 execute shell
。npm i && npm run build && xcopy .\build\* G:\node-server\dist\ /s/e/y
,这行命令的作用是安装依赖,构建项目,并将构建后的静态资源复制到指定目录 G:\node-server\dist\
。这个目录是静态服务器资源目录。build now
。http://localhost:8080/
看一下结果。使用流水线构建项目可以结合 Gitea 的 webhook
钩子,以便在执行 git push
的时候,自动构建项目。
设置
。新建 Item
创建项目。构建触发器
,选择触发远程构建
,填入刚才创建的 token。保存
。jenkins.xml
文件,找到 <arguments>
标签,在里面加上 -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
。它的作用是关闭 CSRF
验证,不关的话,Gitea 的 webhook
会一直报 403 错误,无法使用。加好参数后,在该目录命令行下输入 jenkins.exe restart
重启 Jenkins。匿名用户具有可读权限
,再保存。仓库设置
。管理 web 钩子
,添加 web 钩子,钩子选项选择 Gitea
。添加 web 钩子
。
Jenkinsfile
文件,此时构建是不会成功的。所以接下来需要配置一下 Jenkinsfile
文件。将以下代码复制到你 Gitea 项目下的 Jenkinsfile
文件。jenkins 在构建时会自动读取文件的内容执行构建及部署操作。pipeline { agent any stages { stage('Build') { steps { // window 使用 bat, linux 使用 sh bat 'npm i' bat 'npm run build' } } stage('Deploy') { steps { bat 'xcopy .\\build\\* D:\\node-server\\dist\\ /s/e/y' // 这里需要改成你的静态服务器资源目录 } } } }
push
操作时,Gitea 都会通过 webhook
发送一个 post 请求给 Jenkins,让它执行构建及部署操作。如果你的操作系统是 Linux,可以在 Jenkins 打包完成后,使用 ssh 远程登录到阿里云,将打包后的文件复制到阿里云上的静态服务器上,这样就能实现阿里云自动部署了。具体怎么远程登录到阿里云,请看下文中的 《Github Actions 部署到阿里云》 一节。
如果你的项目是 Github 项目,那么使用 Github Actions 也许是更好的选择。
接下来看一下如何使用 Github Actions 部署到 Github Page。
在你需要部署到 Github Page 的项目下,建立一个 yml 文件,放在 .github/workflow
目录下。你可以命名为 ci.yml
,它类似于 Jenkins 的 Jenkinsfile
文件,里面包含的是要自动执行的脚本代码。
这个 yml 文件的内容如下:
name: Build and Deploy on: # 监听 master 分支上的 push 事件 push: branches: - master jobs: build-and-deploy: runs-on: ubuntu-latest # 构建环境使用 ubuntu steps: - name: Checkout uses: actions/checkout@v2.3.1 with: persist-credentials: false - name: Install and Build # 下载依赖 打包项目 run: | npm install npm run build - name: Deploy # 将打包内容发布到 github page uses: JamesIves/github-pages-deploy-action@3.5.9 # 使用别人写好的 actions with: # 自定义环境变量 ACCESS_TOKEN: ${{ secrets.VUE_ADMIN_TEMPLATE }} # VUE_ADMIN_TEMPLATE 是我的 secret 名称,需要替换成你的 BRANCH: master FOLDER: dist REPOSITORY_NAME: woai3c/woai3c.github.io # 这是我的 github page 仓库 TARGET_FOLDER: github-actions-demo # 打包的文件将放到静态服务器 github-actions-demo 目录下
上面有一个 ACCESS_TOKEN
变量需要自己配置。
settings
。developer settings
。Personal access tokens(个人访问令牌)
。Generate new token(生成新令牌)
。repo
。Generate token
,并将生成的 token 保存起来。settings
。
点击 secrets
->new secret
。
创建一个密钥,名称随便填(中间用下划线隔开),内容填入刚才创建的 token。
将上文代码中的 ACCESS_TOKEN: ${{ secrets.VUE_ADMIN_TEMPLATE }}
替换成刚才创建的 secret 名字,替换后代码如下 ACCESS_TOKEN: ${{ secrets.TEST_A_B }}
。保存后,提交到 Github。
以后你的项目只要执行 git push
,Github Actions 就会自动构建项目并发布到你的 Github Page 上。
Github Actions 的执行详情点击仓库中的 Actions
选项查看。
具体详情可以参考一下我的 demo 项目 github-actions-demo。
构建成功后,打开 Github Page 网站,可以发现内容已经发布成功。
root
(默认用户名),密码为你刚才重置的实例密码sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install npm
sudo npm install -g n
sudo n stable
mkdir node-server // 创建 node-server 文件夹 cd node-server // 进入 node-server 文件夹 npm init -y // 初始化项目 npm i express touch server.js // 创建 server.js 文件 vim server.js // 编辑 server.js 文件
将以下代码输入进去(用 vim 进入文件后按 i 进行编辑,保存时按 esc 然后输入 :wq,再按 enter),更多使用方法请自行搜索。
const express = require('express') const app = express() const port = 3388 // 填入自己的阿里云映射端口,在网络安全组配置。 app.use(express.static('dist')) app.listen(port, '0.0.0.0', () => { console.log(`listening`) })
执行 node server.js
开始监听,由于暂时没有 dist
目录,先不要着急。
注意,监听 IP 必须为 0.0.0.0
,详情请看部署Node.js项目注意事项。
阿里云入端口要在网络安全组中查看与配置。
请参考创建SSH密钥对和绑定SSH密钥对 ,将你的 ECS 服务器实例和密钥绑定,然后将私钥保存到你的电脑(例如保存在 ecs.pem 文件)。
打开你要部署到阿里云的 Github 项目,点击 setting->secrets。
点击 new secret
secret 名称为 SERVER_SSH_KEY
,并将刚才的阿里云密钥填入内容。
点击 add secret 完成。
在你项目下建立 .github\workflows\ci.yml
文件,填入以下内容:
name: Build app and deploy to aliyun on: #监听push操作 push: branches: # master分支,你也可以改成其他分支 - master jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: Install Node.js uses: actions/setup-node@v1 with: node-version: '12.16.2' - name: Install npm dependencies run: npm install - name: Run build task run: npm run build - name: Deploy to Server uses: easingthemes/ssh-deploy@v2.1.5 env: SSH_PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }} ARGS: '-rltgoDzvO --delete' SOURCE: dist # 这是要复制到阿里云静态服务器的文件夹名称 REMOTE_HOST: '118.190.217.8' # 你的阿里云公网地址 REMOTE_USER: root # 阿里云登录后默认为 root 用户,并且所在文件夹为 root TARGET: /root/node-server # 打包后的 dist 文件夹将放在 /root/node-server
保存,推送到 Github 上。
以后只要你的项目执行 git push
操作,就会自动执行 ci.yml
定义的脚本,将打包文件放到你的阿里云静态服务器上。
这个 Actions 主要做了两件事:
如果还是不懂,建议看一下我的 demo。