日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
Github Actions 還能做這些事

本文轉載自微信公眾號「crossoverJie」,作者crossoverJie。轉載本文請聯(lián)系crossoverJie公眾號。

呼中ssl適用于網站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

前言

最近公司內部項目的發(fā)布流程接入了 GitHub Actions,整個體驗過程還是比較美好的;本文主要目的是對于沒有還接觸過 GitHub Actions的新手,能夠利用它快速構建自動測試及打包推送 Docker 鏡像等自動化流程。

創(chuàng)建項目

本文主要以 Go 語言為例,當然其他語言也是類似的,與語言本身關系不大。

這里我們首先在 GitHub 上創(chuàng)建一個項目,編寫了幾段簡單的代碼 main.go:

 
 
 
 
  1. var version = "0.0.1" 
  2.  
  3. func GetVersion() string { 
  4.  return version 
  5.  
  6. func main() { 
  7.  fmt.Println(GetVersion()) 

內容非常簡單,只是打印了了版本號;同時配套了一個單元測試 main_test.go:

 
 
 
 
  1. func TestGetVersion1(t *testing.T) { 
  2.  tests := []struct { 
  3.   name string 
  4.   want string 
  5.  }{ 
  6.   {name: "test1", want: "0.0.1"}, 
  7.  } 
  8.  for _, tt := range tests { 
  9.   t.Run(tt.name, func(t *testing.T) { 
  10.    if got := GetVersion(); got != tt.want { 
  11.     t.Errorf("GetVersion() = %v, want %v", got, tt.want) 
  12.    } 
  13.   }) 
  14.  } 

我們可以執(zhí)行 go test 運行該單元測試。

 
 
 
 
  1. $ go test                           
  2. PASS 
  3. ok      github.com/crossoverJie/go-docker       1.729s 

自動測試

當然以上流程完全可以利用 Actions 自動化搞定。

首選我們需要在項目根路徑創(chuàng)建一個 .github/workflows/*.yml 的配置文件,新增如下內容:

 
 
 
 
  1. name: go-docker 
  2. on: push 
  3. jobs: 
  4.   test: 
  5.     runs-on: ubuntu-latest 
  6.     if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags') 
  7.     steps: 
  8.       - uses: actions/checkout@v2 
  9.       - name: Run Unit Tests 
  10.         run: go test 

簡單解釋下:

  • name 不必多說,是為當前工作流創(chuàng)建一個名詞。
  • on 指在什么事件下觸發(fā),這里指代碼發(fā)生 push 時觸發(fā),更多事件定義可以參考官方文檔:

Events that trigger workflows

  • jobs 則是定義任務,這里只有一個名為 test 的任務。

該任務是運行在 ubuntu-latest 的環(huán)境下,只有在 main 分支有推送或是有 tag 推送時運行。

運行時會使用 actions/checkout@v2 這個由他人封裝好的 Action,當然這里使用的是由官方提供的拉取代碼 Action。

  • 基于這個邏輯,我們可以靈活的分享和使用他人的 Action 來簡化流程,這點也是 GitHub Action擴展性非常強的地方。

最后的 run 則是運行自己命令,這里自然就是觸發(fā)單元測試了。

  • 如果是 Java 便可改為 mvn test.

之后一旦我們在 main 分支上推送代碼,或者有其他分支的代碼合并過來時都會自動運行單元測試,非常方便。

與我們本地運行效果一致。

自動發(fā)布

接下來考慮自動打包 Docker 鏡像,同時上傳到 Docker Hub;為此首先創(chuàng)建 Dockerfile :

 
 
 
 
  1. FROM golang:1.15 AS builder 
  2. ARG VERSION=0.0.10 
  3. WORKDIR /go/src/app 
  4. COPY main.go . 
  5. RUN go build -o main -ldflags="-X 'main.version=${VERSION}'" main.go 
  6.  
  7. FROM debian:stable-slim 
  8. COPY --from=builder /go/src/app/main /go/bin/main 
  9. ENV PATH="/go/bin:${PATH}" 
  10. CMD ["main"] 

這里利用 ldflags 可在編譯期間將一些參數(shù)傳遞進打包程序中,比如打包時間、go 版本、git 版本等。

這里只是將 VERSION 傳入了 main.version 變量中,這樣在運行時就便能取到了。

 
 
 
 
  1. docker build -t go-docker:last . 
  2. docker run --rm go-docker:0.0.10 
  3. 0.0.10 

接著繼續(xù)編寫 docker.yml 新增自動打包 Docker 以及推送到 docker hub 中。

 
 
 
 
  1. deploy: 
  2.     runs-on: ubuntu-latest 
  3.     needs: test 
  4.     if: startsWith(github.ref, 'refs/tags') 
  5.     steps: 
  6.       - name: Extract Version 
  7.         id: version_step 
  8.         run: | 
  9.           echo "##[set-output name=version;]VERSION=${GITHUB_REF#$"refs/tags/v"}" 
  10.           echo "##[set-output name=version_tag;]$GITHUB_REPOSITORY:${GITHUB_REF#$"refs/tags/v"}" 
  11.           echo "##[set-output name=latest_tag;]$GITHUB_REPOSITORY:latest" 
  12.  
  13.       - name: Set up QEMU 
  14.         uses: docker/setup-qemu-action@v1 
  15.  
  16.       - name: Set up Docker Buildx 
  17.         uses: docker/setup-buildx-action@v1 
  18.  
  19.       - name: Login to DockerHub 
  20.         uses: docker/login-action@v1 
  21.         with: 
  22.           username: ${{ secrets.DOCKER_USER_NAME }} 
  23.           password: ${{ secrets.DOCKER_ACCESS_TOKEN }} 
  24.  
  25.       - name: PrepareReg Names 
  26.         id: read-docker-image-identifiers 
  27.         run: | 
  28.           echo VERSION_TAG=$(echo ${{ steps.version_step.outputs.version_tag }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV 
  29.           echo LASTEST_TAG=$(echo ${{ steps.version_step.outputs.latest_tag  }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV 
  30.  
  31.       - name: Build and push Docker images 
  32.         id: docker_build 
  33.         uses: docker/build-push-action@v2.3.0 
  34.         with: 
  35.           push: true 
  36.           tags: | 
  37.             ${{env.VERSION_TAG}} 
  38.             ${{env.LASTEST_TAG}} 
  39.           build-args: | 
  40.             ${{steps.version_step.outputs.version}} 

新增了一個 deploy 的 job。

 
 
 
 
  1. needs: test 
  2.  if: startsWith(github.ref, 'refs/tags') 

運行的條件是上一步的單測流程跑通,同時有新的 tag 生成時才會觸發(fā)后續(xù)的 steps。

name: Login to DockerHub

在這一步中我們需要登錄到 DockerHub,所以首先需要在 GitHub 項目中配置 hub 的 user_name 以及 access_token.

配置好后便能在 action 中使用該變量了。

這里使用的是由 docker 官方提供的登錄 action(docker/login-action)。

有一點要非常注意,我們需要將鏡像名稱改為小寫,不然會上傳失敗,比如我的名稱中 J 字母是大寫的,直接上傳時就會報錯。

所以在上傳之前先要執(zhí)行該步驟轉換為小寫。

最后再用這兩個變量上傳到 Docker Hub。

今后只要我們打上 tag 時,Action 就會自動執(zhí)行單測、構建、上傳的流程。

總結

GitHub Actions 非常靈活,你所需要的大部分功能都能在 marketplace找到現(xiàn)成的直接使用,

比如可以利用 ssh 登錄自己的服務器,執(zhí)行一些命令或腳本,這樣想象空間就很大了。

使用起來就像是搭積木一樣,可以很靈活的完成自己的需求。


網站欄目:Github Actions 還能做這些事
URL分享:http://www.dlmjj.cn/article/codgche.html