前言
GitHub Actions 是 GitHub 推出的功能,可以為我們的專案構建自動化工作流。例如程式碼檢查,自動化打包,測試,釋出版本等等。入口在專案 Pull Requests 旁邊。
本篇文章主要是趟一遍其中的小坑,讓大家在第一次使用的時候能比較順利的跑通。其中主要用到了 GitHub,Docker,SpringBoot,Nginx 等技術。對這些技術還不是很瞭解的夥伴,可以先自行查閱一下資料哈。?
實踐步驟
建立 SpringBoot 工程
使用 IDEA 建立一個 SpringBoot 工程,SpringBoot 從 2.3.0.M1 版本開始用 Gradle 構建。所以我們這裡也選 Gradle 作為構建工具 ?。
We made a fairly significant change to Spring Boot in 2.3.0.M1. It was the first release of the project to be built with Gradle rather than Maven.
? 詳情可參考 Migrating Spring Boot’s Build to Gradle
在 SpringBoot 工程中,我們編寫一個簡單的控制器用於測試,程式碼十分簡單,這裡也給出示例。
@RestController
public class DemoController {
@GetMapping("/")
public String sayHello() {
return "Hello GitHub Actions!";
}
}
編寫 Dockerfile 檔案
在 SpringBoot 工程中建立 Dockerfile 檔案,用於映象打包 ?。
# FROM 指定基礎映象
FROM openjdk:8-jdk-alpine
# ARG 構建引數
ARG JAR_FILE=build/libs/*.jar
# COPY 複製檔案
COPY ${JAR_FILE} app.jar
# 暴露埠
EXPOSE 8080
# CMD 容器啟動命令
CMD java -jar /app.jar
還不瞭解 Dockerfile 的小夥伴可前往 使用 Dockerfile 定製映象 瞭解一下基礎知識。
建立 Docker Registry
這一步小夥伴們可以自由選擇阿里雲或者騰訊雲等雲服務商開通相應服務,之後我們打包好的映象要上傳到我們自己私有的 Docker Registry 中。這一步很重要大家一定要開通好再進行下面的步驟哈。
開通好服務之後,可稍微閱讀一下服務商的文件,對該服務有個大概的基本認識即可。
本篇文章中使用的雲服務商是阿里雲,大家可點選這裡進行開通與配置。
上傳程式碼
將我們的 SpringBoot 工程上傳到 GitHub Repository 中,關於怎麼建立 GitHub Repository,相信各位小夥伴都產生肌肉記憶了吧 ?!
git init
git add .
git commit -m "first commit"
git remote add origin {{ your origin url }}
git push -u origin master
進入 SpringBoot 工程目錄,輸入上面這幾條命令,就可以輕鬆將程式碼上傳至你的 GitHub Repository。
配置 GitHub Actions
我們點選 Actions 選項卡,選擇 Java with Gradle 模版作為基礎模版進行配置。
# GitHub Actions 的名稱
name: GitHub Actions SpringBoot Demo
# 當 master 分支發生 push 或者 pull request 事件時觸發 action
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
# 指定 jobs
jobs:
# build job
build:
# 指定執行在 ubuntu 上
runs-on: ubuntu-latest
steps:
# 把倉庫程式碼拉到 ubuntu 映象上
- uses: actions/checkout@v2
# 指定 java 版本
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
# 給 gradle 賦予可執行許可權
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# 通過 gradle 打包我們的專案
- name: Build with gradle
run: ./gradlew build
# 通過 Dockerfile 構建映象
- name: Build docker image
run: docker build . -t {{ image_name:image_version }}
# 登陸到我們自己的 docker registry
- name: Login to aliyun docker image registry
run: echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login --username=xxxxxx registry.cn-shenzhen.aliyuncs.com --password-stdin
# 上傳 docker 映象
- name: Push image to aliyun docker image registry
run: docker push {{ image_name:image_version }}
配置檔案中的 ${{ secrets.XXX }}
變數,是 GitHub 為了保護我們的金鑰所提供的功能。可以在倉庫的 Settings 下的 Secrets 中定義變數,然後按照 ${{ secrets.XXX }}
的格式,就可以拿到變數值。
到這兒,我們就完成了 GitHub Actions 的配置檔案編寫。小夥伴們需要注意一下 yaml 檔案的格式,不要出現格式錯誤。
觸發 GitHub Actions
完成配置檔案的編寫之後,我們點選 start commit 進行提交,提交成功後會自動觸發 Actions 功能進行構建。
點選 Actions 選項卡,找到被觸發的 Actions,等待片刻即可看見構建結果。如果構建中途出現了錯誤,也可直接在這裡看見原因並前往配置檔案排查。
構建完成之後,我們可以進入相應的雲服務商後臺檢視一下我們上傳的 Docker 映象,再次確認是否構建成功!
部署到伺服器
小夥伴們確認一下自己的伺服器是否已經安裝 Nginx,Docker。如果還沒有安裝,可以先查閱相關資料進行安裝。安裝成功之後,再進行下列步驟。
這裡我們要準備一份簡單的伺服器部署 bash 指令碼,完成對舊容器的關閉刪除,對新映象的拉取並且構建新容器操作。這裡有一份簡單的例子可以參考。
# 拉取新映象
docker pull {{ your image_name:image_version }}
# 停止舊容器
docker stop {{ your container name }}
# 刪除停止的容器
docker container prune -f
# 構建新容器
docker run \
-p 8080:8080 \
-v /data:/data \
--name {{ your container name }} \
-d {{ your image_name:image_version }}
我們需要對上面編寫好的 GitHub Actions 配置檔案增加一些內容,主要作用是推送完 Docker 映象之後,觸發遠端伺服器拉取映象重新構建,並用新的映象啟動容器。完整的 GitHub Actions 配置檔案如下所示。
# GitHub Actions 的名稱
name: GitHub Actions SpringBoot Demo
# 當 master 分支發生 push 或者 pull request 事件時觸發 action
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
# 指定 jobs
jobs:
# build job
build:
# 指定執行在 ubuntu 上
runs-on: ubuntu-latest
steps:
# 把倉庫程式碼拉到 ubuntu 映象上
- uses: actions/checkout@v2
# 指定 java 版本
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
# 給 gradle 賦予可執行許可權
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# 通過 gradle 打包我們的專案
- name: Build with gradle
run: ./gradlew build
# 通過 Dockerfile 構建映象
- name: Build docker image
run: docker build . -t {{ image_name:image_version }}
# 登陸到我們自己的 docker registry
- name: Login to aliyun docker image registry
run: echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login --username=xxxxxx registry.cn-shenzhen.aliyuncs.com --password-stdin
# 上傳 docker 映象
- name: Push image to aliyun docker image registry
run: docker push {{ image_name:image_version }}
# 連線到遠端伺服器
- name: Connect to server
uses: webfactory/ssh-agent@v0.4.1
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
# 初始化 knownhosts
- name: Setup knownhosts
run: ssh-keyscan {{ your host }} >> ~/.ssh/known_hosts
# 觸發伺服器部署指令碼
- name: Trigger server deployment script
run: ssh root@{{ your host }} "sh {{ your deployment bash script }}"
關於 Nginx 方面,相信各位小夥伴應該是十分熟悉了,這裡就不過多贅述。直接貼上一份簡單的配置檔案。
server {
listen 80;
server_name {{ your domain }};
location / {
proxy_pass http://localhost:8080/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}
測試 GitHub Actions
完成了上面這些步驟,我們到 SpringBoot 工程裡修改一下程式碼並提交到 GitHub Repository。稍等一會兒再訪問專案,檢視一下效果!
@RestController
public class DemoController {
@GetMapping("/")
public String sayHello() {
return "Hello GitHub Actions!Hello World!";
}
}
到這裡我們就成功完成了一個基礎的 GitHub Actions 實踐,以後小夥伴們修改完程式碼,Push 或者 PR 到 master 分支,GitHub Actions 就會自動完成我們設定好的構建步驟。非常的方便快捷!???
總結
這份基礎的 GitHub Actions SpringBoot 實踐僅供大家參考,如果遇到什麼坑,也歡迎在評論區與我討論。文章寫的不好,請大家多多諒解 ?。