本文主要講解透過github的actions來對我們專案進行ci/cd
System.out.println("原文地址:https://www.cnblogs.com/ancold/p/18327097");
一、actions簡介
GitHub Actions 是一種持續整合和持續交付 (CI/CD) 平臺,可用於自動執行生成、測試和部署管道。 您可以建立工作流程來構建和測試儲存庫的每個拉取請求,或將合併的拉取請求部署到生產環境。
GitHub Actions 不僅僅是 DevOps,還允許您在儲存庫中發生其他事件時執行工作流程。 例如,您可以執行工作流程,以便在有人在您的儲存庫中建立新問題時自動新增相應的標籤。
GitHub 提供 Linux、Windows 和 macOS 虛擬機器來執行工作流程,或者您可以在自己的資料中心或雲基礎架構中託管自己的自託管執行器。
下面是一個簡單的例項和簡介
# 可選 - 工作流的名稱,將顯示在 GitHub 倉庫的 "Actions" 標籤中。如果省略此欄位,將使用工作流檔案的名稱。
name: learn-github-actions
# 可選 - 從工作流生成的工作流執行的名稱,將顯示在您的倉庫的 "Actions" 標籤的工作流執行列表中。此示例使用帶有 `github` 上下文的表示式來顯示觸發工作流執行的使用者的使用者名稱。有關更多資訊,請參閱 "[AUTOTITLE](/actions/using-workflows/workflow-syntax-for-github-actions#run-name)"。
run-name: ${{ github.actor }} is learning GitHub Actions
# 指定觸發此工作流的觸發器。此示例使用 `push` 事件,因此每次有人推送更改到倉庫或合併拉取請求時都會觸發工作流執行。這是由推送到每個分支觸發的;有關僅在推送到特定分支、路徑或標籤時執行的語法示例,請參閱 "[AUTOTITLE](/actions/reference/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpathspaths-ignore)"。
on: [push]
# 將所有在 `learn-github-actions` 工作流中執行的任務分組在一起。
jobs:
# 定義一個名為 `check-bats-version` 的任務。子鍵將定義該任務的屬性。
check-bats-version:
# 配置該任務在最新版本的 Ubuntu Linux 執行器上執行。這意味著該任務將在 GitHub 託管的新虛擬機器上執行。有關使用其他執行器的語法示例,請參閱 "[AUTOTITLE](/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on)"
runs-on: ubuntu-latest
# 將在 `check-bats-version` 任務中執行的所有步驟分組在一起。巢狀在此部分下的每個項都是一個獨立的操作或 shell 指令碼。
steps:
# `uses` 關鍵字指定此步驟將執行 `actions/checkout` 操作的 `v4` 版本。這是一個將您的倉庫檢出到執行器上的操作,允許您針對您的程式碼執行指令碼或其他操作(例如構建和測試工具)。當您的工作流將使用倉庫的程式碼時,您應該使用檢出操作。
- uses: actions/checkout@v4
# 此步驟使用 `actions/setup-node@v4` 操作來安裝指定版本的 Node.js。(此示例使用 20 版本。)這會將 `node` 和 `npm` 命令放入您的 `PATH` 中。
- uses: actions/setup-node@v4
with:
node-version: '20'
# `run` 關鍵字告訴任務在執行器上執行命令。在這種情況下,您正在使用 `npm` 來安裝 `bats` 軟體測試包。
- run: npm install -g bats
# 最後,您將執行帶有輸出軟體版本引數的 `bats` 命令。
- run: bats -v
二、前置動作
- 準備一臺伺服器
- 申請阿里雲映象倉庫服務,申請地址:https://cr.console.aliyun.com/
- 能夠正常訪問github
- 新建一個Java SpringBoot專案推送到github程式碼倉庫中
- 程式碼倉庫中配置對應的secrets and variables,下一步會教大家配置
三、配置secrets and variables
具體配置位置如下圖
我這邊使用的例項用瞭如下的一些secrets
- DOCKER_LOGIN_URL 阿里雲映象倉庫地址
- DOCKER_PASSWORD 阿里雲映象倉庫密碼
- DOCKER_USERNAME 阿里雲映象倉庫賬號
- SERVER_IP 伺服器Ip
- SERVER_USER_NAME 伺服器名稱
- SSH_PASSWORD 伺服器密碼
四、建立workflows
點選Actions--New workflows 它會在專案更目錄預設建立一個資料夾.github\workflows
選擇Docker image
五、編寫Dockerfile
因為主要是用來做一個例項,所以我這邊編寫的Dockerfile就比較簡單,如果大家有自己的需求,勞請自行修改
Dockerfile存放位置為:.github\workflows 同docker-image.yml同級
FROM openjdk:17
WORKDIR /app
COPY spring-boot-build-3.3.2.jar /app/spring-boot-build-3.3.2.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app/spring-boot-build-3.3.2.jar"]
六、編寫釋出流水線配置
name: Docker-Image-CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Check out the code
uses: actions/checkout@v2
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Maven
run: mvn clean package
- name: Move JAR to .github/workflows
run: |
mkdir -p .github/workflows
mv target/*.jar .github/workflows/
- name: Log in to Aliyun Docker Registry
env:
ALIYUN_DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
ALIYUN_DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
ALIYUN_DOCKER_URL: ${{ secrets.DOCKER_LOGIN_URL }}
run: |
echo "${ALIYUN_DOCKER_PASSWORD}" | docker login "${ALIYUN_DOCKER_URL}" --username "${ALIYUN_DOCKER_USERNAME}" --password-stdin
- name: Remove old Docker images
run: |
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'registry.cn-hangzhou.aliyuncs.com/benxiong_default/public' | xargs -I {} docker rmi -f {}
- name: Build Docker image
run: docker build -f .github/workflows/Dockerfile -t springbuild .github/workflows/
- name: Tag Docker image
run: docker tag springbuild 阿里雲映象倉庫tag:latest
- name: Push Docker image to Aliyun registry
run: docker push 阿里雲映象倉庫地址:latest
- name: Set up SSH using username and password
env:
SSH_PASSWORD: ${{ secrets.SSH_PASSWORD }}
SSH_USER: ${{ secrets.SERVER_USER_NAME }}
SERVER_IP: ${{ secrets.SERVER_IP }}
run: |
sudo apt-get update
sudo apt-get install -y sshpass
sshpass -p "${SSH_PASSWORD}" ssh -o StrictHostKeyChecking=no ${SSH_USER}@${SERVER_IP} << 'EOF'
# Stop and remove old container
sudo docker ps -q -f "name=容器名稱" | xargs -r sudo docker stop
sudo docker ps -aq -f "name=容器名稱" | xargs -r sudo docker rm
# Remove old Docker images
sudo docker image prune -a -f
# Remove the specific Docker image
sudo docker rmi -f 映象名稱
# Pull the new Docker image
sudo docker pull 映象名稱
# Run the new container
sudo docker run -d --name 容器名稱--restart unless-stopped -p 9000:9000 映象名稱:latest
EOF
七、結語
透過以上的一套操作下來,我們就可以在提交程式碼main分支後,透過workflows就能自動的去幫助我們執行構建和部署的操作了,非常方便我們開發者,也不需要我們再去部署jenkins,也不需要學習jenkins的pipeline語法了,同時也不得不說一句,github nb!!!
gthub actions官方地址:https://docs.github.com/zh/actions/learn-github-actions/understanding-github-actions
如有哪裡講得不是很明白或是有錯誤,歡迎指正
如您喜歡的話不妨點個贊收藏一下吧🙂