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

猜你喜欢

转载自blog.csdn.net/u013276277/article/details/106890007
ci