GithubCI+webhook實現push自動化部署(更靈活的指令碼模式)
1.建立一個倉庫並上傳程式碼
推送程式碼
程式碼倉庫 已經有程式碼 了這是第一步
2.開啟actions 選擇對應的環境
- 我們不需要自己編寫,可以根據現成的進行改動
- 引數介紹
name: Java CI with Gradle #工作流程描述 在幹麼 #自定義
on: #定義觸發以下的工作流程事件 當一下操作進行時,將會觸發工作流程
push:
branches: [ main ] #觸發的主分支
pull_request: #每次建立拉取請求時
branches: [ main ] #以main為目標,此工作流程將被執行
#以下是事件發生時 被執行的部分,
jobs: #工作
build: #工作的名稱 #自定義
runs-on: ${matrix} #引用下面的變數
strategy:
matrix: #指標 可以選擇多個版本 或多個作業系統
os: [ubuntu-latest,windows-latest,macOS-latest] #可以是陣列
steps:
- uses: actions/checkout@v2 #checkout結賬步驟 # v2是版本 #檢查程式碼
- name: Set up JDK 1.8
uses: actions/setup-java@v1 #定義java環境 不需要配置任何東西,例如jenkins會配置java版本
with:
java-version: 1.8 # java版本 並將會安裝他
- name: Grant execute permission for gradlew #每次引用動作時,都將使用 此屬性 對應 - uses
run: chmod +x gradlew #使用run 來執行命令
- name: Build with Gradle
run: ./gradlew build #步驟近呼叫build
#以上的所有操作均在一個環境中執行
- 建立合併到其中的請求
- 觸發了請求
-
實際執行的步驟
-
Ci.yml已經成為程式碼的一部分(已經合併了程式碼)
- 修改程式碼
提交建立請求
3.我們新增動作 push 到我們的docker hub上
https://github.com/marketplace/actions/docker-build-push-action
看到事例引數,是我們可以連結到docker hub
steps:
- uses: actions/checkout@v2.3.2
name: Check out code
- uses: mr-smithers-excellent/docker-build-push@v5
name: Build & push Docker image
with:
image: repo/image
tags: v1, latest
registry: registry-url.io
dockerfile: Dockerfile.ci
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- 更改檔案
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Java CI with Gradle
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ${{matrix.os}}
straety:
maritx:
os: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build
- name: build and push Docker images
uses: mr-smithers-excellent/docker-build-push@v5
with:
image: ylmcr7/d1
registry: docker.io
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
4.觸發webhook模組實現自動化部署
https://docs.github.com/cn/free-pro-team@latest/developers/webhooks-and-events/about-webhooks
Webhook,也就是人們常說的鉤子,是一個很有用的工具。你可以通過定製 Webhook 來監測你在 Github.com 上的各種事件,最常見的莫過於 push 事件。如果你設定了一個監測 push 事件的 Webhook,那麼每當你的這個專案有了任何提交,這個 Webhook 都會被觸發,這時 Github 就會傳送一個 HTTP POST 請求到你配置好的地址。
如此一來,你就可以通過這種方式去自動完成一些重複性工作;比如,你可以用 Webhook 來自動觸發一些持續整合(CI)工具的運作,比如 Travis CI;又或者是通過 Webhook 去部署你的線上伺服器。
Github 開發者平臺的文件中對 Webhook 的所能做的事是這樣描述
https://docs.github.com/cn/free-pro-team@latest/developers/webhooks-and-events/about-webhooks
You’re only limited by your imagination.
面臨的問題
我們公司正使用github作為我們的公開倉庫,但是考慮到github 是個開源的倉庫,所以我們使用阿里雲的OSS作為一個實時的備份系統,使用webhook拉取我們的程式碼到本地伺服器進行部署;為了實現這一個自動化的流程,所以我們使用webhook;
需要準備東西:
- 一個能夠響應 Webhook 的外網伺服器(有nginx服務)
- 獨立外網的伺服器;
- github倉庫配置webhook
如果你準備好了 ,那跟隨我一起揭開這神祕的面紗;
參考:
https://jerryzou.com/posts/webhook-practice/
https://aotu.io/notes/2016/01/07/auto-deploy-website-by-webhooks-of-github/index.html
http://www.showerlee.com/archives/2893
https://docs.github.com/cn/free-pro-team@latest/developers/webhooks-and-events/about-webhooks
1.響應 Webhook 的伺服器
為了響應 Webhook 所發出的請求,從而做一些我們想做的事情,我們得先實現一個響應伺服器。本文采用 Node 來實現一個原型,你當然也可以用 PHP,python 等,全憑個人喜好啦。程式碼很短,就直接陳列在下方了:
這個指令碼 需要修改只有 token
還有var commands命令
cat >index.js <<"EOF"
const http = require('http');
const exec = require('exec');
const PORT = 7316;
const token = '070453a71f21b53f0af7bab4f41d4908680d1fcb';
const deployServer = http.createServer(function(request, response) {
if (/^\/deploy\?token=/i.test(request.url) && request.url.includes(token)) {
var commands = [
'sh test.sh'
// 'sh sashimi-online-github.sh'
].join(' && ');
exec(commands, function(err, out, code) {
if (err instanceof Error) {
response.writeHead(500);
response.end('Server Internal Error.');
throw err
}
process.stderr.write(err);
process.stdout.write(out);
response.writeHead(200);
response.end('Deploy Done.');
});
} else {
response.writeHead(404);
response.end('Not Found.');
}
});
deployServer.listen(PORT);
EOF
ps:如果還需要實現更多,更復雜的功能,直接在 commands
陣列中新增便是。
只要啟動了伺服器,那麼 Webhook 就可以通過類似於 http://121.199.xxx.xxx:7316/deploy/ 來測試一下的指令碼了;
- 貼出來test.sh 用來做測試看效果
cat >test.sh<<"EOF"
#!/bin/bash
echo "123">> test.log
EOF
2.啟動服務
# 在後臺啟動部署伺服器
$ node server.js &
Run Node Server Forever
我在實際使用的時候發現,我的 Node 伺服器時不時會自動停掉,具體原因我暫時還沒有弄清楚。不過似乎很多人都遇到了這樣的困擾,要解決這個問題,forever 是個不錯的選擇。藉助 forever 這個庫,它可以保證 Node 持續執行下去,一旦伺服器掛了,它都會重啟伺服器。
安裝 forever:
$ [sudo] npm install -g forever
執行:
$ cd { 部署伺服器的根目錄 }
$ forever start index.js
如果伺服器安裝的是 Ubuntu 系統,而 Ubuntu 中原本就有一個叫 node 的包。為了避免衝突,在 Ubuntu 上安裝或使用 Node 得用 nodejs 這個名字。而 forever 預設是使用 node 作為執行指令碼的程式名。所以為了處理 Ubuntu 存在的這種特殊情況,在啟動 forever 時得另外新增一個引數:
$ forever start server.js -c nodejs
3. 配置nginx
到這一步服務已經跑起來了,但是對外網並不能直接訪問到,所以還需要配置一下Nginx
做一下反向代理:
[root@web01 ~]# cat /application/nginx/conf/extra/blog.conf
server {
listen 80;
`````````````````
location /deploy {
proxy_set_header host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-forward-for $proxy_add_x_forwarded_for;
proxy_pass http://localhost:7316;
}
````````````````
}
重啟nginx
ngin -t
nginx -s reload
netstat -ntlp | grep 7310
OK,到這裡整個服務已經搭建完成,下一步就只需要配置Github webhooks
。
4.配置github webhooks
如果像是本文這種最簡易的應用,Webhook 的配置是十分簡單的。首先進入你的 repo 主頁,通過點選頁面上的按鈕 [settings] -> [Webhooks & service] 進入 Webhooks 配置主頁面。也可以通過下面這個連結直接進入配置頁面:
https://github.com/[ 使用者名稱 ]/[ 倉庫名稱 ]/settings/hooks
初次打卡webhook你是否和我一樣懵逼
token 值哪裡來?
Seret值要不要填
Payload URL哪裡來
接下來 讓我帶你一步步設定
1.Payload URL
http://121.*.*.165/deploy?token=070453a71f21b53f0af7bab4f41d4908680d1fcb
你就用這個模板就可以了 網上套你自己的nginx站點ip
2.在Github下建立Personal access token
訪問你的程式碼倉庫如下路徑
https://github.com/settings/tokens
這個token注意要和index.js檔案裡面的token值保持一致;
3.配置GitHub CI.yaml內容
此時我們只是配置好了webhook,還不行,我們還要配置githubCI.yaml檔案,當我們提交程式碼是,會自動觸發webhook去我們的伺服器執行commands;
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Java CI with Gradle
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build
- name: Build And Push Docker images
uses: mr-smithers-excellent/docker-build-push@v4
with:
image: ylmcr7/ubuntu
registry: docker.io
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Invoke deployment hook #使用其他倉庫的這個內容
uses: jasongitmail/fast-webhook@v1
with:
url: ${{ secrets.WEBHOOK_URL }}
json: '{"hook": "233"}'
$ WEBHOOK_URL的值和Payload URL保持一致;設定方法參考上面?
此時有了這些檔案 ,我們的github actions webhook才能協同工作;
5.測試提交程式碼
https://github.com/ylmcr7/my-project
我們使用這個專案進行測試;你可以先fork然後再進行
因為我走的是ssh. 所我就先開始了
1.下載程式碼
git clone
2.上傳新檔案
$ touch 12.txt
$ git add .
$ git commit -m "12.txt"
$ git push
3.檢視github actions是否成功
4.檢視comands是否被執行成功
[root@web01 ~]# stat test.log
檔案:"test.log"
大小:29 塊:8 IO 塊:4096 普通檔案
裝置:fd01h/64769d Inode:1185632 硬連結:1
許可權:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近訪問:2020-12-17 15:18:18.053332721 +0800
最近更改:2020-12-17 17:18:20.743987833 +0800
最近改動:2020-12-17 17:18:20.743987833 +0800
建立時間:-
OK 大功告成
!!!!!!!
相關文章
- 實現指令碼自動部署docker指令碼Docker
- vue自動化部署指令碼Vue指令碼
- 《轉載》Jenkins持續整合-自動化部署指令碼的實現《python》Jenkins指令碼Python
- WebSocket的故事(六)—— Springboot中,實現更靈活的WebSocketWebSpring Boot
- MySQL8.0的自動部署指令碼MySql指令碼
- k8s自動化部署springcloud、springboot指令碼K8SGCCloudSpring Boot指令碼
- python實現自動搶課指令碼Python指令碼
- linux透過shell指令碼實現ssh互動式自動化Linux指令碼
- Gitlab利用Webhook實現Push程式碼後的jenkins自動構建GitlabWebHookJenkins
- specjvm自動化指令碼JVM指令碼
- [原] php + Laravel 實現部署自動化PHPLaravel
- 利用Github Actions實現自動化部署Github
- Docker+LNMP+Jenkins+ 碼雲實現 PHP 程式碼自動化部署DockerLNMPJenkinsPHP
- 使用 Git 實現 專案的自動化部署Git
- 利用github提供的Webhooks實現自動化部署GithubWebHook
- Spring Aop中解析spel表示式,實現更靈活的功能Spring
- 前端專案nodejs自動部署指令碼前端NodeJS指令碼
- 更靈活的邊緣雲原生運維:OpenYurt 單元化部署新增 Patch 特性運維
- 使用GitHub的Webhooks實現程式碼的自動部署GithubWebHook
- 原始碼分析:Phaser 之更靈活的同步屏障原始碼
- GO 使用Webhook 實現github 自動化部署GoWebHookGithub
- jenkins + GitHub 實現專案自動化部署JenkinsGithub
- 使用 Jenkins + Ansible 實現自動化部署 NginxJenkinsNginx
- 如何實現工具無關化?關於自動化測試指令碼的設計指令碼
- Dockerfile---指令碼自動化Docker指令碼
- 使用 Git 實現 Laravel 專案的自動化部署GitLaravel
- 利用Python實現自動掃雷小指令碼Python指令碼
- flyway實現java 自動升級SQL指令碼JavaSQL指令碼
- aspcore+jenkins+iis+window實現自動化部署Jenkins
- 華納雲:如何實現tomcat自動化部署Tomcat
- mydumper自動化安裝指令碼指令碼
- Python定時任務前端專案本地自動打包遠端部署指令碼實現Python前端指令碼
- 手摸手,帶你實現程式碼自動部署
- 利用 webhook 實現 Git 自動部署 Laravel 程式碼WebHookGitLaravel
- JMeter 介面自動化測試(手工轉自動化指令碼)JMeter指令碼
- 比包月更靈活、比按量更划算,阿里雲推出全新售賣模式阿里模式
- 使用 Fastlane 實現 iOS 跟 Android 自動打包指令碼ASTiOSAndroid指令碼
- 實現MySQL表結構自動分割槽指令碼MySql指令碼