Tekton CI 之實戰篇(一):從Github到Harbor倉庫

Tekton CI 之實戰篇(一):從Github到Harbor倉庫

背景

本文將介紹如何從github上的一個golang工程製作鏡像並推送到企業級鏡像倉庫Harbor的示例。從github拉取代碼,是爲了方便大家自己動手操作,完成示例。

前提條件

  • k8s集羣
  • 安裝好tekton的pipeline組件(之前的文章中有介紹怎麼安裝,如有問題,評論區留言)
  • 有harbor倉庫,(公衆號內有harbor的部署教程)

大致流程

1、編寫整個CI過程中需要用到的yaml文件,整個CI過程包括:拉取代碼,編譯,構建鏡像和推送鏡像
2、運行實例,查看結果

開始

製作流水線

定義pipelineResource

resource.yaml

apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
  name: golang-resource  # resource的名字
  namespace: nanjun
spec:
  type: git
  params:
  - name: revision
    value: dev  #我要拉取倉庫哪個分支的代碼
  - name: url
    value: https://github.com/fishingfly/golang-test  #這是我Github的golang代碼倉庫,運行的gin框架代碼
---
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
  name: harbor-image
  namespace: nanjun
spec:
  type: image
  params:
    - name: url
      value: registry.nanjun/test/golang-test:gin #構建完的鏡像名稱和tag

定義認證

拉取代碼,編譯,構建鏡像和推送鏡像等操作都是順序進行的,使用task就可以滿足我們的需求的,每個操作定義爲一個step。
當你要推送鏡像到harbor時,必須先登錄,需要把用戶名和密碼保存在/home/.docker/config中,tekton中使用secret+serviceAccount實現。如下:
secret.yaml:

apiVersion: v1
kind: Secret
metadata:
  name: harbor-user
  namespace: nanjun
  annotations:
    tekton.dev/docker-0: http://registry.nanjun
type: kubernetes.io/basic-auth
stringData:
  username: admin #harbor的用戶名
  password: zhounanjun #harbor的密碼

serviceAccount.yaml:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: sa
  namespace: nanjun
secrets:
  - name: harbor-user

定義task

task.yaml:

apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
  name: build-and-push
  namespace: nanjun
spec:
  inputs:
    resources:
      - name: golang-resource #輸入資源,就是github的那個倉庫
        type: git
    params:
      - name: dockerfile-path #指明dockerfile在倉庫中的哪個位置
        type: string
        default: $(inputs.resources.golang-resource.path)/
        description: dockerfile path
  outputs:
    resources:
      - name: builtImage #輸出鏡像名字
        type: image
  steps:
    - name: build-with-golangenv #編譯,用戶可以自己寫腳本編譯自己的工程
      image: golang
      script: |
        #!/usr/bin/env sh
        cd $(inputs.resources.golang-resource.path)/
        export GO111MODULE=on #使用go module包管理器
        export GOPROXY=https://goproxy.io # 代理地址
        go mod download
        go build -o main . #編譯
    - name: image-build-and-push #構建鏡像並推送到harbor
      image: docker:stable #使用dood的方式
      script: |
        #!/usr/bin/env sh
        docker login registry.nanjun
        docker build --rm --label buildNumber=1 -t $(outputs.resources.builtImage.url) $(inputs.params.dockerfile-path)
        docker push  $(outputs.resources.builtImage.url)  #這邊的參數都是在input和output中定義的
      volumeMounts:
      - name: docker-sock #將docker.sock文件掛載進來,使用宿主機docker daemon 構建鏡像
        mountPath: /var/run/docker.sock
      - name: hosts # registry.nanjun的解析在外部宿主機的hosts文件中,這邊也要掛載進來
        mountPath: /etc/hosts
  volumes:
    - name: docker-sock
      hostPath:
        path: /var/run/docker.sock
    - name: hosts
      hostPath:
        path: /etc/hosts

定義taskrun

taskrun.yaml:

apiVersion: tekton.dev/v1alpha1
kind: TaskRun
metadata:
  name: build-and-push-from-github
  namespace: nanjun
spec:
  inputs:
    resources:
      - name: golang-resource
        resourceRef:
          name: golang-resource
  outputs:
    resources:
      - name: builtImage
        resourceRef:
          name: harbor-image
  taskRef:
    name: build-and-push #使用定義好的task
  serviceAccountName: sa

然後你運行

kubectl apply -f .

就能跑起來啦。
從tekton的dashboard上可以看到如下:
在這裏插入圖片描述

總結

上面是從github公共倉庫上拉代碼,編譯,構建鏡像,最後推送到harbor倉庫,是個典型的CI流程。除了拉取公共代碼,這邊還提供了拉取私有倉庫構建鏡像的方式,都放在我的github上了地址:https://github.com/fishingfly/github-ci。
大家可以直接去下載使用。
這只是個簡單的CI流程,後面將繼續推出CD部分,之後將首發微信公衆號“雲原生手記”,盡請關注哦
要是能打賞下,我會更有動力哦!哈哈!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章