OpenShift Dev Spaces 2 - Devfile 和 Devfile Registry

OpenShift / RHEL / DevSecOps 汇总目录
本系列在 OpenShift 4.17 + Dev Spaces 3.17.0 验证

Devfile

什么是 Devfile

Devfile 是由 Red Hat、AWS、JetBrains 和 GitLab 联合贡献的一个开源项目,目前已是 CNCF 的沙盒项目。

Devfile 是基于 YAML 的配置文件,用于定义和描述特定开发环境所需的组件、工具和设置。它能让开发人员以标准格式描述他们的环境,它可在任何支持 Devfile 规范的 CDE 平台上进行共享和复制,以确保整个团队拥有相同的用户体验以及构建、运行和部署行为。

在 Devfile 文件中可包括以下常用部分:

  • projects:开发环境中需要克隆或初始化的 Git Repo。
  • components:定义 Workspace 所需的容器或插件(如数据库和运行时)。
  • commands:定义可在 Workspace 中执行的任务或操作,如 “build”、“run ”和 “test”。
  • events:允许在特定阶段自动执行任务,例如在启动容器之前或停止容器之后。

以下是一个 Devfile 的示例:

schemaVersion: 2.2.0

metadata:
  name: nodejs-sample-app
  version: 1.0.0
  description: Devfile for a sample Node.js application
  icon: https://raw.githubusercontent.com/devfile-samples/devfile-stack-icons/main/node-js.svg
  tags:
    - Node.js
    - Express
    - ubi8

projects:
  - name: nodejs-app
    source:
      type: git
      location: "https://github.com/some-repository/nodejs-app.git"
      branch: main

components:
  - name: nodejs
    container:
      image: quay.io/devfile/universal-developer-image:ubi8-latest
      memoryLimit: 512Mi
      mountSources: true
      command: ["npm"]
      args: ["start"]
      volumeMounts:
        - name: node-modules
          path: "/projects/node_modules"
      endpoints:
        - name: "app"
          targetPort: 3000
          exposure: public
          protocol: http

  - name: postgres-db
    container:
      image: "postgres:13"
      memoryLimit: 512Mi
      endpoints:
        - name: postgres
          exposure: internal
          targetPort: 5432
          attributes:
            discoverable: 'true'
      env:
        - name: POSTGRES_USER
          value: user
        - name: POSTGRES_PASSWORD
          value: password
        - name: POSTGRES_DB
          value: devdb
      volumeMounts:
        - name: db-data
          path: "/var/lib/postgresql/data"

commands:
  - id: install
    exec:
      component: nodejs
      commandLine: "npm install"
      workingDir: /projects/nodejs-app
      group:
        kind: build
        isDefault: true

  - id: run
    exec:
      component: nodejs
      commandLine: "npm run dev"
      workingDir: /projects/nodejs-app
      group:
        kind: run
        isDefault: true

  - id: test
    exec:
      component: nodejs
      commandLine: "npm test"
      workingDir: /projects/nodejs-app
      group:
        kind: test
        isDefault: true

events:
  preStart:
    - install
  postStop:
    - id: cleanup
      exec:
        component: nodejs
        commandLine: "npm run clean"

volumes:
  - name: node-modules
    size: 1Gi
  - name: db-data
    size: 1Gi

在 Workspace 中使用 Devfile

可以使用以下两种方法将一个 Workspace 和一个 Devfile 关联:

  1. 当为 Workspace 指定了 Git Repo,如果在 Git Repo 中有名为 devfile.yaml 或 .devfile.yaml 的文件,则会为 Workspace 使用该文件。默认 Devfile 是放在 Git Repo 根目录中。如果不是,还可指定保存 Devfile 的路径。
    在这里插入图片描述
  2. 使用以下 URL 模式可以直接根据一个可以访问到的 devfile.yaml 文件创建 Workspace。
    https://<openshift_dev_spaces_fqdn>#https://raw.githubusercontent.com/che-samples/cpp-hello-world/main/devfile.yaml

