一. 概述
作為前端技術(shù)人員,如果要部署一個(gè)項(xiàng)目大體要經(jīng)過(guò):代碼開(kāi)發(fā)
、代碼推送
、打包dist文件
、scp到服務(wù)器
、服務(wù)器nginx配置
、完成部署
這幾個(gè)流程,現(xiàn)實(shí)中我們希望項(xiàng)目部署盡可能自動(dòng)且簡(jiǎn)單,因此誕生了各種CI/CD
工具,比如:Jenkins
、gitlab ci
、gitlab runner
等,其實(shí)我們最熟悉的 GitHub
也提供了CI/CD
的能力:GitHub Actions
,它于2019年11月正式發(fā)布,現(xiàn)已經(jīng)支持多種的語(yǔ)言和框架:Node.js, Python, Java, PHP, Ruby, Go, Rust, C/C++, .NET, Android, iOS.當(dāng)然在利用GitHub Actions
自動(dòng)部署項(xiàng)目之前,先要利用GitHub Pages
來(lái)發(fā)布我們的前端項(xiàng)目。
二. GitHub Pages
什么是 GitHub Pages
?官網(wǎng)的介紹:Websites for you and your projects.Hosted directly from your GitHub repository. Just edit, push, and your changes are live. 說(shuō)的很明確了,可以利用它,將我們托管在 GitHub
倉(cāng)庫(kù)的項(xiàng)目部署為一個(gè)可以對(duì)外訪問(wèn)的網(wǎng)站,免去了我們自己購(gòu)買與配置服務(wù)器的麻煩。
- 首先創(chuàng)建一個(gè)項(xiàng)目,以Vue項(xiàng)目為例,利用 Vue 腳手架創(chuàng)建一個(gè)項(xiàng)目
npm init vue@latest
這里假設(shè)你已經(jīng)熟悉了 Vue 項(xiàng)目創(chuàng)建,如果不熟悉Vue可以去查看
執(zhí)行如下命令:
> cd <your-project-name>
> npm install
> npm run dev
運(yùn)行后在瀏覽器中打開(kāi)本地地址,得到如下頁(yè)面:
- 在
GitHub
上創(chuàng)建一個(gè)新的Repository
,將項(xiàng)目上傳到GitHub
倉(cāng)庫(kù)
git init
git add .
git commit -m "備注信息"
git remote add origin 你的遠(yuǎn)程倉(cāng)庫(kù)地址
git push -u origin master
-
配置
GitHub Actions
回到GitHub
,點(diǎn)擊Setting
->Pages
,看到如下界面
image
image
并沒(méi)有展示網(wǎng)址,別急!此時(shí)還需要我們?nèi)バ陆ㄒ粋€(gè)名為gh-pages的分支,創(chuàng)建完成后再次打開(kāi)Pages
,可以看到頁(yè)面發(fā)生了變化
image
Source: 選擇
Deploy from a branch
, Branch:github pages
默認(rèn)只能識(shí)別項(xiàng)目根目錄的index
文件,我們這里選擇新建的gh-pages
的root
根目錄,意思是去這個(gè)分支的根目錄加載index.html
文件.
-
打包應(yīng)用,并發(fā)布到
gh-pages
分支
打包應(yīng)用,執(zhí)行npm run build
,在項(xiàng)目根目錄下得到打包后的產(chǎn)物dist
文件夾,
image切換當(dāng)前分支到
gh-pages
,并且將原有內(nèi)容全部刪除, 最后將dist
文件夾下的內(nèi)容全部拷貝到gh-pages
上,push到遠(yuǎn)端.
image
再次點(diǎn)擊Setting
->Pages
,稍等一會(huì)兒,下面出現(xiàn)了一個(gè)網(wǎng)址,這就是項(xiàng)目線上地址
image -
遇到問(wèn)題
點(diǎn)擊查看網(wǎng)址,并沒(méi)有像我們預(yù)期的那樣展示頁(yè)面,而是一片空白。打開(kāi)調(diào)試版查看錯(cuò)誤信息:
image
如果有項(xiàng)目部署經(jīng)驗(yàn)的一看就知道是怎么回事了,這是打包編譯后的文件路徑配置有問(wèn)題,資源文件css
、js
,加載的路徑地址不對(duì),加載的是根路徑
https://<用戶名>.github.io/assets/index.bf782a5b.js
,而我們的資源文件在/vue-pages/
目錄下,所以當(dāng)然報(bào)錯(cuò)404
,修復(fù)也很簡(jiǎn)單,如果你的Vue項(xiàng)目是基于 Vite 的構(gòu)建的,需要修改vite.config.js
,添加base:'./'
export default defineConfig({
plugins: [vue(), vueJsx()],
base:'./',// 將根路徑換成相對(duì)路徑
resolve: {
alias: {
"@": fileURLToPath(new URL("./src", import.meta.url)),
},
},
})
如果是基于webpack
構(gòu)建,修改vue.config.js
添加publicPath: './'
.
module.exports = {
/**
* publicPath 默認(rèn)是 / 是根路徑,這個(gè)是指服務(wù)的根路徑:https://xxx.github.io/,發(fā)布后會(huì)從這個(gè)路徑下找 js.css 等資源,而生成的網(wǎng)站路徑是這個(gè) https://xxx.github.io/Vue-Element/,顯然是找不到的
* 我們需要修改為 相對(duì)路徑'./' 或是‘.’ 或是 直接設(shè)置的項(xiàng)目子路徑 :/項(xiàng)目名稱/ 就可找到資源了
*/
publicPath: './',
outputDir: 'dist', // dist
assetsDir: 'static',
lintOnSave: process.env.NODE_ENV === 'development',
productionSourceMap: false,
...
重新打包,將dist
文件夾下內(nèi)容拷貝到gh-pages
分支下,并重新打開(kāi)pages
鏈接:https://<用戶名>.github.io/vue-pages/
成功部署!
每一次修改后都要重新打包,切換分支拷貝dist文件夾,實(shí)屬麻煩,能不能讓
GitHub
自動(dòng)檢測(cè)push
動(dòng)作,自動(dòng)進(jìn)行打包部署嗎?那就是GitHub Actions
的工作了.
三. GitHub Actions
什么是GitHub Actions
?
GitHub Actions
是GitHub
推出的一款持續(xù)集成(CI/CD)服務(wù),它給我們提供了虛擬的服務(wù)器資源,讓我們可以基于它完成自動(dòng)化測(cè)試、集成、部署等操作。這里簡(jiǎn)單介紹一下它的幾個(gè)基本概念,更多內(nèi)容可以去官網(wǎng)查看
基本概念
Workflows(工作流程)
持續(xù)集成的運(yùn)行過(guò)程稱為一次工作流程,也就是我們項(xiàng)目開(kāi)始自動(dòng)化部署到部署結(jié)束的這一段過(guò)程可以稱為工作流程.job (任務(wù))
一個(gè)工作流程中包含多個(gè)任務(wù),簡(jiǎn)單來(lái)說(shuō)就是一次自動(dòng)部署的過(guò)程需要完成一個(gè)或多個(gè)任務(wù).step(步驟)
部署項(xiàng)目需要按照一個(gè)一個(gè)的步驟來(lái)進(jìn)行,每個(gè)job
由多個(gè)step
構(gòu)成.action(動(dòng)作)
每個(gè)步驟step
可以包含一個(gè)或多個(gè)動(dòng)作,比如我們?cè)谝粋€(gè)步驟中執(zhí)行打包命令這個(gè)Action.
語(yǔ)法簡(jiǎn)介
-
name
name
字段是workflow
的名稱。如果省略該字段,默認(rèn)為當(dāng)前workflow
的文件名.
name: GitHub CI
-
on
on
字段指定觸發(fā)workflow
的條件,通常是某些事件,比如代碼推送push
,拉取pull_request
,可以是事件的數(shù)組.
on: push
or
on: [push, pull_request]
指定觸發(fā)事件時(shí),可以限定分支或標(biāo)簽:
on:
push:
branches:
- master
上面代碼表示:只有master
分支發(fā)生push
事件時(shí),才會(huì)觸發(fā)workflow
.
-
jobs
workflow
的核心就是jobs
,任務(wù)job
放在jobs
這個(gè)集合下,每一個(gè)job
都有job_id
,用job_id
標(biāo)識(shí)一個(gè)具體任務(wù) -
jobs.<job_id>.name
任務(wù)說(shuō)明
jobs:
my_first_job: // job_id
name: My first job
my_second_job:// job_id
name: My second job
上面的jobs
字段包含兩項(xiàng)任務(wù),job_id
分別是my_first_job
和my_second_job
。
-
jobs.<job_id>.runs-on
runs-on
字段指定運(yùn)行所需要的虛擬機(jī)環(huán)境,它是必填字段。
runs-on: ubuntu-18.04
GitHub Actions
給我們提提供的運(yùn)行環(huán)境主要有以下幾種:
ubuntu-latest,ubuntu-18.04或ubuntu-16.04
windows-latest,windows-2019或windows-2016
macOS-latest或macOS-10.14
-
jobs.<job_id>.steps
任務(wù)步驟,一個(gè)job
可以包含多個(gè)步驟,我們需要分為多個(gè)步驟來(lái)完成這個(gè)任務(wù),每個(gè)步驟包含下面三個(gè)字段:
jobs.<job_id>.steps.name:步驟名稱。
jobs.<job_id>.steps.run:該步驟運(yùn)行的命令或者 action。
jobs.<job_id>.steps.env:該步驟所需的環(huán)境變量。
使用介紹
- 新建.yml文件
點(diǎn)擊主頁(yè)Actions
->New workflow
->set up a workflow yourself
,當(dāng)然你也可以選擇一個(gè)模板,點(diǎn)擊start commit
則會(huì)自動(dòng)在我們項(xiàng)目目錄下新建.github/workflows/main.yml
文件.
image
整個(gè)workflow
的核心就是yml
腳本的書(shū)寫(xiě)。如果你需要某個(gè)action
,不必自己寫(xiě)復(fù)雜的腳本,直接引用他人寫(xiě)好的 action
即可,整個(gè)持續(xù)集成過(guò)程,就變成了一個(gè)actions
的組合,你可以在GitHub
的官方市場(chǎng),可以搜索到他人提交的actions
. 下面是我們要自動(dòng)發(fā)布GitHub pages
所寫(xiě)的腳本:
name: CI Github Pages
on:
#監(jiān)聽(tīng)push操作
push:
branches:
- main # 這里只配置了main分支,所以只有推送main分支才會(huì)觸發(fā)以下任務(wù)
jobs:
# 任務(wù)ID
build-and-deploy:
# 運(yùn)行環(huán)境
runs-on: ubuntu-latest
# 步驟
steps:
# 官方action,將代碼拉取到虛擬機(jī)
- name: Checkout ?
uses: actions/checkout@v3
- name: Install and Build # 安裝依賴、打包,如果提前已打包好無(wú)需這一步
run: |
npm install
npm run build
- name: Deploy # 部署
uses: JamesIves/github-pages-deploy-action@v4.3.3
with:
branch: gh-pages # 部署后提交到那個(gè)分支
folder: dist # 這里填打包好的目錄名稱
上面整個(gè)workflow
的說(shuō)明:
- 只有當(dāng)
main
分支有新的push
推送時(shí)候才會(huì)執(zhí)行整個(gè)workflow
. - 整個(gè)
workflow
只有一個(gè)job
,job_id
是build-and-deploy
,name
被省略. -
job
有三個(gè)step
: 第一步是Checkout
,獲取源碼,使用的action
是GitHub
官方的actions/checkout
. - 第二步:
Install and Build
,執(zhí)行了兩條命令:npm install
,npm run build
,分別安裝依賴與打包應(yīng)用. - 第三步:
Deploy
部署,使用的第三方action
:JamesIves/github-pages-deploy-action@v4.3.3
,它有兩個(gè)參數(shù):分別是branch
、folder
,更多關(guān)于這個(gè)action
的詳情可以去查看.
當(dāng)點(diǎn)擊
Start commit
,GitHub Actions
會(huì)自動(dòng)運(yùn)行workflow
. 修改工程文字歡迎文字:
<HelloWorld msg="You did it!" />
改為:
<HelloWorld msg="GitHub Actions CI Succeed!" />
push
可以點(diǎn)擊Actions
查看工作流的運(yùn)行情況
當(dāng)這個(gè)黃色加載動(dòng)畫(huà)變成綠色后表示
workflow
運(yùn)行完成,看下最終效果:達(dá)到了自動(dòng)部署的目的.
四. 設(shè)置Custom domain
其實(shí)經(jīng)過(guò)上面的三步已經(jīng)可以實(shí)現(xiàn)自動(dòng)部署的目的了,但是還是有點(diǎn)瑕疵。我們部署后的項(xiàng)目地址是:https://<用戶名>.github.io/vue-pages/
,域名還是GitHub
的,能不能改成我們自己的專屬域名呢?比如改成http://<用戶名>.com/
,那就需要設(shè)置Custom domain
了。
1. 購(gòu)買域名
如果想將項(xiàng)目地址改成自己的專屬域名,首先需要你去購(gòu)買一個(gè)域名,目前阿里云,騰訊云都支持域名的購(gòu)買,搜索自己喜歡的域名直接付款就好了。
2. 購(gòu)買域名后,還需要我們進(jìn)行實(shí)名認(rèn)證以及備案,按照平臺(tái)的提示進(jìn)行操作就好了,這里不再涉及.
3. 進(jìn)行DNS解析配置
這里以阿里云為例,打開(kāi)域名解析控制臺(tái),點(diǎn)擊解析按鈕
點(diǎn)擊添加記錄按鈕,將下面兩種類型的記錄值添加上,記錄類型是:
CNAME
,記錄值就是你GitHub
的主域名.4. 設(shè)置Custom domain
返回到項(xiàng)目的GitHub pages
設(shè)置頁(yè)面,將我們購(gòu)買的域名添加在Custom domain
中,點(diǎn)擊save
,可以看到pages
的地址變成了我們自己的域名,訪問(wèn)它就會(huì)看到你的網(wǎng)站了.
五. 小結(jié)
GitHub Actions
給我們提供了一站式的自動(dòng)化部署體驗(yàn),加上Custom domain
的設(shè)置,完全可以用于搭建我們的個(gè)人博客,最重要的是這完全免費(fèi). 你也可以用它來(lái)部署其他框架的項(xiàng)目,當(dāng)然這里的重點(diǎn)是的yml
腳本的書(shū)寫(xiě).
一些參考: