blob: cfd53aa65b5826fa6cd78b6db6aafc7ae92449bc [file] [view]
# Build Session Notes
Date: 2026-06-27
## Scope
Work was done locally only. No git push and no Docker Hub push were performed.
## Branches And Submodules
- Root repository branch: `build`
- `build` submodule branch: `build-local`
- `build/openwhisk` submodule branch: `openwhisk-build-fixes`
## OpenWhisk Source
The nested `build/openwhisk` submodule was moved to the Nuvolaris commit:
```text
a456219d35bfabe4a3458fcce82cd71497a8524e
```
`build/.gitmodules` was updated to use:
```text
https://github.com/nuvolaris/openwhisk.git
```
## Build Devcontainer
The correct build devcontainer is:
```text
build/.devcontainer/Dockerfile
```
The top-level `devcontainer` submodule was touched by mistake, then reverted. It is not part of the final build path.
The build devcontainer was updated to be multi-arch and OpenWhisk-ready:
- Java 11 via Temurin is the default `JAVA_HOME`
- GraalVM Java 17 is still available for native-image
- Docker CLI and buildx are installed
- Docker repo setup uses the Ubuntu codename instead of a hardcoded `bionic`
Verified inside the container:
```text
java 11.0.17
javac 11.0.17
native-image 17.0.9
docker CLI available
task available
```
## Gradle Fixes
`task distdocker` initially failed with dependency resolution errors in the old OpenWhisk commit.
Backported minimal Gradle fixes in `build/openwhisk`:
- `build.gradle`: use `gradle.plugin.cz.alenkacz:gradle-scalafmt`
- `settings.gradle`: `scalafmt` version `1.5.1`
- `core/standalone/build.gradle`: `gradle-git-properties` version `2.4.2`
These fixes are committed locally in:
```text
f2cba906 Fix OpenWhisk distDocker dependency resolution
```
## Java 17 Host Error
Running OpenWhisk Gradle directly on the host failed with:
```text
Unsupported class file major version 61
```
Reason: host Java was 17, but this OpenWhisk/Gradle 6.9.1 build must run with Java 11.
Fix: `build/Taskfile.yml` now wraps `distdocker` and `build-all` with `ops ide devcontainer`, so the host uses the same devcontainer path expected by OPS instead of a hand-written `docker run`.
The wrapper also sets a temporary empty `DOCKER_CONFIG` inside the devcontainer.
This avoids failures from a devcontainer-generated Docker credential helper, for
example:
```text
error getting credentials - err: exit status 255
```
## Local Docker Build Tasks
`build/Taskfile.yml` was changed so:
- `task build` is the main local flow: build images, update OPS root, load kind, roll out controller
- `task distdocker` runs through `ops ide devcontainer`
- `task build-all` runs through `ops ide devcontainer`
- `task build-all:local` checks that `openwhisk/common/scala` exists and prints a submodule init hint if it does not
- `distdocker` no longer passes a Docker registry by default
- `build-all` no longer uses `--push` for `ACT=build`
- Push remains explicit via `buildx-and-push` / `ACT=buildx-push`
Verified:
```text
cd /home/msciab/openserverless/build
task build
```
This completed successfully locally through `ops ide devcontainer`. It built the
OpenWhisk images, loaded controller/invoker/standalone into kind, and rolled out
`controller-0`.
Latest verified tag:
```text
2.0.0-incubating.2606291403
```
Latest verified pod image:
```text
controller-0 registry.hub.docker.com/apache/openserverless-wsk-controller:2.0.0-incubating.2606291403
```
## OpenWhisk Directory
`build/openwhisk` was converted from a nested Git submodule into a regular
tracked directory inside the `build-local` branch.
Reason: on a fresh server, `task build` failed when Docker tried to build:
```text
openwhisk/common/scala
```
The directory was missing because the nested OpenWhisk submodule had not been
initialized. The `build-local` branch now vendors the OpenWhisk tree from commit
`f2cba906`, including the local Gradle fixes, so a checkout of `build-local`
contains `openwhisk/common/scala` directly.
## Images Built Locally
The OpenWhisk build produced these local Docker images:
```text
registry.hub.docker.com/apache/openserverless-wsk-scala:2.0.0-incubating.2506080813
registry.hub.docker.com/apache/openserverless-wsk-controller:2.0.0-incubating.2506080813
registry.hub.docker.com/apache/openserverless-wsk-invoker:2.0.0-incubating.2506080813
registry.hub.docker.com/apache/openserverless-wsk-scheduler:2.0.0-incubating.2506080813
registry.hub.docker.com/apache/openserverless-wsk-standalone:2.0.0-incubating.2506080813
```
Despite the `registry.hub.docker.com/apache` prefix, these were local tags only. They were not pushed.
## OPS Root Image Override
The installed OPS root was updated here:
```text
/home/msciab/.ops/0.1.0/olaris/opsroot.json
```
Changed keys:
```json
{
"standalone": "registry.hub.docker.com/apache/openserverless-wsk-standalone:2.0.0-incubating.2506080813",
"controller": "registry.hub.docker.com/apache/openserverless-wsk-controller:2.0.0-incubating.2506080813",
"invoker": "registry.hub.docker.com/apache/openserverless-wsk-invoker:2.0.0-incubating.2506080813"
}
```
Important: in the current standalone OpenWhisk deployment path, OPS/operator uses `controller.image` for the controller pod. The `standalone` key is present in `opsroot.json`, but the observed `Whisk` resource uses `spec.controller.image`.
## Kubeconfig Repair
The host kubeconfig was stale:
```text
https://127.0.0.1:35889
```
The running kind control plane was exposed on:
```text
https://127.0.0.1:34101
```
Backed up kubeconfig:
```text
/home/msciab/.kube/config.bak.20260627085813
```
Updated context:
```text
kind-nuvolaris
```
Verified:
```text
kubectl cluster-info
kubectl get nodes
```
## Loading Images Into Kind
This is now automated by the build repository task:
```bash
cd /home/msciab/openserverless/build
task build
```
That task runs:
1. `task build-all`
2. update of `/home/msciab/.ops/0.1.0/olaris/opsroot.json`
3. import of local OpenWhisk images into the kind node
4. rollout of the local OpenWhisk controller StatefulSet
5. final status output
The locally built images were not automatically present in the kind node.
The underlying import command is:
```bash
for img in \
registry.hub.docker.com/apache/openserverless-wsk-controller:2.0.0-incubating.2506080813 \
registry.hub.docker.com/apache/openserverless-wsk-invoker:2.0.0-incubating.2506080813 \
registry.hub.docker.com/apache/openserverless-wsk-standalone:2.0.0-incubating.2506080813
do
docker save "$img" | docker exec -i nuvolaris-control-plane ctr --namespace=k8s.io images import -
done
```
Verified in kind:
```text
registry.hub.docker.com/apache/openserverless-wsk-controller 2.0.0-incubating.2506080813
registry.hub.docker.com/apache/openserverless-wsk-invoker 2.0.0-incubating.2506080813
registry.hub.docker.com/apache/openserverless-wsk-standalone 2.0.0-incubating.2506080813
```
## Current Pod Image
The `Whisk` CR had the new image:
```text
spec.controller.image = registry.hub.docker.com/apache/openserverless-wsk-controller:2.0.0-incubating.2506080813
```
But the actual StatefulSet/pod initially still used:
```text
ghcr.io/nuvolaris/openwhisk-controller:0.3.0-morpheus.22122609
```
This is now automated by:
```bash
cd /home/msciab/openserverless/build
task build
```
The underlying patch command is:
```bash
kubectl -n nuvolaris set image statefulset/controller \
controller=registry.hub.docker.com/apache/openserverless-wsk-controller:2.0.0-incubating.2506080813
```
Rollout completed and `controller-0` now uses:
```text
registry.hub.docker.com/apache/openserverless-wsk-controller:2.0.0-incubating.2506080813
```
## Why `task build` / `task setup` Did Not Do This Automatically
There are two separate build systems:
1. Root `Taskfile.yml`
- Builds CLI, operator, runtimes, streamer, admin-api.
- Its `opsroot` task updates only:
- `operator`
- `streamer`
- `systemapi`
- It does not build or update OpenWhisk `controller` / `invoker` / `standalone`.
- It saves some images into `~/.ops/<os>-<arch>/images/kind`, but not the OpenWhisk images produced by `build/Taskfile.yml`.
2. `build/Taskfile.yml`
- Builds OpenWhisk images:
- controller
- invoker
- scheduler
- standalone
- scala base
- Before this session, it did not update OPS `opsroot.json`.
- Before manual loading, it did not load these images into kind.
Also, the operator/standalone image replacement appears to miss the new image when rendering the StatefulSet.
Observed behavior:
- The `Whisk` CR contains `spec.controller.image` with the new image.
- The generated StatefulSet still had the old template image.
Likely technical cause:
- `olaris-op/nuvolaris/openwhisk_standalone.py` calls `kus.image(whisk_image, newTag=whisk_tag)`.
- Kustomize image replacement matches the image name already present in the template.
- The template contains `ghcr.io/nuvolaris/openwhisk-controller`.
- The generated kustomization uses the new image as the match name, so it does not match the old template image.
Proper code-level fix should replace the template image name with `newName`, for example:
```text
name: ghcr.io/nuvolaris/openwhisk-controller
newName: registry.hub.docker.com/apache/openserverless-wsk-controller
newTag: 2.0.0-incubating.2506080813
```
## Local Commits Created
Root repo:
```text
bd8b2b4 Update build-all local workflow
1796e13 Update build distdocker container wrapper
35ae719 Update build distdocker local workflow
d4d269d Update build submodule devcontainer toolchain
d781ddb Update build submodule for Nuvolaris openwhisk source
d758eab Point build submodule to local openwhisk update
```
Build submodule:
```text
3326ff6 Make build-all local and containerized
f591434 Run distdocker through build container
13ef155 Make distdocker local-only by default
3492964 Make build devcontainer multi-arch OpenWhisk ready
2c53f0f Use Nuvolaris openwhisk submodule source
2fd1cf8 Point openwhisk to Nuvolaris action size change
```
OpenWhisk submodule:
```text
f2cba906 Fix OpenWhisk distDocker dependency resolution
```