当 Workspace 和 Devfile 关联后,Dev Spaces 将使用 Devfile 中的配置创建 Workspace 运行环境。

  1. 根据 https://github.com/RedHat-Middleware-Workshops/quarkus-workshop-m1m2-labs/tree/ocp-4.15 创建一个 Workspace。
  2. 进入 Workspace 的 IDE,可以看到其中的 .devfile.yaml 文件中的配置。
    在这里插入图片描述
  3. 运行以下命令,确认在 deploy 中为名为 quarkus-tools 容器配置的环境参数和上图 .devfile.yaml 中名为 quarkus-tools 组件中的环境参数是一样的。
$ oc get deploy -n user1-devspaces -l controller.devfile.io/devworkspace_name=quarkus-workshop -ojsonpath='{.items[0].spec.template.spec.containers[?(@.name=="quarkus-tools")]}' | jq
{
  "env": [
    {
      "name": "PROJECTS_ROOT",
      "value": "/projects"
    },
    {
      "name": "PROJECT_SOURCE",
      "value": "/projects/quarkus-workshop-m1m2-labs"
    },
    {
      "name": "DEVWORKSPACE_COMPONENT_NAME",
      "value": "quarkus-tools"
    },
。。。。。。
  1. 另外还在 Dev Spaces 仪表盘中可查看名为 quarkus-workshop 的 Workspace 中的 Devfile 配置。
    在这里插入图片描述
  2. 在以上 Workspace 的 IDE 界面上方的查找框的下拉列表中点击 Run Task。
    在这里插入图片描述
  3. 然后在进入 devfile。
    在这里插入图片描述
  4. 可以看到在 .devfile.yaml 中定义的 6 个 Command。
    在这里插入图片描述
  5. 另外还可以根据下图在 IDE 的下方通过下拉列表进入 Configure Tasks… 菜单。
    在这里插入图片描述
  6. 此时会在 .vscode 中自动创建 tasks.json 文件,并将选中的 Task 的配置。可以修改 tasks.json 文件中的任务配置,以便定制开发人员自己常用的操作。
    在这里插入图片描述

在一个 Workspace 中同时开发多个项目

在 Devfile 中声明多个Project

使用以下 Devfile 可以声明使用多个 Project。

schemaVersion: 2.2.0
metadata:
  name: multi-devfile
  version: 1.0.0
projects:
  - name: frontend
    git:
      remotes:
        origin: 'https://github.com/acmecorp/frontend.git'
  - name: backend
    git:
      remotes:
        origin: 'https://github.com/acmecorp/backend.git'

在 .code-workspace 中添加 Project

  1. 进入运行名为 quarkus-workshop 的 Workspace 的 Pod。
$ oc -n user1-devspaces rsh deployment/$(oc get deploy -n user1-devspaces -l controller.devfile.io/devworkspace_name=quarkus-workshop -ojsonpath={.items[0].metadata.name})
Defaulted container "quarkus-tools" out of: quarkus-tools, che-gateway, che-code-injector (init), project-clone (init)
sh-4.4$ 
  1. 查看当前已有的文件和项目。
sh-4.4$ ls -al ./
total 8
drwxrwsrwx.  4 root 1000740000   95 Dec  1 02:36 .
dr-xr-xr-x.  1 root root        149 Dec  1 02:30 ..
-rw-r--r--.  1 user 1000740000  272 Dec  1 02:36 .code-workspace
drwxr-sr-x.  6 user 1000740000  153 Dec  1 02:30 quarkus-workshop-m1m2-labs
  1. 将 Git Repo 克隆到本地。
sh-4.4$ git clone https://github.com/RedHat-Middleware-Workshops/quarkus-workshop-m3-labs
  1. 编辑 /projects/.code-workspace 文件,按下面添加后半部分 quarkus-workshop-m3-labs 的内容。
sh-4.4$ vi /projects/.code-workspace
{
        "folders": [
                {
                        "name": "quarkus-workshop-m1m2-labs",
                        "path": "/projects/quarkus-workshop-m1m2-labs"
                },
                {
                        "name": "quarkus-workshop-m3-labs",
                        "path": "/projects/quarkus-workshop-m3-labs"
                }
        ]
}
  1. 保存后 Workspace IDE 会自动刷新项目列表。
    在这里插入图片描述

Devfile Registry

Devfile Registry 是一个中央存储库,用于存储预定义的 Devfile 集合。开发人员可使用这些 Devfiles 快速创建和配置适用于各种应用程序、框架和编程语言的一致开发环境。

Devfile Registry 作为一项服务可以是公开访问的,也可以是内部私有的,如果是私有的,用户还可根据自己的需要定制在 Devfile Registry 中可以包含哪些 Devfile。

内部 Devfile Registry

内部 Devfile Registry 预制的 Devfile

在 Dev Spaces 环境中预制了一个自用的 Devfile Registry,其中包括一些常用的 Devfile。

  1. 执行以下命令,查看在 devspaces-dashboard 部署中内置的 devfile-registry 包含的两类 index.json 文件,确认一共有 12 个 Devfile 配置。
$ oc -n devspaces exec deploy/devspaces-dashboard -- cat /public/dashboard/devfile-registry/devfiles/index.json | grep display
    "displayName": "Empty Workspace",
$ oc -n devspaces exec deploy/devspaces-dashboard -- cat /public/dashboard/devfile-registry/air-gap/index.json | grep display
    "displayName": "PHP",
    "displayName": ".NET",
    "displayName": "Node.js MongoDB",
    "displayName": "Java Lombok",
    "displayName": "Node.js Express",
    "displayName": "C/C++",
    "displayName": "Ansible",
    "displayName": "Quarkus REST API",
    "displayName": "Go",
    "displayName": "Python",
    "displayName": "JBoss EAP 8.0",

说明:也可用浏览器访问以下获得的地址。

$ echo https://$(oc get route devspaces -n devspaces -ojsonpath={.spec.host})/dashboard/devfile-registry/devfiles/index.json
$ echo https://$(oc get route devspaces -n devspaces -ojsonpath={.spec.host})/dashboard/devfile-registry/air-gap/index.json
  1. 进入 Dev Spaces 仪表盘的 Create Workspace 页面,也可以在 Select a Sample 区域找到一共 12 个示例。
    在这里插入图片描述
  2. 如果修改 CheCluster CRD 的配置,将 devfileRegistry 的 disableInternalRegistry 设为 true,则在 Select a Sample 区域就只显示 1 个示例了。
...
spec:
  components:
    devfileRegistry:
      disableInternalRegistry: true
...

在这里插入图片描述

向内部 Devfile Registry 动态追加 Devfile

  1. 基于以下内容创建 rust-sample.json 文件。
[
  {
    "id": "rust",
    "displayName": "Rust",
    "description": "Rust toolchain with Cargo",
    "tags": [
      "Rust",
      "Cargo",
      "UBI8"
    ],
    "url": "https://github.com/rsriniva/rust-devspaces",
    "icon": {
      "mediatype": "image/svg+xml",
      "base64data": "PHN2ZyB2ZXJzaW9uPSIxLjEiIGhlaWdodD0iMTA2IiB3aWR0aD0iMTA2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KPGcgaWQ9ImxvZ28iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUzLCA1MykiPgogIDxwYXRoIGlkPSJyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjUsIDAuNSkiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS13aWR0aD0iMSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iCiAgICBNIC05LC0xNSBIIDQgQyAxMiwtMTUgMTIsLTcgNCwtNyBIIC05IFoKICAgIE0gLTQwLDIyIEggMCBWIDExIEggLTkgViAzIEggMSBDIDEyLDMgNiwyMiAxNSwyMiBIIDQwCiAgICBWIDMgSCAzNCBWIDUgQyAzNCwxMyAyNSwxMiAyNCw3IEMgMjMsMiAxOSwtMiAxOCwtMiBDIDMzLC0xMCAyNCwtMjYgMTIsLTI2IEggLTM1CiAgICBWIC0xNSBIIC0yNSBWIDExIEggLTQwIFoiIC8+CiAgPGcgaWQ9ImdlYXIiIG1hc2s9InVybCgjaG9sZXMpIj4KICAgIDxjaXJjbGUgcj0iNDMiIGZpbGw9Im5vbmUiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS13aWR0aD0iOSIgLz4KICAgIDxnIGlkPSJjb2dzIj4KICAgICAgPHBvbHlnb24gaWQ9ImNvZyIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBwb2ludHM9IjQ2LDMgNTEsMCA0NiwtMyIgLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjY29nIiB0cmFuc2Zvcm09InJvdGF0ZSgxMS4yNSkiIC8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2NvZyIgdHJhbnNmb3JtPSJyb3RhdGUoMjIuNTApIiAvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNjb2ciIHRyYW5zZm9ybT0icm90YXRlKDMzLjc1KSIgLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjY29nIiB0cmFuc2Zvcm09InJvdGF0ZSg0NS4wMCkiIC8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2NvZyIgdHJhbnNmb3JtPSJyb3RhdGUoNTYuMjUpIiAvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNjb2ciIHRyYW5zZm9ybT0icm90YXRlKDY3LjUwKSIgLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjY29nIiB0cmFuc2Zvcm09InJvdGF0ZSg3OC43NSkiIC8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2NvZyIgdHJhbnNmb3JtPSJyb3RhdGUoOTAuMDApIiAvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNjb2ciIHRyYW5zZm9ybT0icm90YXRlKDEwMS4yNSkiIC8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2NvZyIgdHJhbnNmb3JtPSJyb3RhdGUoMTEyLjUwKSIgLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjY29nIiB0cmFuc2Zvcm09InJvdGF0ZSgxMjMuNzUpIiAvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNjb2ciIHRyYW5zZm9ybT0icm90YXRlKDEzNS4wMCkiIC8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2NvZyIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ2LjI1KSIgLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjY29nIiB0cmFuc2Zvcm09InJvdGF0ZSgxNTcuNTApIiAvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNjb2ciIHRyYW5zZm9ybT0icm90YXRlKDE2OC43NSkiIC8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2NvZyIgdHJhbnNmb3JtPSJyb3RhdGUoMTgwLjAwKSIgLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjY29nIiB0cmFuc2Zvcm09InJvdGF0ZSgxOTEuMjUpIiAvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNjb2ciIHRyYW5zZm9ybT0icm90YXRlKDIwMi41MCkiIC8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2NvZyIgdHJhbnNmb3JtPSJyb3RhdGUoMjEzLjc1KSIgLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjY29nIiB0cmFuc2Zvcm09InJvdGF0ZSgyMjUuMDApIiAvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNjb2ciIHRyYW5zZm9ybT0icm90YXRlKDIzNi4yNSkiIC8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2NvZyIgdHJhbnNmb3JtPSJyb3RhdGUoMjQ3LjUwKSIgLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjY29nIiB0cmFuc2Zvcm09InJvdGF0ZSgyNTguNzUpIiAvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNjb2ciIHRyYW5zZm9ybT0icm90YXRlKDI3MC4wMCkiIC8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2NvZyIgdHJhbnNmb3JtPSJyb3RhdGUoMjgxLjI1KSIgLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjY29nIiB0cmFuc2Zvcm09InJvdGF0ZSgyOTIuNTApIiAvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNjb2ciIHRyYW5zZm9ybT0icm90YXRlKDMwMy43NSkiIC8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2NvZyIgdHJhbnNmb3JtPSJyb3RhdGUoMzE1LjAwKSIgLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjY29nIiB0cmFuc2Zvcm09InJvdGF0ZSgzMjYuMjUpIiAvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNjb2ciIHRyYW5zZm9ybT0icm90YXRlKDMzNy41MCkiIC8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2NvZyIgdHJhbnNmb3JtPSJyb3RhdGUoMzQ4Ljc1KSIgLz4KICAgIDwvZz4KICAgIDxnIGlkPSJtb3VudHMiPgogICAgICA8cG9seWdvbiBpZD0ibW91bnQiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS13aWR0aD0iNiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgcG9pbnRzPSItNywtNDIgMCwtMzUgNywtNDIiIC8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21vdW50IiB0cmFuc2Zvcm09InJvdGF0ZSg3MikiIC8+CiAgICAgIDx1c2UgeGxpbms6aHJlZj0iI21vdW50IiB0cmFuc2Zvcm09InJvdGF0ZSgxNDQpIiAvPgogICAgICA8dXNlIHhsaW5rOmhyZWY9IiNtb3VudCIgdHJhbnNmb3JtPSJyb3RhdGUoMjE2KSIgLz4KICAgICAgPHVzZSB4bGluazpocmVmPSIjbW91bnQiIHRyYW5zZm9ybT0icm90YXRlKDI4OCkiIC8+CiAgICA8L2c+CiAgPC9nPgogIDxtYXNrIGlkPSJob2xlcyI+CiAgICA8cmVjdCB4PSItNjAiIHk9Ii02MCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSIxMjAiIGZpbGw9IndoaXRlIi8+CiAgICA8Y2lyY2xlIGlkPSJob2xlIiBjeT0iLTQwIiByPSIzIiAvPgogICAgPHVzZSB4bGluazpocmVmPSIjaG9sZSIgdHJhbnNmb3JtPSJyb3RhdGUoNzIpIiAvPgogICAgPHVzZSB4bGluazpocmVmPSIjaG9sZSIgdHJhbnNmb3JtPSJyb3RhdGUoMTQ0KSIgLz4KICAgIDx1c2UgeGxpbms6aHJlZj0iI2hvbGUiIHRyYW5zZm9ybT0icm90YXRlKDIxNikiIC8+CiAgICA8dXNlIHhsaW5rOmhyZWY9IiNob2xlIiB0cmFuc2Zvcm09InJvdGF0ZSgyODgpIiAvPgogIDwvbWFzaz4KPC9nPgo8L3N2Zz4K"
    }
  }
]
  1. 基于 rust-sample.json 文件生成 configmap,并为其增加标签。
$ oc create configmap getting-started-samples --from-file=rust-sample.json -n devspaces
$ oc label configmap getting-started-samples -n devspaces \
	  app.kubernetes.io/part-of=che.eclipse.org \
	  app.kubernetes.io/component=getting-started-samples
  1. 重新打开 Workspace 后可以在 Select a Sample 区域看到新加的示例。
    在这里插入图片描述

外部 Devfile Registry

  1. https://registry.devfile.io 是一个外部公共的 Devfile Registry,它提供的 Devfile 也可在 https://github.com/devfile/registry/tree/main/stacks 中找到。
    在这里插入图片描述
  2. 在上图中找到 Spring Boot 并进入,可以看到下图。点击下图中的 Raw devfile 链接可跳转到 https://registry.devfile.io/devfiles/java-springboot/1.4.0,它即是 Devfile。
    在这里插入图片描述
  3. 在 Dev Spaces 仪表盘中基于 https://registry.devfile.io/devfiles/java-springboot/1.4.0 创建一个 Workspace。
    在这里插入图片描述
  4. 完成后进入 Workspace 的 IDE,可以看到由 Devfile 配置获得的 Git Repo。
    在这里插入图片描述

使用外部 Devfile Registry

  1. 修改 CheCluster CRD 的配置,将 devfileRegistry 的 disableInternalRegistry 设为 true,并将 externalDevfileRegistries 设为 https://registry.devfile.io。
......
spec:
  components:
    devfileRegistry:
      disableInternalRegistry: true
      externalDevfileRegistries:
        - url: 'https://registry.devfile.io'
......
  1. 刷新 Dev Spaces 仪表盘的 Create Workspace 页面,可以看到从 https://registry.devfile.io 获得的 Devfile 示例。
    在这里插入图片描述

定制外部 Devfile Registry

用户可以定制一套 Devfile Registry 环境,将自己常用的 Devfile 放入其中,并独立于 Dev Spaces 之外运行。不过此过程步骤较多,可参考 https://devfile.io/docs/2.3.0/devfile-registry 的操作步骤实现。

参考

https://github.com/redhat-developer/devspaces-images/blob/devspaces-3-rhel-8/devspaces-dashboard/samples/index.json
https://github.com/redhat-developer/devspaces-images/tree/devspaces-3-rhel-8/devspaces-dashboard/packages/devfile-registry
https://devfile.io/docs/2.3.0/devfile-registry

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值