You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openserverless.apache.org by ms...@apache.org on 2026/09/07 20:24:11 UTC
(openserverless-devcontainer) 01/06: reworked build
This is an automated email from the ASF dual-hosted git repository.
sciabarracom pushed a commit to branch 0.9.0
in repository https://gitbox.apache.org/repos/asf/openserverless-devcontainer.git
commit 0d26d549047c9176852eee89a9b73c7790ca30c0
Author: Michele Sciabarra <mi...@sciabarra.com>
AuthorDate: Fri Sep 4 19:42:16 2026 +0200
reworked build
---
.env.dist | 13 ++++
.github/workflows/check.yml | 40 +++++++++++
.github/workflows/image.yml | 94 ++++++++++++++++++++++++++
.github/workflows/images.yml | 63 ------------------
.gitignore | 1 +
Dockerfile | 3 +
Taskfile.yml | 153 ++++++++++++++++++++++++++++++++++++++-----
7 files changed, 286 insertions(+), 81 deletions(-)
diff --git a/.env.dist b/.env.dist
new file mode 100644
index 0000000..4681e43
--- /dev/null
+++ b/.env.dist
@@ -0,0 +1,13 @@
+# github user, used to derive the default local image name
+GITHUB_USER=github: put here your github user
+
+# full image name WITHOUT the tag (registry/namespace/repository).
+# Overrides the default taken from ARG DEVCONTAINER_IMAGE_DEFAULT in the Dockerfile.
+MY_DEVCONTAINER_IMAGE=ghcr.io/${GITHUB_USER}/openserverless-devcontainer
+
+# for task docker-login-ghcr (github)
+GITHUB_TOKEN=
+
+# for task docker-login-dockerhub (dockerhub)
+DOCKERHUB_TOKEN=
+DOCKERHUB_USER=
diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml
new file mode 100644
index 0000000..763789c
--- /dev/null
+++ b/.github/workflows/check.yml
@@ -0,0 +1,40 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+name: Check
+on:
+ push:
+ pull_request:
+ workflow_dispatch:
+
+jobs:
+ check:
+ name: Check OpenServerless Devcontainer
+ runs-on: ubuntu-22.04
+ permissions:
+ contents: read
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v7
+ with:
+ submodules: recursive
+ - name: Setup
+ run: |
+ sudo sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /usr/local/bin
+ # the image is built (not pushed) to verify the Dockerfile still works
+ - name: Build
+ run: task build
diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
new file mode 100644
index 0000000..f88ddcd
--- /dev/null
+++ b/.github/workflows/image.yml
@@ -0,0 +1,94 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+name: Build Image
+on:
+ push:
+ tags:
+ - '[0-9]*'
+ branches-ignore: '*'
+ workflow_dispatch:
+
+jobs:
+ image:
+ name: Build OpenServerless Devcontainer Image
+ runs-on: ubuntu-22.04
+ permissions:
+ contents: write
+ packages: write
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v7
+ with:
+ submodules: recursive
+ # full history and tags: "task tag" replaces the existing tags
+ # and "git describe" needs them to be present
+ fetch-depth: 0
+ - name: Setup
+ run: |
+ sudo sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /usr/local/bin
+ # Manual run: create a new snapshot tag on the current HEAD and push it.
+ # The push of the tag does not start another run (GITHUB_TOKEN pushes do
+ # not trigger workflows), so this same run goes on and builds it.
+ - name: Tag HEAD (manual run)
+ if: ${{ github.event_name == 'workflow_dispatch' }}
+ run: |
+ git config user.name "github-actions[bot]"
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
+ task tag
+ task ci
+ - name: Assign TAG from push
+ run: |
+ echo "IMG_TAG=$(git describe --tags --abbrev=0)" >> "$GITHUB_ENV"
+ - name: Generate .env
+ run: |
+ OWNER=$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]')
+ if [ "$OWNER" = "apache" ]; then
+ IMAGE=$(awk -F= '/ARG DEVCONTAINER_IMAGE_DEFAULT=/ { print $2 ; exit }' Dockerfile)
+ else
+ IMAGE="ghcr.io/$OWNER/openserverless-devcontainer"
+ fi
+ echo "GITHUB_USER=$OWNER" > .env
+ echo "MY_DEVCONTAINER_IMAGE=$IMAGE" >> .env
+ cat .env
+ - name: Select registry
+ env:
+ DOCKERHUB_REGISTRY: ${{ secrets.DOCKERHUB_REGISTRY }}
+ run: |
+ if [ -n "$DOCKERHUB_REGISTRY" ]; then
+ REGISTRY="$DOCKERHUB_REGISTRY"
+ elif [ "${{ github.repository_owner }}" = "apache" ]; then
+ REGISTRY="docker.io"
+ else
+ REGISTRY="ghcr.io"
+ fi
+ echo "REGISTRY=$REGISTRY" >> "$GITHUB_ENV"
+ - name: Registry login
+ uses: docker/login-action@v4
+ with:
+ registry: ${{ env.REGISTRY }}
+ username: ${{ secrets.DOCKERHUB_USER || github.repository_owner }}
+ password: ${{ secrets.DOCKERHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v4
+ with:
+ image: tonistiigi/binfmt:qemu-v7.0.0-28
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v4
+ - name: Image
+ run: task buildx PUSH=1 DEVCONTAINER_TAG=$IMG_TAG
+
diff --git a/.github/workflows/images.yml b/.github/workflows/images.yml
deleted file mode 100644
index ccf74f4..0000000
--- a/.github/workflows/images.yml
+++ /dev/null
@@ -1,63 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-name: Build Images
-on:
- push:
- tags:
- - '[0-9]*'
- branches-ignore: '*'
- #pull_request:
- # branches: [main]
-
-permissions:
- contents: write
- packages: write
-
-jobs:
- image:
- name: Build Image
- runs-on: ubuntu-22.04
- steps:
- - name: Checkout recursive
- uses: actions/checkout@v2
- # TODO
- #- name: License check
- # uses: apache/skywalking-eyes@main
- # continue-on-error: true
- - name: Assign TAG from pull request
- if: ${{ github.event_name == 'pull_request' }}
- run: |
- echo "IMG_TAG=$(git rev-parse --short HEAD)" >> "$GITHUB_ENV"
- - name: Assign TAG from push
- if: ${{ github.event_name != 'pull_request' }}
- run: |
- echo "IMG_TAG=$(git describe --tags --abbrev=0)" >> "$GITHUB_ENV"
- - name: Registry login
- uses: docker/login-action@v3
- with:
- username: ${{ secrets.DOCKERHUB_USER }}
- password: ${{ secrets.DOCKERHUB_TOKEN }}
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
- - name: Build and push
- uses: docker/build-push-action@v5
- with:
- platforms: linux/amd64,linux/arm64
- tags: apache/openserverless-devcontainer:${{ env.IMG_TAG }}
- push: true
-
diff --git a/.gitignore b/.gitignore
index e60aaea..febe6bc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
_*
+.env
diff --git a/Dockerfile b/Dockerfile
index fd0d4b3..0150a6b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,7 @@
FROM node:22
+
+ARG DEVCONTAINER_IMAGE_DEFAULT=docker.io/apache/openserverless-devcontainer
+ARG DEVCONTAINER_TAG_DEFAULT=latest
# Install basic development tools
RUN \
echo "deb http://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" > /etc/apt/sources.list.d/pgdg.list && \
diff --git a/Taskfile.yml b/Taskfile.yml
index 504a420..4b54c00 100644
--- a/Taskfile.yml
+++ b/Taskfile.yml
@@ -1,46 +1,163 @@
-version: 3
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+version: '3'
vars:
-
- NAME: apache/openserverless-devcontainer
+ BASETAG: 0.9.0-incubating
+ SUFFIX: "-SNAPSHOT"
+ COMMIT_ID:
+ sh: git rev-parse --short HEAD
+ # taken from the tag - overridable with DEVCONTAINER_TAG env var
TAG:
- sh: git tag --sort=-creatordate | head -n 1 || "latest"
+ sh: echo "${DEVCONTAINER_TAG:-$(git describe --tags --abbrev=0 2>/dev/null || git rev-parse --short HEAD)}"
+ # taken from the Dockerfile - overridable with MY_DEVCONTAINER_IMAGE env var
+ DEVCONTAINER_IMAGE:
+ sh: echo "${MY_DEVCONTAINER_IMAGE:-$(awk -F= '/ARG DEVCONTAINER_IMAGE_DEFAULT=/ { print $2 ; exit }' Dockerfile)}"
+
+dotenv:
+ - .env
tasks:
default: task --list-all
- show: "echo {{.NAME}}:{{.TAG}}"
+ image:
+ desc: |
+ Print the image name that would be built.
+ silent: true
+ cmds:
+ - echo "Devcontainer=${MY_DEVCONTAINER_IMAGE:-{{.DEVCONTAINER_IMAGE}}}:{{.TAG}}"
- update-opsroot:
+ show:
silent: true
cmds:
- - jq . ../olaris/opsroot.json >_opsroot.orig
- - jq '.config.images.devcontainer = "{{.NAME}}:{{.TAG}}"' ../olaris/opsroot.json >_opsroot.json
- - diff _opsroot.orig _opsroot.json || cp -v _opsroot.json ../olaris/opsroot.json
+ - echo "${MY_DEVCONTAINER_IMAGE:-{{.DEVCONTAINER_IMAGE}}}:{{.TAG}}"
+
+ docker-login-ghcr:
+ silent: true
+ cmds:
+ - |
+ echo "Logging in to ghcr.io as $GITHUB_USER"
+ echo $GITHUB_TOKEN | docker login ghcr.io -u $GITHUB_USER --password-stdin
+ docker-login-dockerhub:
+ silent: true
+ cmds:
+ - |
+ echo "Logging in to docker.io as $DOCKERHUB_USER"
+ echo $DOCKERHUB_TOKEN | docker login docker.io -u $DOCKERHUB_USER --password-stdin
+
+ docker-login:
+ desc: |
+ Login to the registry the image name points to: docker.io for apache images,
+ ghcr.io otherwise.
+ silent: true
+ cmds:
+ - |
+ IMG="${MY_DEVCONTAINER_IMAGE:-{{.DEVCONTAINER_IMAGE}}}"
+ case "$IMG" in
+ ghcr.io/*) task docker-login-ghcr ;;
+ *) task docker-login-dockerhub ;;
+ esac
+
+ # deprecated - use task tag
image-tag:
- - git tag -d "$(git tag)" || true
- - git tag "0.1.0-incubating.$(date +%y%m%d%H%M)"
- - echo {{.NAME}}:$(git tag --sort=-creatordate | head -n 1)
+ desc: "[deprecated] use task tag"
+ silent: true
+ cmds:
+ - 'echo "deprecated, use task tag"'
+
+ tag:
+ desc: |
+ Create a new snapshot tag for the current git commit.
+ NOTE: this deletes the existing local tags first - snapshot tags are disposable.
+ silent: true
+ vars:
+ TS:
+ sh: date '+%y %m %d %H %M' | awk '{printf "%s%s%d%s%d\n", $1, substr("abcdefghijkl",$2+0,1), $3, substr("abcdefghijklmnopqrstuvwx",$4+1,1), $5}'
+ cmds:
+ - git tag -d $(git tag) 2>/dev/null || true
+ - |
+ TAG="{{.BASETAG}}.{{.TS}}{{.SUFFIX}}"
+ git tag -f $TAG
+ echo New tag $TAG
+
+ ci:
+ desc: |
+ Push the tags, starting the GitHub Actions build on the repo that received them.
+ This does not build anything locally.
+ cmds:
+ - git push --tags --force
+
+ buildx:
+ desc: |
+ Build the docker image using buildx. Set PUSH=1 to push the image to the registry.
+ silent: true
+ cmds:
+ - |
+ IMG="${MY_DEVCONTAINER_IMAGE:-{{.DEVCONTAINER_IMAGE}}}:{{.TAG}}"
+ if [ -n "{{.PUSH}}" ]; then
+ {{.DRY}} docker buildx build -t "$IMG" \
+ --build-arg DEVCONTAINER_IMAGE_DEFAULT="${MY_DEVCONTAINER_IMAGE:-{{.DEVCONTAINER_IMAGE}}}" \
+ --build-arg DEVCONTAINER_TAG_DEFAULT="{{.TAG}}" \
+ --platform linux/amd64,linux/arm64 . --push
+ else
+ {{.DRY}} docker buildx build -t "$IMG" \
+ --build-arg DEVCONTAINER_IMAGE_DEFAULT="${MY_DEVCONTAINER_IMAGE:-{{.DEVCONTAINER_IMAGE}}}" \
+ --build-arg DEVCONTAINER_TAG_DEFAULT="{{.TAG}}" \
+ . --load
+ fi
+ echo "Built $IMG"
build:
- - docker build -t "{{.NAME}}:{{.TAG}}" . --load
- - task: show
+ desc: |
+ Build the docker image locally and load it into the local docker daemon.
+ cmds:
+ - task: buildx
+
+ update-opsroot:
+ desc: update the devcontainer image in olaris/opsroot.json
+ silent: true
+ cmds:
+ - jq . ../olaris/opsroot.json >_opsroot.orig
+ - |
+ IMG="${MY_DEVCONTAINER_IMAGE:-{{.DEVCONTAINER_IMAGE}}}:{{.TAG}}"
+ jq --arg img "$IMG" '.config.images.devcontainer = $img' ../olaris/opsroot.json >_opsroot.json
+ - diff _opsroot.orig _opsroot.json || cp -v _opsroot.json ../olaris/opsroot.json
clean:
+ desc: remove the local containers and images
+ cmds:
- docker rm -f ssh-devcontainer || true
- docker images | awk '/<none>|devcontainer/{print $3}' | xargs docker rmi -f || true
all:
- - task: image-tag
+ desc: tag, build and update opsroot
+ cmds:
+ - task: tag
# warning: the ':' is missing intentionally to reload the tag
- task build
- task update-opsroot
publish:
+ desc: commit, tag and push - this starts the CI build
+ cmds:
- git commit -m "publishing $(date)" -a || true
- - task: image-tag
+ - task: tag
- task update-opsroot
- - git push origin main --tags
-
+ - task: ci