使用GithubAction自動構建部署專案

2023-03-29 18:00:40

GitHub Actions 是一種持續整合和持續交付(CI/CD) 平臺,可用於自動執行生成、測試和部署管道。 您可以建立工作流程來構建和測試儲存庫的每個拉取請求,或將合併的拉取請求部署到生產環境。 GitHub Actions 不僅僅是DevOps,還允許您在儲存庫中發生其他事件時執行工作流程。

1.1 專案准備

這裡以一個javaWEB專案作為演示:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>GithubActionDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>GithubActionDemo</name>
    <description>GithubActionDemo</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>

這裡注意一下SpringBoot 2.x 的話最好就用JDK1.8 如果要用Springboot 3.X版本必須使用JDK17。Springboot 3.x已經廢棄JDK1.8了。

2.1 GithubAction設定

當然首先應該把該專案上傳至Github,點選Action索引標籤:

這裡可以選擇Github提供的諸多工作流模板:

也可以自己自定義一個工作流,new workflow因為該專案是一個JavaWeb專案這裡隨便找了一個maven打包構建的模板:

# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

name: Java CI with Maven

on:    
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  develop_build:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取最新提交的程式碼
        uses: actions/checkout@v3

      - name: 設定jdk
        uses: actions/setup-java@v3
        with:
          distribution: 'temurin'
          java-version: '17'
          cache: 'maven'

      - name: 專案打包
        run: mvn -B package

      - name: 刪除舊的jar包以及執行指令碼
        run: sshpass -p ${{secrets.CHAOYUEPASSWORD}} ssh -o StrictHostKeyChecking=no root@${{secrets.CHAOYUEIP}} "cd /root/GitHub_Action && rm -rf ./*"

      - name: 上傳jar包和啟動指令碼到伺服器中
        run: sshpass -p ${{secrets.CHAOYUEPASSWORD}} scp -r -o StrictHostKeyChecking=no ./target/GithubActionDemo-0.0.1-SNAPSHOT.jar ./run.sh root@${{secrets.CHAOYUEIP}}:/root/GitHub_Action

      - name: 啟動專案
        run: sshpass -p ${{secrets.CHAOYUEPASSWORD}} ssh -o StrictHostKeyChecking=no root@${{secrets.CHAOYUEIP}} "cd /root/GitHub_Action && chmod +x run.sh && ./run.sh"

以下為該指令碼的說明:

workFlow 說明
name 自定義workFlow名字
on 觸發器,指定該工作流什麼時候生效,這裡是在push和pull_request的時候觸發生效
job 一個任務,可以有多個
runs-on 構建部署過程可以在本地也可以使用github提供的虛擬機器器服務
steps 構建步驟,可以有多個

sshpass是一個遠端登入伺服器的一個外掛工具,這裡我現在伺服器裡建立了一個目錄/root/GitHub_Action用於存放構建後的專案。run.sh為啟動指令碼內容如下:

# run.sh
# 切換到jar包目錄下
cd /root/GitHub_Action
# 殺死之前的專案程序。這裡的cut -c9-14是擷取程序id,不一定都是-c9-14
# 可以先執行ps -ef|grep java|grep GitHub_Action-0.0.1-SNAPSHOT.jar看一下程序id是第幾位到第幾位
ps -ef|grep java|grep GithubActionDemo-0.0.1-SNAPSHOT.jar|cut -c9-14|xargs kill -9
# 停5秒
sleep 5s
# 使環境變數生效
source /root/.bash_profile
# 執行專案
nohup java -jar GithubActionDemo-0.0.1-SNAPSHOT.jar >/root/cicd.log 2>&1 &

run.sh直接存放在專案根目錄:

遠端登入伺服器肯定要使用者名稱和密碼,這裡不建議用明文的形式直接寫在指令碼中除非你的專案是private的,方式是在Setting裡存放伺服器IP,使用者名稱,密碼:

呼叫方式為:${{secrets.你的secret}}
到這裡一個workflow就定義完畢了,返回到原專案會發現多了一個資料夾:

這個資料夾裡存放的就是我們的workFlow.yaml檔案

3.1 執行測試

我們push一下本地專案到Github,便會觸發workFlow的工作條件。在Action介面能看到詳細的構建過程:

可以看到每一步都是按照我們的指令碼檔案按序在執行。

執行完畢後jar包會上傳至伺服器:

由於我們指令碼中寫了啟動命令,就不用再在伺服器裡java -jar執行了。現在我們存取專案試試:

執行成功!

4.1 小結

GithubAction的工作流程和我之前用的Jenkins大體上差不多,但是GithubAction作為第三方服務不用單獨部署使用,而且與Github使用聯絡緊密。
這裡只是簡單演示如何使用GithubAction完成CI/CD的過程。官方提供了很多內建workFlow模板,開發起來相對便捷。
專案原地址:https://github.com/HiFxs/GithubActionDemo