Pipelines as Code 体验

pipelines-as-code.png

📜 目录

  • 😮 Pipelines as Code 是什么?
  • 🏗️ 准备环境
  • 🚀 快速安装
  • ⚡ 能力体验
  • 🤔 一些疑问
  • 🥰 参考

😮 Pipelines as Code 是什么?

是一套基于 OpenShift Pipeline/Tekton 自用的 CI 工具,可以帮助你快速构建部署你的代码

它使用位于源代码控制管理 (SCM) 系统(例如 GitHub )的文件中的 Tekton PipelineRuns 和任务来定义 CI/CD,通过将 Pipeline 定义存储在代码仓库中,可以更轻松地通过代码更改对管道更改进行版本控制、审查和协作

它不是一个构建引擎,本身不负责构建工作,只是负责构建的定义和一些资源状态的同步,他会将构建工作全部委托给 Tekton 来做,自己做了一些外围的工作,比如定义了代码仓库地址,在什么条件下可以触发构建,谁会有权限来触发这些构建等等

🏗️ 准备环境

Getting started with Pipelines-as-Code 中详细的描述另外如何安装 Pipelines as Code,这里描述下我的安装过程,给大家一个大致的地图

正如前面提到,Pipelines as Code 会将构建工作交给 Tekton 来做,所以需要安装 Tekton Pipeline 保证构建引擎可用

另外安装 Pipelines as Code 相关的组件,安装可以通过直接 apply yaml 文件到集群,也可以通过一个命令行工具来完成,这个工具可以帮你完成 Pipelines as Code 的安装和一些使用的初始化工作,我使用的就是命令行工具

当然这一切都需要先有一个 k8s 集群

k8s 集群

我使用的是 macOs,k8s 我使用的工具是 OrbStack,他可以提供 Docker 和 k8s 环境,整体使用感觉好,能耗和启动速度方面都很好,推荐大家使用

orbStask.png

Tekton Pipeline

我本地有 tektoncd/pipeline 源码用于开发,可以通过源码直接进行构建部署,通过 ko apply --local -R -f config/ 就可以将 Tekton Pipeline 所需的组件部署起来(简便的部署方式,对吸引社区贡献者作用很大)

如果没有相关开发环境,也可以通过在集群 apply pipeline-release.yaml 进行安装,这会将相关的 Namespace Deployment 等资源安装好

命令行工具

Pipelines as Code 提供了一个命令行工具,这个工具是作为 tkn 的一个插件存在的,tkn 是 Tekton 提供的一个命令行工具,通过如下命令安装这两个命令行工具

brew install tektoncd-cli

brew install openshift-pipelines/pipelines-as-code/tektoncd-pac

执行完成后,执行如下命令行,能显示版本号说明安装正常

{21:44}/ ➭ tkn pac version
0.27.1

🚀 快速开始

在这里,我们会安装 Pipelines as Code 组件,配置 gosmee 以便本地接收 Github 的 webhook 事件信息,创建 Github Application 来同步流水线执行状态和结果到 Github,并且创建一个 Github 代码仓库来检验我们 CI 流水线能否生效

上面步骤中安装的 tkn pac 提供了很多功能,可以让我们的操作简便快捷,基于这一个命令行工具,我们就可以完成安装工作,提供的参数大致如下

{21:44}/ ➭ tkn pac
tkn plugin to use Pipelines as Code as a CLI

Usage:
  tkn-pac [command]

Available Commands:
  bootstrap   Bootstrap Pipelines as Code.
  completion  Prints shell completion scripts
  create      Create Pipelines as Code resources
  delete      Delete Pipelines as Code resources
  describe    Describe a repository
  generate    Generate PipelineRun
  help        Help about any command
  info        Show installation information
  list        List Pipelines as Code Repository
  logs        Display the PipelineRun logs from a Repository
  resolve     Resolve PipelineRun the same way its run on CI
  version     Print tkn pac version
  webhook     Update webhook secret

Flags:
  -h, --help                help for tkn-pac
  -k, --kubeconfig string   Path to the kubeconfig file to use for CLI requests (default: /Users/sda/.kube/config) (default "/Users/sda/.kube/config")
  -n, --namespace string    If present, the namespace scope for this CLI request

Use "tkn-pac [command] --help" for more information about a command.

tkn pac bootstrap 可以帮助我们快速安装 Pipelines as Code 以及设置 Github Application

安装 Pipelines as Code 组件

执行 tkn pac bootstrap 安装 Pipelines as Code,此时会先检查是否已经安装了该工具,如果没有安装,则会询问是否安装,我们在这里选择安装

