《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 关联:
- 当为 Workspace 指定了 Git Repo,如果在 Git Repo 中有名为 devfile.yaml 或 .devfile.yaml 的文件,则会为 Workspace 使用该文件。默认 Devfile 是放在 Git Repo 根目录中。如果不是,还可指定保存 Devfile 的路径。
- 使用以下 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 运行环境。
- 根据 https://github.com/RedHat-Middleware-Workshops/quarkus-workshop-m1m2-labs/tree/ocp-4.15 创建一个 Workspace。
- 进入 Workspace 的 IDE,可以看到其中的 .devfile.yaml 文件中的配置。
- 运行以下命令,确认在 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"
},
。。。。。。
- 另外还在 Dev Spaces 仪表盘中可查看名为 quarkus-workshop 的 Workspace 中的 Devfile 配置。
- 在以上 Workspace 的 IDE 界面上方的查找框的下拉列表中点击 Run Task。
- 然后在进入 devfile。
- 可以看到在 .devfile.yaml 中定义的 6 个 Command。
- 另外还可以根据下图在 IDE 的下方通过下拉列表进入 Configure Tasks… 菜单。
- 此时会在 .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
- 进入运行名为 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$
- 查看当前已有的文件和项目。
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
- 将 Git Repo 克隆到本地。
sh-4.4$ git clone https://github.com/RedHat-Middleware-Workshops/quarkus-workshop-m3-labs
- 编辑 /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"
}
]
}
- 保存后 Workspace IDE 会自动刷新项目列表。
Devfile Registry
Devfile Registry 是一个中央存储库,用于存储预定义的 Devfile 集合。开发人员可使用这些 Devfiles 快速创建和配置适用于各种应用程序、框架和编程语言的一致开发环境。
Devfile Registry 作为一项服务可以是公开访问的,也可以是内部私有的,如果是私有的,用户还可根据自己的需要定制在 Devfile Registry 中可以包含哪些 Devfile。
内部 Devfile Registry
内部 Devfile Registry 预制的 Devfile
在 Dev Spaces 环境中预制了一个自用的 Devfile Registry,其中包括一些常用的 Devfile。
- 执行以下命令,查看在 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
- 进入 Dev Spaces 仪表盘的 Create Workspace 页面,也可以在 Select a Sample 区域找到一共 12 个示例。
- 如果修改 CheCluster CRD 的配置,将 devfileRegistry 的 disableInternalRegistry 设为 true,则在 Select a Sample 区域就只显示 1 个示例了。
...
spec:
components:
devfileRegistry:
disableInternalRegistry: true
...
向内部 Devfile Registry 动态追加 Devfile
- 基于以下内容创建 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"
}
}
]
- 基于 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
- 重新打开 Workspace 后可以在 Select a Sample 区域看到新加的示例。
外部 Devfile Registry
- https://registry.devfile.io 是一个外部公共的 Devfile Registry,它提供的 Devfile 也可在 https://github.com/devfile/registry/tree/main/stacks 中找到。
- 在上图中找到 Spring Boot 并进入,可以看到下图。点击下图中的 Raw devfile 链接可跳转到 https://registry.devfile.io/devfiles/java-springboot/1.4.0,它即是 Devfile。
- 在 Dev Spaces 仪表盘中基于 https://registry.devfile.io/devfiles/java-springboot/1.4.0 创建一个 Workspace。
- 完成后进入 Workspace 的 IDE,可以看到由 Devfile 配置获得的 Git Repo。
使用外部 Devfile Registry
- 修改 CheCluster CRD 的配置,将 devfileRegistry 的 disableInternalRegistry 设为 true,并将 externalDevfileRegistries 设为 https://registry.devfile.io。
......
spec:
components:
devfileRegistry:
disableInternalRegistry: true
externalDevfileRegistries:
- url: 'https://registry.devfile.io'
......
- 刷新 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