odo dev
Description
odo dev
is used in order to quickly and effectively iterate through your development process for building an application.
This is inner loop development and allows you to code, build, run and test the application in a continuous workflow.
Running the Command
If you haven't already done so, you must initialize your source code with the odo init
command.
Afterwards, run odo dev
:
$ odo dev
__
/ \__ Developing using the my-nodejs-app Devfile
\__/ \ Namespace: default
/ \__/ odo version: v3.0.0-alpha1
\__/
↪ Deploying to the cluster in developer mode
✓ Waiting for Kubernetes resources [3s]
✓ Syncing files into the container [335ms]
✓ Building your application in container on cluster [2s]
✓ Executing the application [1s]
Your application is now running on the cluster
- Forwarding from 127.0.0.1:40001 -> 3000
Watching for changes in the current directory /Users/user/nodejs
Press Ctrl+c to exit `odo dev` and delete resources from the cluster
In the above example, three things have happened:
- Your application has been built and deployed to the cluster
odo
has port-forwarded your application for local accessabilityodo
will watch for changes in the current directory and rebuild the application when changes are detected
You can press Ctrl-c at any time to terminate the development session. The command can take a few moment to terminate, as it will first delete all resources deployed into the cluster for this session before terminating.
Devfile (Advanced Usage)
Description
When odo dev
is ran, it first looks in the devfile.yaml
for the instructions to be executed, specifically: components
and commands
.
Each command has a group kind
key which correspond to either: build
, run
, test
, or debug
.
These instructions make up the development cycle of odo dev
.
Snippets
With the following example devfile.yaml
file generated by odo init
and selecting nodejs
, a container image will be pushed to the cluster, as well as your source code in order to start the development inner loop cycle.
A much more descriptive explanation on each part of a Devfile can be found on the Devfile API reference site.
Below, we'll explain each section of the corresponding Devfile:
metadata
Descriptive registry information with regards to the devfile being used.
metadata:
description: Stack with Node.js 14
displayName: Node.js Runtime
icon: https://nodejs.org/static/images/logos/nodejs-new-pantone-black.svg
language: javascript
name: my-nodejs-app
projectType: nodejs
tags:
- NodeJS
- Express
- ubi8
version: 1.0.1
schemaVersion: 2.0.0
starterProjects
The starter projects available for this devfile, shown when running
odo init
.starterProjects:
- git:
remotes:
origin: https://github.com/odo-devfiles/nodejs-ex.git
name: nodejs-starter
commands
The list of commands to be used when running
odo dev
.Each command contains what will be ran within the container.
The four groups are: build, run, test and debug.
Build is what is initially ran when deploying to the cluster. It is what builds the initial container.
Run executes the command after the container has been built.
Debug is enabled when running
odo dev --debug
.Test executes any tests which are available and part of your application. (This is NOT-YET-IMPLEMENTED in odo)
All of these commands are needed to: build the program, execute the code, debug the application and run any applicable tests.
commands:
- exec:
commandLine: npm install
component: runtime
group:
isDefault: true
kind: build
workingDir: ${PROJECT_SOURCE}
id: install
- exec:
commandLine: npm start
component: runtime
group:
isDefault: true
kind: run
workingDir: ${PROJECT_SOURCE}
id: run
- exec:
commandLine: npm run debug
component: runtime
group:
isDefault: true
kind: debug
workingDir: ${PROJECT_SOURCE}
id: debug
- exec:
commandLine: npm test
component: runtime
group:
isDefault: true
kind: test
workingDir: ${PROJECT_SOURCE}
id: test
components
Components can include containers as well as Kubernetes yaml.
In our example, the nodejs image is being used on port 3000.
components:
- name: runtime
container:
endpoints:
- name: http-3000
targetPort: 3000
image: registry.access.redhat.com/ubi8/nodejs-14:latest
memoryLimit: 1024Mi
mountSources: true
Full Example
metadata:
description: Stack with Node.js 14
displayName: Node.js Runtime
icon: https://nodejs.org/static/images/logos/nodejs-new-pantone-black.svg
language: javascript
name: my-nodejs-app
projectType: nodejs
tags:
- NodeJS
- Express
- ubi8
version: 1.0.1
schemaVersion: 2.0.0
starterProjects:
- git:
remotes:
origin: https://github.com/odo-devfiles/nodejs-ex.git
name: nodejs-starter
commands:
- exec:
commandLine: npm install
component: runtime
group:
isDefault: true
kind: build
workingDir: ${PROJECT_SOURCE}
id: install
- exec:
commandLine: npm start
component: runtime
group:
isDefault: true
kind: run
workingDir: ${PROJECT_SOURCE}
id: run
- exec:
commandLine: npm run debug
component: runtime
group:
isDefault: true
kind: debug
workingDir: ${PROJECT_SOURCE}
id: debug
- exec:
commandLine: npm test
component: runtime
group:
isDefault: true
kind: test
workingDir: ${PROJECT_SOURCE}
id: test
components:
- name: runtime
container:
endpoints:
- name: http-3000
targetPort: 3000
image: registry.access.redhat.com/ubi8/nodejs-14:latest
memoryLimit: 1024Mi
mountSources: true
State File
When the command odo dev
is executed, the state of the command is saved to the file .odo/devstate.json
.
This state file contains the forwarded ports:
{
"forwardedPorts": [
{
"containerName": "runtime",
"localAddress": "127.0.0.1",
"localPort": 40001,
"containerPort": 3000
}
]
}