{21:49}/ ➭ tkn pac bootstrap
=> Checking if Pipelines-as-Code is installed.
🕵️ Pipelines-as-Code doesn't seem to be installed in the pipelines-as-code namespace.
? Do you want me to install Pipelines-as-Code v0.19.2? (Y/n)

安装 gosmee

继续安装时,会询问你是否要安装 gosmee,这是一个 webhook 转发器,可以实现将 Github 上的 webhook 事件信息转发到我们的本地环境,这很重要,我们需要选择安装

gosmee.png

需要注意的是,这里会生成一个 gosmee forward URL,我们需要保留一下,后续设置 Github Application 的时候会到,比如这里生成的 https://hook.pipelinesascode.com/zZVuUUOkCzPD,官方文档没有提到这一步,导致我在这里就踩了坑,导致排查了很久 😭

Pipelines-as-Code does not install an Ingress object to allow the controller to be accessed from the internet.
We can install a webhook forwarder called gosmee (https://github.com/chmouel/gosmee) using a https://hook.pipelinesascode.com URL.
This will let your git platform provider (e.g., GitHub) reach the controller without requiring public access.
? Do you want me to install the gosmee forwarder? (Y/n)
💡 Your gosmee forward URL has been generated: https://hook.pipelinesascode.com/zZVuUUOkCzPD

指定 Tekton Dashboard

前面提到过,Pipelines as Code 主要是将工作委托给了 Tekton 来完成,Tekton 有自己的 UI 界面的组件 Tekton Dashboard,他会在界面上展示 PipelineRun TaskRun 的执行状态及相关的日志

这里指定 Tekton Dashboard 地址的步骤,就是为了支持在查看某个构建状态和详细日志的场景下,跳转到相关界面查看相关信息

因为我没有安装,因此跳过了这个步骤,这里是官方文档提供的 demo,它会先自动检测是否存在对应的地址,如果存在直接使用,用户也可以自行指定地址

👀 We have detected a tekton dashboard install on http://dashboard.paac-127-0-0-1.nip.io
? Do you want me to use it? Yes

创建 Github Application

随后会让你创建一个 Github Applicaiton,这里我们需要为它指定一个名称,名称没有什么要求,只要不与已经存在的 Application 冲突即可

? Enter the name of your GitHub application: My PAAC Application

你会被导向一个链接,通过链接可以创建 Github Application


github-application.png
🔑 Secret pipelines-as-code-secret has been created in the pipelines-as-code namespace
🚀 You can now add your newly created application to your repository by going to this URL:

https://github.com/apps/my-paac-application

💡 Don't forget to run "tkn pac create repository" to create a new Repository CR on your cluster.

此时安装过程就结束了,但是还是需要对刚才创建的 Github Application 做一些改动,保证后续工作顺利

我们需要修改下 Application 的 Webhook URL 保证仓库事件信息可以发送到 gosmee 地址中,访问 https://github.com/settings/apps/my-paac-application 找到设置,将 Webhook URL 修改成上面提到的需要保留的地址

application-webhook.png

⚡ 能力体验

这一步骤中,我们会创建一个 Github 仓库用于体验 Pipelines as Code 提供的强大能力

点击 https://github.com/openshift-pipelines/pac-demo/generate 跳转到 Github 创建一个 demo 仓库,这是一个 Golang 的代码仓库,里面有一些用于演示的简单的代码

访问 Github Application https://github.com/apps/my-paac-application 并安装到刚才创建的 demo 仓库

install-application.png

clone 刚才创建的 demo 仓库到本地,并且进入到相关目录

git clone https://github.com/$yourusername/pac-demo
cd pac-demo

执行如下命令为代码仓库创建 CI 配置

tkn pac create repository

? Enter the Git repository url (default: https://github.com/chmouel/pac-demo):
? Please enter the namespace where the pipeline should run (default: pac-demo-pipelines):
! Namespace pac-demo-pipelines is not found
? Would you like me to create the namespace pac-demo-pipelines? (Y/n)
ℹ Directory .tekton has been created.
✓ We have detected your repository using the programming language Go.
✓ A basic template has been created in /tmp/pac-demo/.tekton/pipelinerun.yaml, feel free to customize it.
ℹ You can test your pipeline by pushing the generated template to your git repository

此时会在集群中创建一个 repository 资源,并且在代码仓库根目录创建一个 .tekton 的目录,我们重点关注下这个自动创建的文件夹

在该文件夹中会存在一个 pipelinerun.yaml 文件,这个文件定义了一个 CI 流程,里面包含了 clonegolang-ci-lint 两个步骤,看下文件内容了解一下

apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  name: pac-demo
  annotations:
    # The event we are targeting as seen from the webhook payload
    # this can be an array too, i.e: [pull_request, push]
    pipelinesascode.tekton.dev/on-event: "[pull_request, push]"

    # The branch or tag we are targeting (ie: main, refs/tags/*)
    pipelinesascode.tekton.dev/on-target-branch: "[main]"

    # Fetch the git-clone task from hub, we are able to reference later on it
    # with taskRef and it will automatically be embedded into our pipeline.
    pipelinesascode.tekton.dev/task: "git-clone"

    # Use golangci-lint from the hub to test our Golang project
    pipelinesascode.tekton.dev/task-1: "golangci-lint"

    # You can add more tasks by increasing the suffix number, you can specify
    # them as array to have multiple of them.
    # browse the tasks you want to include from hub on https://hub.tekton.dev/
    #
    # pipelinesascode.tekton.dev/task-2: "[curl, buildah]"

    # how many runs we want to keep attached to this event
    pipelinesascode.tekton.dev/max-keep-runs: "5"
spec:
  params:
    # The variable with brackets are special to Pipelines as Code
    # They will automatically be expanded with the events from Github.
    - name: repo_url
      value: "{{ repo_url }}"
    - name: revision
      value: "{{ revision }}"
  pipelineSpec:
    params:
      - name: repo_url
      - name: revision
    workspaces:
      - name: source
      - name: basic-auth
    tasks:
      - name: fetch-repository
        taskRef:
          name: git-clone
        workspaces:
          - name: output
            workspace: source
          - name: basic-auth
            workspace: basic-auth
        params:
          - name: url
            value: $(params.repo_url)
          - name: revision
            value: $(params.revision)
      - name: golangci-lint
        taskRef:
          name: golangci-lint
        runAfter:
          - fetch-repository
        params:
          - name: package
            value: .
        workspaces:
          - name: source
            workspace: source

  workspaces:
    - name: source
      volumeClaimTemplate:
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 1Gi
    # This workspace will inject secret to help the git-clone task to be able to
    # checkout the private repositories
    - name: basic-auth
      secret:
        secretName: "{{ git_auth_secret }}"

这个就是一个标准的 Tekton PipelineRun 资源的定义,不同的是 annotations 中有很多 Pipelines as Code 自定义的值,用来指示不同场景下的配置

可以看到,spec.pipelineSpec 中接受 repo_urlrevision 这两个参数来进行代码克隆,并且这里包含 clone 和 golangci-lint 两个步骤

此时我们提交代码到代码仓库,并且发起从当前分支到 main 分支的 PR,在 PR 的界面,应该可以看到该 PR 的 checks 会处于执行状态

checks.png

点击 Details 详情可以看到 checks 相关详情信息,通过这里我们可以看到,这个 PR 的 checks 没有通过,原因是 golangci-lint 的一些校验没有通过

details.png

代码里存在一些不合规范的内容

check-failure.png

我们可以修改 main.go 代码以更正 checks 中提到的问题,再次提交代码

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Fprintf(os.Stdout, "Hello world")
}

再去查看 PR 时会发现,PR 的 checks 已经成功通过了

check-succeed.png

这些就是 Pipeline as Code 的能力体验,虽然只是一个简单的 Demo,但是他也满足你在 Github 上做开发时 CI 的基本需求,在代码变动时进行代码构建,并且将流水线结果同步到 Github 上

🤔 一些疑问

这一切都很神奇,也许你想问,这些 check 是在哪里做的呢,是在我本地吗?如果是的话,本地是如何接收到需要构建的消息又是怎么将结果同步到 Github 上的呢

对于第一个问题,你可以执行 tkn pac logs -n pac-demo-pipelines -L 来查看 pac-demo-pipelines 命名空间最新执行的 pipelinerun,这个对应的就是 Github 上的那个检查步骤,克隆代码,随后执行 golangci-lint 校验代码中存在的问题

第二个问题就是上面提到的 gosmee,它将 Github webhook 的事件信息转发到了本地

第三个问题是通过我们注册的 Github Application 完成的构建信息的同步,pipelines-as-code-controller 会将 pipelineRun 的执行状态和结果通过 Github Application 同步到 Github 代码仓库中

🥰 参考

Pipelines-as-Code
Getting started with Pipelines-as-Code
Github Pipelines as Code
gosmee

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容