github action自动部署构建入门
Github Action自動部署構建
文章目錄
- Github Action自動部署構建
- 1. 簡介
- 2. 基礎概念
- 3. workflow 文件
- 3.1 觸發(fā)事件
- 3.2 job任務
- 3.3 運行主機環(huán)境
- 3.4 運行步驟
- 3.5 引用action
- 3.6 顯示workflow status
- 3.7 with傳參
- 3.8 env環(huán)境變量
- 3.9 secrets引用
- 3.10 action/checkout檢查
- 4. 獲取token
- 5. 示例
- 5.1 一條命令的action
- 5.2 React 項目發(fā)布到 GitHub Pages
1. 簡介
GitHub Actions 是 GitHub 的持續(xù)集成服務,于2018年10月推出。
GitHub Actions 幫助您自動完成軟件開發(fā)周期內的任務。 GitHub Actions 是事件驅動的,意味著您可以在指定事件發(fā)生后運行一系列命令。
工作流程是您添加到倉庫的自動化過程。 工作流程由一項或多項作業(yè)組成,可以計劃或由事件觸發(fā)。 工作流程可用于在 GitHub 上構建、測試、打包、發(fā)布或部署項目。
GitHub 官方市場,我們除了自己編寫action,也可以借用別人的。
每個 action 就是一個獨立腳本,因此可以做成代碼倉庫,使用userName/repoName的語法引用 action。比如,actions/setup-node就表示github.com/actions/setup-node這個倉庫,它代表一個 action,作用是安裝 Node.js。事實上,GitHub 官方的 actions 都放在 github.com/actions 里面。
actions 也有版本的概念,下面都是合法的 action 引用,用的就是 Git 的指針概念,詳見官方文檔。
actions/setup-node@74bc508 # 指向一個 commit actions/setup-node@v1.0 # 指向一個標簽 actions/setup-node@master # 指向一個分支2. 基礎概念
GitHub Ac-tions 為每個任務 (job) 都提供了一個虛擬機來執(zhí)行,每臺虛擬機都有相同的硬件資源:
- 2-core CPU
- 7 GB RAM 內存
- 14 GB SSD 硬盤空間
使用限制:
- 每個倉庫只能同時支持20個 workflow 并行。
- 每小時可以調用1000次 GitHub API 。
- 每個 job 最多可以執(zhí)行6個小時。
- 免費版的用戶最大支持20個 job 并發(fā)執(zhí)行,macOS 最大只支持5個。
- 私有倉庫每月累計使用時間為2000分鐘,超過后$ 0.008/分鐘,公共倉庫則無限制。
操作系統(tǒng)方面可選擇 Win-dows server、Linux、ma-cOS,并預裝了大量軟件包和工具。
雖然名稱叫持續(xù)集成,但當所有任務終止和完成時,虛擬環(huán)境內的數(shù)據(jù)會隨之清空,并不會持續(xù)。即每個新任務都是一個全新的虛擬環(huán)境。
3. workflow 文件
GitHub Ac-tions 的配置文件叫做 work-flow 文件(官方中文翻譯為 “工作流程文件”),存放在代碼倉庫的.github/workflows 目錄中。work-flow 文件采用 YAML 格式,文件名可以任意取,但是后綴名統(tǒng)一為.yml,比如 p3terx.yml。一個庫可以有多個 work-flow 文件,GitHub 只要發(fā)現(xiàn).github/workflows 目錄里面有.yml 文件,就會按照文件中所指定的觸發(fā)條件在符合條件時自動運行該文件中的工作流程。在 Ac-tions 頁面可以看到很多種語言的 work-flow 文件的模版,可以用于簡單的構建與測試。
workflow 文件的配置字段非常多,詳見官方文檔。下面是一些基本字段。
3.1 觸發(fā)事件
#push事件觸發(fā) workflow。 on: push#on字段也可以是事件的數(shù)組。`push`事件或`pull_request`事件都可以觸發(fā) `workflow`。 on: [push, pull_request] #只有`master`分支發(fā)生`push`事件時,才會觸發(fā) workflow on:push:branches: - master #push tag 時觸發(fā) on:push:tags:- 'v*'#發(fā)布 re-lease 觸發(fā) on:release:types: [published]定時觸發(fā)on:schedule:- cron: '0 * * * *'3.2 job任務
workflow 文件的主體是jobs字段,表示要執(zhí)行的一項或多項任務。
jobs字段里面,需要寫出每一項任務的job_id,具體名稱自定義。job_id里面的name字段是任務的說明。
3.3 運行主機環(huán)境
runs-on字段指定運行所需要的虛擬機環(huán)境。它是必填字段。目前可用的虛擬機如下。
ubuntu-latest,ubuntu-18.04或ubuntu-16.04 windows-latest,windows-2019或windows-2016 macOS-latest或macOS-10.14 runs-on: ubuntu-18.043.4 運行步驟
#`steps`字段指定每個 `Job` 的運行步驟,可以包含一個或多個步驟。每個步驟都可以指定以下三個字段。 jobs.<job_id>.steps.name:步驟名稱。 jobs.<job_id>.steps.run:該步驟運行的命令或者 action。 jobs.<job_id>.steps.env:該步驟所需的環(huán)境變量。 steps:- uses: actions/setup-node@74bc508 # Reference a specific commit- uses: actions/setup-node@v1 # Reference the major version of a release- uses: actions/setup-node@v1.2 # Reference a minor version of a release- uses: actions/setup-node@master # Reference a branch示例:
jobs:build:# Job name is Greetingname: Greeting# This job runs on Linuxruns-on: ubuntu-lateststeps:# This step uses GitHub's hello-world-javascript-action: https://github.com/actions/hello-world-javascript-action- name: Hello worlduses: actions/hello-world-javascript-action@v1with:who-to-greet: 'Mona the Octocat'id: hello# This step prints an output (time) from the previous step's action.- name: Echo the greeting's timerun: echo 'The time was ${{ steps.hello.outputs.time }}.'3.5 引用action
#public repo {owner}/{repo}@{ref} or {owner}/{repo}/{path}@{ref}. #same repo{owner}/{repo}@{ref} or ./path/to/dir|-- hello-world (repository)| |__ .github| └── workflows| └── my-first-workflow.yml| └── actions| |__ hello-world-action| └── action.ymljobs:build:runs-on: ubuntu-lateststeps:# This step checks out a copy of your repository.- uses: actions/checkout@v1# This step references the directory that contains the action.- uses: ../github/actions/hello-world-action#docker container docker://{image}:{tag} 示例:jobs:my_first_job:steps:- name: My first stepuses: docker://gcr.io/cloud-builders/gradle- name: Install Dependenciesrun: npm installshell: bash3.6 顯示workflow status
3.7 with傳參
firstname ,會被轉化為INPUTFIRST_NAME使用
jobs:my_first_job:steps:- name: My first stepuses: actions/hello_world@masterwith:first_name: Monamiddle_name: Thelast_name: Octocat3.8 env環(huán)境變量
steps:- name: Hello worldrun: echo Hello world $FIRST_NAME $middle_name $Last_Name!env:FIRST_NAME: Monamiddle_name: TheLast_Name: Octocat3.9 secrets引用
steps:- name: My first actionenv:GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}FIRST_NAME: MonaLAST_NAME: Octocatsteps:- name: Hello world actionwith: # Set the secret as an inputsuper_secret: ${{ secrets.SuperSecret }}env: # Or as an environment variablesuper_secret: ${{ secrets.SuperSecret }}3.10 action/checkout檢查
https://github.com/actions/checkout
最新版本特性:
- 提高性能
默認情況下只獲取一個提交 - 腳本驗證的 git 命令
身份驗證令牌保留在本地 git 配置中 - 支持SSH
- 創(chuàng)建本地分支
檢出分支時不再分離 HEAD - 改進的布局
輸入path總是相對于 $GITHUB_WORKSPACE
與容器操作更好地對齊,其中 $GITHUB_WORKSPACE 被映射到 - 回退到 REST API 下載
當 PATH 中沒有 Git 2.18 或更高版本時,將使用 REST API 下載文件
使用作業(yè)容器時,使用容器的 PATH
4. 獲取token
根據(jù)GitHub提供的文檔生成密鑰,生成好后記得復制下來,要不然再訪問頁面的時候密鑰就不展示了。
# 生成密鑰時主要需要開啟的權限有 1、rope 下所有權限 2、admin:repo_hook 下所有權限 3、delete_repo 下所有權限 # 主要是關于rope的權限,盡量都開啟要使用Actions功能的倉庫的Settings中的Secrets中新增一條
Name為:ACCESS_TOKEN Value為:剛才生成好的密鑰5. 示例
5.1 一條命令的action
下面是一個完整的 workflow 文件的范例。
name: Greeting from Mona on: pushjobs:my-job:name: My Jobruns-on: ubuntu-lateststeps:- name: Print a greetingenv:MY_VAR: Hi there! My name isFIRST_NAME: MonaMIDDLE_NAME: TheLAST_NAME: Octocatrun: |echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.示例文件運行截圖:
5.2 React 項目發(fā)布到 GitHub Pages
下面是一個實例,通過 GitHub Actions 構建一個 React 項目,并發(fā)布到 GitHub Pages。最終代碼都在這個倉庫里面,發(fā)布后的參考網(wǎng)址為ghostwritten.github.io/github-actions-demo
第一步:這個示例需要將構建成果發(fā)到 GitHub 倉庫,因此需要 GitHub 密鑰。按照官方文檔,生成一個密鑰。然后,將這個密鑰儲存到當前倉庫的Settings/Secrets里面。
上圖是儲存秘密的環(huán)境變量的地方。環(huán)境變量的名字可以隨便起,這里用的是ACCESS_TOKEN。如果你不用這個名字,后面腳本里的變量名也要跟著改。
第二步:本地計算機使用create-react-app,生成一個標準的 React 應用。
$ npx create-react-app github-actions-demo $ cd github-actions-demo然后,打開package.json文件,加一個homepage字段,表示該應用發(fā)布后的根目錄(參見官方文檔)。
"homepage": "https://[username].github.io/github-actions-demo",上面代碼中,將[username]替換成你的 GitHub 用戶名,參見范例。
第三步,在這個倉庫的.github/workflows目錄,生成一個 workflow 文件,名字可以隨便取,這個示例是ci.yml。
別人的 action:JamesIves/github-pages-deploy-action
name: Build and Deploy on:push:branches:- master jobs:build-and-deploy:runs-on: ubuntu-lateststeps:- name: Checkout 🛎?uses: actions/checkout@v1- name: Build and Deployuses: JamesIves/github-pages-deploy-action@releases/v2env:ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} ## GitHub 密鑰 ACCESS_TOKEN 是在第二步Settings的Secrets中新增時定義的Name,要保持一致BASE_BRANCH: master # The branch the action should deploy from.BRANCH: gh-pages # The branch the action should deploy to.FOLDER: build # The folder the action should deploy.BUILD_SCRIPT: npm install && npm run-script build # The build script the action should run prior to deploying.上面這個 workflow 文件的要點如下。
- 整個流程在master分支發(fā)生push事件時觸發(fā)。
- 只有一個job,運行在虛擬機環(huán)境ubuntu-latest。
- 第一步是獲取源碼,使用的 action 是actions/checkout。
- 第二步是構建和部署,使用的 action 是JamesIves/github-pages-deploy-action。
- 第二步需要四個環(huán)境變量,分別為 GitHub 密鑰、發(fā)布分支、構建成果所在目錄、構建腳本。其中,只有 GitHub密鑰是秘密變量,需要寫在雙括號里面,其他三個都可以直接寫在文件里。
第五步,保存上面的文件后,將整個倉庫推送到 GitHub。GitHub 發(fā)現(xiàn)了 workflow 文件以后,就會自動運行。你可以在網(wǎng)站上實時查看運行日志,日志默認保存30天。
等到 workflow 運行結束,訪問 GitHub Page,即https://ghostwritten.github.io/github-actions-demo,會看到構建成果已經(jīng)發(fā)上網(wǎng)了。如果你想知道如何利用github搭建一個博客,請參考。因為我的博客域名為smoothies.com.cn,當訪問ghostwritten.github.io會自動跳轉smoothies.com.cn。
以后,每次修改后推送源碼,GitHub Actions 都會自動運行,將構建產(chǎn)物發(fā)布到網(wǎng)頁。
參考鏈接:
- https://jamesiv.es/
- https://github.com/JamesIves
- https://github.com/JamesIves/github-pages-deploy-action
- https://www.ruanyifeng.com/blog/2019/09/getting-started-with-github-actions.html
總結
以上是生活随笔為你收集整理的github action自动部署构建入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米安卓java模拟器手机版_Andro
- 下一篇: 前端学习(503):水平居中布局得第三种