使用 KCL 编程语言构建你的 GitOps 流程 - CI 篇 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
peefy

使用 KCL 编程语言构建你的 GitOps 流程 - CI 篇

  •  
  •   peefy Jul 13, 2023 1552 views
    This topic created in 1021 days ago, the information mentioned may be changed or developed.

    简介

    在本文中,我们将提供 KCL 和 CI 集成的示例方案,希望通过使用容器、用于生成的持续集成 (CI) 和用于持续部署 (CD) 的 GitOps 来实现端到端应用程序开发流程。在此方案中,我们使用一个 Flask 应用和 Github Actions 将用作示例。

    注意:你可以在此方案中使用任何容器化应用以及不同的 CI 系统如 Gitlab CI ,Jenkins CI 等。

    整体工作流程如下:

    • 应用代码开发并提交到提交到 GitHub 存储库
    • GitHub Actions 从应用代码生成容器镜像,并将容器镜像推送到 docker.io 容器注册表
    • GitHub Actions 根据 docker.io 容器注册表中容器镜像的版本号并同步更新 KCL 清单部署文件

    KCL 是什么?

    KCL 是一个开源的基于约束的记录及函数语言。KCL 通过成熟的编程语言技术和实践来改进对大量繁杂配置比如云原生 Kubernetes 配置场景的编写,致力于构建围绕配置的更好的模块化、扩展性和稳定性,更简单的逻辑编写,以及更简单的自动化和生态工具集成。

    具体步骤

    1. 获得示例

    我们将业务源码和部署清单放在不同仓库,可以分不同角色进行分别维护,实现关注点分离。

    • 获得业务源码
    git clone https://github.com/kcl-lang/flask-demo.io.git/ cd flask-demo 

    这是一个使用 Python 编写的 Web 应用,我们可以使用应用目录的Dockerfile来生成这个应用的容器镜像,同时可以通过 Github CI 自动构建flask_demo镜像,CI 配置如下

    # This is a basic workflow to help you get started with Actions name: CI # Controls when the workflow will run on: # Triggers the workflow on push or pull request events but only for the main branch push: branches: [ main ] pull_request: branches: [ main ] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "build" build: # The type of runner that the job will run on runs-on: ubuntu-latest # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v2 - name: Docker Login uses: docker/[email protected] with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} logout: true # Runs a set of commands using the runners shell - name: build image run: | make image docker tag flask_demo:latest ${{ secrets.DOCKER_USERNAME }}/flask_demo:${{ github.sha }} docker push ${{ secrets.DOCKER_USERNAME }}/flask_demo:${{ github.sha }} # Trigger KCL manifest - name: Trigger CI uses: InformaticsMatters/[email protected] with: ci-owner: kcl-lang ci-repository: flask-demo-kcl-manifests ci-ref: refs/heads/main ci-user: kcl-bot ci-user-token: ${{ secrets.DEPLOY_ACCESS_TOKEN }} ci-name: CI ci-inputs: >- image=${{ secrets.DOCKER_USERNAME }}/flask_demo sha-tag=${{ github.sha }} 

    我们需要源码仓库的工作流自动触发部署清单仓库中的工作流,此时需要创建具有 Github CI 操作权限的secrets.DEPLOY_ACCESS_TOKEN以及 Docker Hub 镜像推送的账号信息secrets.DOCKER_USERNAMEsecrets.DOCKER_PASSWORD, 这些可以在 Github 仓库的Secrets and variables设置中进行配置,如下图所示

    2. 提交应用代码

    flask-demo 仓库提交代码后,Github 会自动构建容器镜像,并将制品推送到 Docker hub 中,会再触发 flask-demo-kcl-manifests 仓库的 Action ,通过 KCL 自动化 API修改部署清单仓库中的镜像地址。现在让我们为 flask-demo 仓库创建一个提交,我们可以看到代码提交后触发业务仓库 Github CI 流程

    image.png

    3. 配置自动更新

    当业务仓库 Github CI 流程执行完成后,会自动在存放 KCL 资源配置的仓库触发一个 CI 自动更新配置并提交到 flask-demo-kcl-manifests main 分支,commit 信息如下

    • 我们可以获得部署清单源码进行编译验证
    git clone https://github.com/kcl-lang/flask-demo-kcl-manifests.git/ cd flask-demo-kcl-manifests git checkout main && git pull && kcl 

    输出 YAML 为

    apiVersion: apps/v1 kind: Deployment metadata: name: flask_demo labels: app: flask_demo spec: replicas: 1 selector: matchLabels: app: flask_demo template: metadata: labels: app: flask_demo spec: containers: - name: flask_demo image: "kcllang/flask_demo:6428cff4309afc8c1c40ad180bb9cfd82546be3e" ports: - protocol: TCP containerPort: 5000 --- apiVersion: v1 kind: Service metadata: name: flask_demo labels: app: flask_demo spec: type: NodePort selector: app: flask_demo ports: - port: 5000 protocol: TCP targetPort: 5000 

    从上述配置可以看出资源的镜像确实自动更新为了新构建的镜像内容。此外,我们还可以使用 Argo CD KCL 插件 自动从 Git 存储库同步或从中拉取数据并将应用部署到 Kubernetes 集群。

    小结

    通过将 KCL 和 Github CI 集成,我们能够将任意的业务代码的产出容器化镜像进行自动化修改并部署配置,以实现端到端应用程序开发流程并提升研发部署效率。

    No Comments Yet
    About     Help     Advertise     Blog     API     FAQ     Solana     1189 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 17:45 PVG 01:45 LAX 10:45 JFK 13:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86