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部分,之後將首發微信公衆號“雲原生手記”,盡請關注哦
要是能打賞下,我會更有動力哦!哈哈!