feat: standardize user service artifact producer

This commit is contained in:
Codex
2026-05-19 10:05:15 +00:00
parent e866b0526a
commit 292d0cee60
4 changed files with 588 additions and 7 deletions
@@ -400,8 +400,10 @@ spec:
set -euo pipefail
commit="$(cat "$(workspaces.source.path)/backend-core-artifact-commit.txt")"
registry="$(params.registry)"
test "$registry" = "127.0.0.1:5000" || { echo "backend_core_artifact_registry_must_be_d601_loopback=$registry" >&2; exit 2; }
local_image="unidesk/backend-core:$commit"
registry_image="$registry/unidesk/backend-core:$commit"
repository="$registry/unidesk/backend-core"
command -v docker
docker version >/dev/null
docker run --rm --network host rancher/mirrored-library-busybox:1.36.1 wget -q -O- "http://$registry/v2/" >/dev/null
@@ -422,8 +424,11 @@ spec:
actual_commit="$(docker image inspect "$registry_image" --format '{{ index .Config.Labels "unidesk.ai/source-commit" }}')"
test "$actual_commit" = "$commit"
docker push "$registry_image"
docker pull "$registry_image" >/dev/null
repo_digests="$(docker image inspect "$registry_image" --format '{{json .RepoDigests}}')"
printf 'backend_core_artifact_image=%s\nbackend_core_artifact_repo_digests=%s\n' "$registry_image" "$repo_digests"
digest="$(docker image inspect "$registry_image" --format '{{range .RepoDigests}}{{println .}}{{end}}' | awk -F@ -v repo="$repository" '$1 == repo { print $2; exit }')"
test -n "$digest"
printf 'backend_core_artifact_service_id=backend-core\nbackend_core_artifact_image=%s\nbackend_core_artifact_repository=%s\nbackend_core_artifact_tag=%s\nbackend_core_artifact_digest=%s\nbackend_core_artifact_digest_ref=%s@%s\nbackend_core_artifact_source_commit=%s\nbackend_core_artifact_source_repo=%s\nbackend_core_artifact_dockerfile=src/components/backend-core/Dockerfile\nbackend_core_artifact_repo_digests=%s\n' "$registry_image" "$repository" "$commit" "$digest" "$repository" "$digest" "$commit" "$(params.repo-url)" "$repo_digests"
---
apiVersion: tekton.dev/v1
kind: Pipeline
@@ -472,6 +477,211 @@ spec:
---
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: unidesk-user-service-artifact-publish
namespace: unidesk-ci
labels:
app.kubernetes.io/name: unidesk-ci
app.kubernetes.io/component: user-service-artifact
spec:
params:
- name: repo-url
type: string
- name: revision
type: string
- name: service-id
type: string
- name: dockerfile
type: string
- name: app-image
type: string
default: unidesk-code-queue:dev
- name: registry
type: string
default: 127.0.0.1:5000
- name: source-host-path
type: string
workspaces:
- name: source
volumes:
- name: docker-sock
hostPath:
path: /var/run/docker.sock
type: Socket
- name: prepared-source
hostPath:
path: /home/ubuntu/.unidesk/ci/user-service-artifacts
type: Directory
steps:
- name: prepare-source
image: alpine/git:2.45.2
volumeMounts:
- name: prepared-source
mountPath: /prepared-source
readOnly: true
script: |
#!/bin/sh
set -eu
service_id="$(params.service-id)"
dockerfile="$(params.dockerfile)"
source_host_path="$(params.source-host-path)"
case "$(params.revision)" in
[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]) ;;
*) echo "user_service_artifact_revision_must_be_full_sha=$(params.revision)" >&2; exit 2 ;;
esac
printf '%s\n' "$service_id" | grep -Eq '^[a-z0-9]([-a-z0-9]{0,62}[a-z0-9])?$' || { echo "user_service_artifact_service_id_invalid=$service_id" >&2; exit 2; }
case "$dockerfile" in
/*|*..*|""|*latest*) echo "user_service_artifact_dockerfile_invalid=$dockerfile" >&2; exit 2 ;;
esac
expected_prefix="/home/ubuntu/.unidesk/ci/user-service-artifacts/$service_id/"
case "$source_host_path" in
"$expected_prefix"*) ;;
*) echo "user_service_artifact_source_host_path_invalid=$source_host_path" >&2; exit 2 ;;
esac
mkdir -p "$(workspaces.source.path)/user-service-artifact-repo"
find "$(workspaces.source.path)/user-service-artifact-repo" -mindepth 1 -maxdepth 1 -exec rm -rf {} +
source_name="$(basename "$source_host_path")"
source_dir="/prepared-source/$service_id/$source_name"
test -f "$source_dir/.unidesk-source-commit"
test -f "$source_dir/.unidesk-service-id"
test -f "$source_dir/.unidesk-dockerfile"
prepared_commit="$(cat "$source_dir/.unidesk-source-commit")"
prepared_service_id="$(cat "$source_dir/.unidesk-service-id")"
prepared_dockerfile="$(cat "$source_dir/.unidesk-dockerfile")"
test "$prepared_commit" = "$(params.revision)"
test "$prepared_service_id" = "$service_id"
test "$prepared_dockerfile" = "$dockerfile"
cp -a "$source_dir/." "$(workspaces.source.path)/user-service-artifact-repo/"
cd "$(workspaces.source.path)/user-service-artifact-repo"
test -f "$dockerfile"
test -d "$(dirname "$dockerfile")/src"
printf '%s\n' "$prepared_commit" | tee "$(workspaces.source.path)/user-service-artifact-commit.txt"
printf '%s\n' "$service_id" | tee "$(workspaces.source.path)/user-service-artifact-service-id.txt"
printf '%s\n' "$dockerfile" | tee "$(workspaces.source.path)/user-service-artifact-dockerfile.txt"
- name: build-and-push
image: "$(params.app-image)"
imagePullPolicy: Never
workingDir: "$(workspaces.source.path)/user-service-artifact-repo"
env:
- name: DOCKER_HOST
value: unix:///var/run/docker.sock
- name: HTTP_PROXY
value: "http://d601-provider-egress-proxy.unidesk.svc.cluster.local:18789"
- name: HTTPS_PROXY
value: "http://d601-provider-egress-proxy.unidesk.svc.cluster.local:18789"
- name: ALL_PROXY
value: "http://d601-provider-egress-proxy.unidesk.svc.cluster.local:18789"
- name: NO_PROXY
value: "localhost,127.0.0.1,::1,host.docker.internal,d601-provider-egress-proxy,d601-provider-egress-proxy.unidesk,d601-provider-egress-proxy.unidesk.svc,d601-provider-egress-proxy.unidesk.svc.cluster.local"
- name: http_proxy
value: "http://d601-provider-egress-proxy.unidesk.svc.cluster.local:18789"
- name: https_proxy
value: "http://d601-provider-egress-proxy.unidesk.svc.cluster.local:18789"
- name: all_proxy
value: "http://d601-provider-egress-proxy.unidesk.svc.cluster.local:18789"
- name: no_proxy
value: "localhost,127.0.0.1,::1,host.docker.internal,d601-provider-egress-proxy,d601-provider-egress-proxy.unidesk,d601-provider-egress-proxy.unidesk.svc,d601-provider-egress-proxy.unidesk.svc.cluster.local"
volumeMounts:
- name: docker-sock
mountPath: /var/run/docker.sock
script: |
#!/usr/bin/env bash
set -euo pipefail
commit="$(cat "$(workspaces.source.path)/user-service-artifact-commit.txt")"
service_id="$(cat "$(workspaces.source.path)/user-service-artifact-service-id.txt")"
dockerfile="$(cat "$(workspaces.source.path)/user-service-artifact-dockerfile.txt")"
registry="$(params.registry)"
test "$registry" = "127.0.0.1:5000" || { echo "user_service_artifact_registry_must_be_d601_loopback=$registry" >&2; exit 2; }
case "$commit" in
[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]) ;;
*) echo "user_service_artifact_commit_invalid=$commit" >&2; exit 2 ;;
esac
local_image="unidesk/$service_id:$commit"
repository="$registry/unidesk/$service_id"
registry_image="$repository:$commit"
command -v docker
docker version >/dev/null
docker run --rm --network host rancher/mirrored-library-busybox:1.36.1 wget -q -O- "http://$registry/v2/" >/dev/null
DOCKER_BUILDKIT=0 docker build \
--network host \
--build-arg HTTP_PROXY=http://127.0.0.1:18789 \
--build-arg HTTPS_PROXY=http://127.0.0.1:18789 \
--build-arg ALL_PROXY=http://127.0.0.1:18789 \
--build-arg NO_PROXY=localhost,127.0.0.1,::1,host.docker.internal \
--label "unidesk.ai/service-id=$service_id" \
--label "unidesk.ai/source-repo=$(params.repo-url)" \
--label "unidesk.ai/source-commit=$commit" \
--label "unidesk.ai/dockerfile=$dockerfile" \
-t "$local_image" \
-t "$registry_image" \
-f "$dockerfile" \
.
actual_service="$(docker image inspect "$registry_image" --format '{{ index .Config.Labels "unidesk.ai/service-id" }}')"
actual_commit="$(docker image inspect "$registry_image" --format '{{ index .Config.Labels "unidesk.ai/source-commit" }}')"
test "$actual_service" = "$service_id"
test "$actual_commit" = "$commit"
docker push "$registry_image"
docker pull "$registry_image" >/dev/null
repo_digests="$(docker image inspect "$registry_image" --format '{{json .RepoDigests}}')"
digest="$(docker image inspect "$registry_image" --format '{{range .RepoDigests}}{{println .}}{{end}}' | awk -F@ -v repo="$repository" '$1 == repo { print $2; exit }')"
test -n "$digest"
printf 'user_service_artifact_service_id=%s\nuser_service_artifact_image=%s\nuser_service_artifact_repository=%s\nuser_service_artifact_tag=%s\nuser_service_artifact_digest=%s\nuser_service_artifact_digest_ref=%s@%s\nuser_service_artifact_source_commit=%s\nuser_service_artifact_source_repo=%s\nuser_service_artifact_dockerfile=%s\nuser_service_artifact_registry=%s\nuser_service_artifact_repo_digests=%s\n' "$service_id" "$registry_image" "$repository" "$commit" "$digest" "$repository" "$digest" "$commit" "$(params.repo-url)" "$dockerfile" "$registry" "$repo_digests"
---
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: unidesk-user-service-artifact-publish
namespace: unidesk-ci
labels:
app.kubernetes.io/name: unidesk-ci
app.kubernetes.io/component: user-service-artifact
app.kubernetes.io/part-of: unidesk
spec:
params:
- name: repo-url
type: string
default: https://github.com/pikasTech/unidesk
- name: revision
type: string
- name: service-id
type: string
- name: dockerfile
type: string
- name: app-image
type: string
default: unidesk-code-queue:dev
- name: registry
type: string
default: 127.0.0.1:5000
- name: source-host-path
type: string
workspaces:
- name: shared-workspace
tasks:
- name: publish-user-service-artifact
taskRef:
name: unidesk-user-service-artifact-publish
params:
- name: repo-url
value: "$(params.repo-url)"
- name: revision
value: "$(params.revision)"
- name: service-id
value: "$(params.service-id)"
- name: dockerfile
value: "$(params.dockerfile)"
- name: app-image
value: "$(params.app-image)"
- name: registry
value: "$(params.registry)"
- name: source-host-path
value: "$(params.source-host-path)"
workspaces:
- name: source
workspace: shared-workspace
---
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: unidesk-code-queue-read-perf
namespace: unidesk-ci