GitHub Actions 是一種持續整合和持續交付(CI/CD) 平臺,可用於自動執行生成、測試和部署管道。 您可以建立工作流程來構建和測試儲存庫的每個拉取請求,或將合併的拉取請求部署到生產環境。 GitHub Actions 不僅僅是DevOps,還允許您在儲存庫中發生其他事件時執行工作流程。
這裡以一個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了。
當然首先應該把該專案上傳至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檔案
我們push一下本地專案到Github,便會觸發workFlow的工作條件。在Action介面能看到詳細的構建過程:
可以看到每一步都是按照我們的指令碼檔案按序在執行。
執行完畢後jar包會上傳至伺服器:
由於我們指令碼中寫了啟動命令,就不用再在伺服器裡java -jar執行了。現在我們存取專案試試:
執行成功!
GithubAction的工作流程和我之前用的Jenkins大體上差不多,但是GithubAction作為第三方服務不用單獨部署使用,而且與Github使用聯絡緊密。
這裡只是簡單演示如何使用GithubAction完成CI/CD的過程。官方提供了很多內建workFlow模板,開發起來相對便捷。
專案原地址:https://github.com/HiFxs/GithubActionDemo