GithubCI+webhook實現push自動化部署(更靈活的指令碼模式)

愛吃魚的小明發表於2020-12-31

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;

需要準備東西:

  1. 一個能夠響應 Webhook 的外網伺服器(有nginx服務)
  2. 獨立外網的伺服器;
  3. 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 大功告成

!!!!!!!

相關文章