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部分,之后将首发微信公众号“云原生手记”,尽请关注哦
要是能打赏下,我会更有动力哦!哈哈!