Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package werf for openSUSE:Factory checked in at 2026-05-13 17:21:48 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/werf (Old) and /work/SRC/openSUSE:Factory/.werf.new.1966 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "werf" Wed May 13 17:21:48 2026 rev:72 rq:1352922 version:2.68.0 Changes: -------- --- /work/SRC/openSUSE:Factory/werf/werf.changes 2026-04-22 17:00:45.314875941 +0200 +++ /work/SRC/openSUSE:Factory/.werf.new.1966/werf.changes 2026-05-13 17:23:44.722259863 +0200 @@ -1,0 +2,14 @@ +Wed May 13 04:50:46 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 2.68.0: + * Features + - deploy: adopt chart ts init for werf (#7489) (63542e2) + * Bug Fixes + - compose: show docker compose config error instead of bare + exit code (6cc27d8) + - init docker config in InitCommonComponents when docker + registry is requested (#7488) (76ca703) + - propagate --docker-config to image pulling in bundle copy + (#7448) (c02babe) + +------------------------------------------------------------------- Old: ---- werf-2.67.2.obscpio New: ---- werf-2.68.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ werf.spec ++++++ --- /var/tmp/diff_new_pack.OxZOmU/_old 2026-05-13 17:23:46.022313796 +0200 +++ /var/tmp/diff_new_pack.OxZOmU/_new 2026-05-13 17:23:46.034314294 +0200 @@ -17,7 +17,7 @@ Name: werf -Version: 2.67.2 +Version: 2.68.0 Release: 0 Summary: CLI for the Werf CI/CD system License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.OxZOmU/_old 2026-05-13 17:23:46.110317447 +0200 +++ /var/tmp/diff_new_pack.OxZOmU/_new 2026-05-13 17:23:46.118317778 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/werf/werf</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v2.67.2</param> + <param name="revision">v2.68.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.OxZOmU/_old 2026-05-13 17:23:46.198321097 +0200 +++ /var/tmp/diff_new_pack.OxZOmU/_new 2026-05-13 17:23:46.230322425 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/werf/werf</param> - <param name="changesrevision">d8dc46d511d9b688016ca74fc34c254c628efba2</param></service></servicedata> + <param name="changesrevision">32fdbc60570bbd34b916e28f6ec61d33e5cd72d4</param></service></servicedata> (No newline at EOF) ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/werf/vendor.tar.gz /work/SRC/openSUSE:Factory/.werf.new.1966/vendor.tar.gz differ: char 31, line 1 ++++++ werf-2.67.2.obscpio -> werf-2.68.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/CHANGELOG.md new/werf-2.68.0/CHANGELOG.md --- old/werf-2.67.2/CHANGELOG.md 2026-04-21 14:30:19.000000000 +0200 +++ new/werf-2.68.0/CHANGELOG.md 2026-04-23 17:45:53.000000000 +0200 @@ -1,5 +1,19 @@ # Changelog +## [2.68.0](https://github.com/werf/werf/compare/v2.67.2...v2.68.0) (2026-04-22) + + +### Features + +* **deploy:** adopt `chart ts init` for werf ([#7489](https://github.com/werf/werf/issues/7489)) ([63542e2](https://github.com/werf/werf/commit/63542e2ef392885b8d706ae8e42061fda71bd086)) + + +### Bug Fixes + +* **compose:** show docker compose config error instead of bare exit code ([6cc27d8](https://github.com/werf/werf/commit/6cc27d81cad9266b37053ac35c9f73612ec0d904)) +* init docker config in InitCommonComponents when docker registry is requested ([#7488](https://github.com/werf/werf/issues/7488)) ([76ca703](https://github.com/werf/werf/commit/76ca703c53611a0a9612e8f5fff98ced20fb4b67)) +* propagate --docker-config to image pulling in bundle copy ([#7448](https://github.com/werf/werf/issues/7448)) ([c02babe](https://github.com/werf/werf/commit/c02babecf9b7e768edf18ca71b6eaabd7a87c37f)) + ## [2.67.2](https://github.com/werf/werf/compare/v2.67.1...v2.67.2) (2026-04-21) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/cmd/werf/common/components_manager.go new/werf-2.68.0/cmd/werf/common/components_manager.go --- old/werf-2.67.2/cmd/werf/common/components_manager.go 2026-04-21 14:30:19.000000000 +0200 +++ new/werf-2.68.0/cmd/werf/common/components_manager.go 2026-04-23 17:45:53.000000000 +0200 @@ -7,6 +7,7 @@ "github.com/werf/logboek" "github.com/werf/werf/v2/pkg/buildah" "github.com/werf/werf/v2/pkg/container_backend" + "github.com/werf/werf/v2/pkg/docker" "github.com/werf/werf/v2/pkg/git_repo" "github.com/werf/werf/v2/pkg/git_repo/gitdata" "github.com/werf/werf/v2/pkg/image" @@ -82,6 +83,14 @@ cmanager.buildahMode = resolvedBuildahMode } + // Set DOCKER_CONFIG early so that authn.DefaultKeychain (used by go-containerregistry) + // picks up custom credentials even when the full container backend is not initialized. + if opts.InitDockerRegistry || opts.InitProcessContainerBackend { + if err := docker.InitDockerConfig(docker.InitOptions{DockerConfigDir: *opts.Cmd.DockerConfig}); err != nil { + return nil, ctx, fmt.Errorf("init docker config: %w", err) + } + } + if opts.InitProcessContainerBackend && resolvedBuildahMode == buildah.ModeDisabled { newCtx, err := InitProcessDocker(ctx, opts.Cmd) if err != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/cmd/werf/common/container_backend.go new/werf-2.68.0/cmd/werf/common/container_backend.go --- old/werf-2.67.2/cmd/werf/common/container_backend.go 2026-04-21 14:30:19.000000000 +0200 +++ new/werf-2.68.0/cmd/werf/common/container_backend.go 2026-04-23 17:45:53.000000000 +0200 @@ -136,11 +136,6 @@ return nil, ctx, fmt.Errorf("unable to get buildah client: %w", err) } - err = docker.InitDockerConfig(docker.InitOptions{DockerConfigDir: *cmdData.DockerConfig}) - if err != nil { - return nil, ctx, fmt.Errorf("unable to set docker config for buildah client: %w", err) - } - return wrapContainerBackend(container_backend.NewBuildahBackend(b, container_backend.BuildahBackendOptions{TmpDir: filepath.Join(werf.GetServiceDir(), "tmp", "buildah")})), ctx, nil } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/cmd/werf/compose/main.go new/werf-2.68.0/cmd/werf/compose/main.go --- old/werf-2.67.2/cmd/werf/compose/main.go 2026-04-21 14:30:19.000000000 +0200 +++ new/werf-2.68.0/cmd/werf/compose/main.go 2026-04-23 17:45:53.000000000 +0200 @@ -14,7 +14,6 @@ "github.com/samber/lo" "github.com/spf13/cobra" - "github.com/werf/common-go/pkg/graceful" "github.com/werf/logboek" "github.com/werf/werf/v2/cmd/werf/common" "github.com/werf/werf/v2/pkg/build" @@ -112,7 +111,7 @@ err := cmd.Run() if err != nil { - graceful.Terminate(ctx, err, werfExec.ExitCode(err)) + werfExec.TerminateIfCanceled(ctx) var ee *exec.ExitError if errors.As(err, &ee) { return nil, fmt.Errorf("error running command %q: %w\n\nStdout:\n%s\nStderr:\n%s", cmd, err, stdout.String(), stderr.String()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/docs/_data/sidebars/documentation.yml new/werf-2.68.0/docs/_data/sidebars/documentation.yml --- old/werf-2.67.2/docs/_data/sidebars/documentation.yml 2026-04-21 14:30:19.000000000 +0200 +++ new/werf-2.68.0/docs/_data/sidebars/documentation.yml 2026-04-23 17:45:53.000000000 +0200 @@ -747,6 +747,9 @@ - title: Parametrize templates url: /usage/deploy/values.html + - title: TypeScript templates + url: /usage/deploy/typescript.html + - title: Debug templates url: /usage/deploy/debug_templates.html @@ -905,6 +908,9 @@ - title: Параметризация шаблонов url: /usage/deploy/values.html + - title: TypeScript-шаблоны + url: /usage/deploy/typescript.html + - title: Отладка шаблонов url: /usage/deploy/debug_templates.html diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/docs/_plugins/tree_file_viewer.rb new/werf-2.68.0/docs/_plugins/tree_file_viewer.rb --- old/werf-2.67.2/docs/_plugins/tree_file_viewer.rb 2026-04-21 14:30:19.000000000 +0200 +++ new/werf-2.68.0/docs/_plugins/tree_file_viewer.rb 2026-04-23 17:45:53.000000000 +0200 @@ -19,7 +19,8 @@ {} ], named: [ - { name: "default_file" } + { name: "default_file" }, + { name: "expanded" } ] }) @@ -28,6 +29,8 @@ @default_active_file_path = "/" + @named_params["default_file"].delete_prefix("/") end + @expanded = @named_params["expanded"] == "true" + @static_files_root = context.registers[:site].config['source'] @tree_root = Pathname.new(File.join(@static_files_root, @rel_tree_root)) @@ -90,8 +93,8 @@ unless is_tree_root_level result += %Q( -<div class="folder__wrap #{root_depth > tree_root_depth + 1 ? "hidden child" : nil}" data-depth="#{root_depth - tree_root_depth}"> -<div class="folder"> +<div class="folder__wrap #{@expanded ? "child" : (root_depth > tree_root_depth + 1 ? "hidden child" : nil)}" data-depth="#{root_depth - tree_root_depth}"> +<div class="folder"#{@expanded ? " style=\"padding-left: #{(root_depth - tree_root_depth) * 15}px;\"" : ""}> <span class="folder-icon"></span> <span class="folder-name">#{root.basename}</span> </div> @@ -108,7 +111,7 @@ end result += %Q( -<div class="file__wrap #{is_file_active(file, index) ? "active" : nil} #{is_tree_root_level ? nil : "hidden child"}"> +<div class="file__wrap #{is_file_active(file, index) ? "active" : nil} #{is_tree_root_level ? nil : (@expanded ? "child" : "hidden child")}"#{(@expanded && !is_tree_root_level) ? " style=\"padding-left: #{(root_depth - tree_root_depth + 1) * 15}px;\"" : ""}> <span class="file-icon"></span> <div class="file-name" data-file-name="#{file.relative_path_from(@static_files_root).to_s}">#{file.basename}</div> </div> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/docs/examples/ts/example-chart/Chart.yaml new/werf-2.68.0/docs/examples/ts/example-chart/Chart.yaml --- old/werf-2.67.2/docs/examples/ts/example-chart/Chart.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/werf-2.68.0/docs/examples/ts/example-chart/Chart.yaml 2026-04-23 17:45:53.000000000 +0200 @@ -0,0 +1,3 @@ +apiVersion: v2 +name: ts-chart-example +version: 0.1.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/docs/examples/ts/example-chart/ts/deno.json new/werf-2.68.0/docs/examples/ts/example-chart/ts/deno.json --- old/werf-2.67.2/docs/examples/ts/example-chart/ts/deno.json 1970-01-01 01:00:00.000000000 +0100 +++ new/werf-2.68.0/docs/examples/ts/example-chart/ts/deno.json 2026-04-23 17:45:53.000000000 +0200 @@ -0,0 +1,19 @@ +{ + "tasks": { + "build": { + "description": "Run deno build", + "command": "deno bundle --output=dist/bundle.js src/index.ts" + }, + "dev": { + "description": "Run in development mode", + "command": "deno run --no-remote --deny-read --deny-write --deny-net --deny-env --deny-run --allow-read=input.example.yaml src/index.ts --input-file ./input.example.yaml" + }, + "start": { + "description": "Run the bundled dist/bundle.js", + "command": "deno run --no-remote --deny-read --deny-write --deny-net --deny-env --deny-run --allow-read=input.example.yaml dist/bundle.js --input-file ./input.example.yaml" + } + }, + "imports": { + "@nelm/chart-ts-sdk": "npm:@nelm/chart-ts-sdk@^0.1.5" + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/docs/examples/ts/example-chart/ts/deno.lock new/werf-2.68.0/docs/examples/ts/example-chart/ts/deno.lock --- old/werf-2.67.2/docs/examples/ts/example-chart/ts/deno.lock 1970-01-01 01:00:00.000000000 +0100 +++ new/werf-2.68.0/docs/examples/ts/example-chart/ts/deno.lock 2026-04-23 17:45:53.000000000 +0200 @@ -0,0 +1,23 @@ +{ + "version": "5", + "specifiers": { + "npm:@nelm/chart-ts-sdk@~0.1.4": "0.1.4" + }, + "npm": { + "@jsr/[email protected]": { + "integrity": "sha512-pz/BisWZWH16JvLJBwrNwUwfIsRnf9qniMrmI6Z3vIAcVRVFcA5+i4o6z6QqsMKqFzjlB66WZE+jSyujT/RvRg==", + "tarball": "https://npm.jsr.io/~/11/@jsr/std__yaml/1.0.12.tgz" + }, + "@nelm/[email protected]": { + "integrity": "sha512-NCeflvAuZQxzmGZGpm0lP3Uy5d2xYRq8TKW0MWTKyknnZAe2tSv9+2uCZVA46oIxdm9FsBKocmCHEfqyOwe4lQ==", + "dependencies": [ + "@std/yaml@npm:@jsr/[email protected]" + ] + } + }, + "workspace": { + "dependencies": [ + "npm:@nelm/chart-ts-sdk@~0.1.4" + ] + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/docs/examples/ts/example-chart/ts/input.example.yaml new/werf-2.68.0/docs/examples/ts/example-chart/ts/input.example.yaml --- old/werf-2.67.2/docs/examples/ts/example-chart/ts/input.example.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/werf-2.68.0/docs/examples/ts/example-chart/ts/input.example.yaml 2026-04-23 17:45:53.000000000 +0200 @@ -0,0 +1,76 @@ +Capabilities: + APIVersions: + - v1 + HelmVersion: + go_version: go1.25.0 + version: v3.20 + KubeVersion: + Major: "1" + Minor: "35" + Version: v1.35.0 +Chart: + APIVersion: v2 + Annotations: + anno: value + AppVersion: 1.0.0 + Condition: ts-chart-example.enabled + Description: ts-chart-example description + Home: https://example.org/home + Icon: https://example.org/icon + Keywords: + - ts-chart-example + Maintainers: + - Email: [email protected] + Name: john + URL: https://example.com/john + Name: ts-chart-example + Sources: + - https://example.org/ts-chart-example + Tags: ts-chart-example + Type: application + Version: 0.1.0 +Files: + myfile: "content" +Release: + IsInstall: false + IsUpgrade: true + Name: ts-chart-example + Namespace: ts-chart-example + Revision: 2 + Service: Helm +Values: + global: + werf: + name: myapp + version: v2.35.0 + repo: example.org/mycompany/myapp + env: production + images: + app: + registry: example.org + namespace: mycompany + name: myapp + tag: a1b2c3d4-1234567890 + digest: "sha256:abcdef1234567890" + tag_digest: "a1b2c3d4-1234567890@sha256:abcdef1234567890" + image: example.org/mycompany/myapp + repository: mycompany/myapp + ref: "example.org/mycompany/myapp:a1b2c3d4-1234567890@sha256:abcdef1234567890" + ref_tag: "example.org/mycompany/myapp:a1b2c3d4-1234567890" + repository_ref: "mycompany/myapp:a1b2c3d4-1234567890@sha256:abcdef1234567890" + repository_tag: "mycompany/myapp:a1b2c3d4-1234567890" + name_ref: "myapp:a1b2c3d4-1234567890@sha256:abcdef1234567890" + name_tag: "myapp:a1b2c3d4-1234567890" + commit: + date: + human: "2025-01-15 12:00:00 +0000" + unix: 1736942400 + hash: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2 + image: + repository: nginx + tag: latest + replicaCount: 1 + service: + enabled: true + port: 80 + type: ClusterIP diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/docs/examples/ts/example-chart/ts/src/deployment.ts new/werf-2.68.0/docs/examples/ts/example-chart/ts/src/deployment.ts --- old/werf-2.67.2/docs/examples/ts/example-chart/ts/src/deployment.ts 1970-01-01 01:00:00.000000000 +0100 +++ new/werf-2.68.0/docs/examples/ts/example-chart/ts/src/deployment.ts 2026-04-23 17:45:53.000000000 +0200 @@ -0,0 +1,40 @@ +import type { WerfRenderContext } from '@nelm/chart-ts-sdk'; +import { getFullname, getLabels, getSelectorLabels } from './helpers.ts'; + +export function newDeployment($: WerfRenderContext): object { + const name = getFullname($); + + return { + apiVersion: 'apps/v1', + kind: 'Deployment', + metadata: { + name, + labels: getLabels($), + }, + spec: { + replicas: $.Values.replicaCount ?? 1, + selector: { + matchLabels: getSelectorLabels($), + }, + template: { + metadata: { + labels: getSelectorLabels($), + }, + spec: { + containers: [ + { + name: name, + image: ($.Values.image?.repository ?? 'nginx') + ':' + ($.Values.image?.tag ?? 'latest'), + ports: [ + { + name: 'http', + containerPort: $.Values.service?.port ?? 80, + }, + ], + }, + ], + }, + }, + }, + }; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/docs/examples/ts/example-chart/ts/src/helpers.ts new/werf-2.68.0/docs/examples/ts/example-chart/ts/src/helpers.ts --- old/werf-2.67.2/docs/examples/ts/example-chart/ts/src/helpers.ts 1970-01-01 01:00:00.000000000 +0100 +++ new/werf-2.68.0/docs/examples/ts/example-chart/ts/src/helpers.ts 2026-04-23 17:45:53.000000000 +0200 @@ -0,0 +1,41 @@ +import type { WerfRenderContext } from '@nelm/chart-ts-sdk'; + +/** + * Truncate string to max length, removing trailing hyphens. + */ +export function trunc(str: string, max: number): string { + if (str.length <= max) return str; + return str.slice(0, max).replace(/-+$/, ''); +} + +/** + * Get the fully qualified app name. + * Truncated at 63 chars (DNS naming spec limit). + */ +export function getFullname($: WerfRenderContext): string { + if ($.Values.fullnameOverride) { + return trunc($.Values.fullnameOverride, 63); + } + + const chartName = $.Values.nameOverride || $.Chart.Name; + + if ($.Release.Name.includes(chartName)) { + return trunc($.Release.Name, 63); + } + + return trunc(`${$.Release.Name}-${chartName}`, 63); +} + +export function getLabels($: WerfRenderContext): Record<string, string> { + return { + 'app.kubernetes.io/name': $.Chart.Name, + 'app.kubernetes.io/instance': $.Release.Name, + }; +} + +export function getSelectorLabels($: WerfRenderContext): Record<string, string> { + return { + 'app.kubernetes.io/name': $.Chart.Name, + 'app.kubernetes.io/instance': $.Release.Name, + }; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/docs/examples/ts/example-chart/ts/src/index.ts new/werf-2.68.0/docs/examples/ts/example-chart/ts/src/index.ts --- old/werf-2.67.2/docs/examples/ts/example-chart/ts/src/index.ts 1970-01-01 01:00:00.000000000 +0100 +++ new/werf-2.68.0/docs/examples/ts/example-chart/ts/src/index.ts 2026-04-23 17:45:53.000000000 +0200 @@ -0,0 +1,17 @@ +import { WerfRenderContext, RenderResult, render } from '@nelm/chart-ts-sdk'; +import { newDeployment } from './deployment.ts'; +import { newService } from './service.ts'; + +function generate($: WerfRenderContext): RenderResult { + const manifests: object[] = []; + + manifests.push(newDeployment($)); + + if ($.Values.service?.enabled !== false) { + manifests.push(newService($)); + } + + return { manifests }; +} + +await render(generate); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/docs/examples/ts/example-chart/ts/src/service.ts new/werf-2.68.0/docs/examples/ts/example-chart/ts/src/service.ts --- old/werf-2.67.2/docs/examples/ts/example-chart/ts/src/service.ts 1970-01-01 01:00:00.000000000 +0100 +++ new/werf-2.68.0/docs/examples/ts/example-chart/ts/src/service.ts 2026-04-23 17:45:53.000000000 +0200 @@ -0,0 +1,23 @@ +import type { WerfRenderContext } from '@nelm/chart-ts-sdk'; +import { getFullname, getLabels, getSelectorLabels } from './helpers.ts'; + +export function newService($: WerfRenderContext): object { + return { + apiVersion: 'v1', + kind: 'Service', + metadata: { + name: getFullname($), + labels: getLabels($), + }, + spec: { + type: $.Values.service?.type ?? 'ClusterIP', + ports: [ + { + port: $.Values.service?.port ?? 80, + targetPort: 'http', + }, + ], + selector: getSelectorLabels($), + }, + }; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/docs/examples/ts/example-chart/values.yaml new/werf-2.68.0/docs/examples/ts/example-chart/values.yaml --- old/werf-2.67.2/docs/examples/ts/example-chart/values.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/werf-2.68.0/docs/examples/ts/example-chart/values.yaml 2026-04-23 17:45:53.000000000 +0200 @@ -0,0 +1,10 @@ +replicaCount: 1 + +image: + repository: nginx + tag: latest + +service: + enabled: true + type: ClusterIP + port: 80 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/docs/pages_en/usage/deploy/typescript.md new/werf-2.68.0/docs/pages_en/usage/deploy/typescript.md --- old/werf-2.67.2/docs/pages_en/usage/deploy/typescript.md 1970-01-01 01:00:00.000000000 +0100 +++ new/werf-2.68.0/docs/pages_en/usage/deploy/typescript.md 2026-04-23 17:45:53.000000000 +0200 @@ -0,0 +1,179 @@ +--- +title: TypeScript templates +permalink: usage/deploy/typescript.html +--- + +> **Note**: TypeScript templates are an experimental feature. To enable it, set the environment variable `NELM_FEAT_TYPESCRIPT=true`. + +## Overview + +In addition to [Helm templates]({{ "/usage/deploy/templates.html" | true_relative_url }}), werf can generate Kubernetes manifests with TypeScript. Helm templates and TypeScript templates can coexist in the same chart — resulting manifests are merged into a single multi-doc YAML document. + +TypeScript templates work out of the box: deploying a chart that contains a `ts/` directory requires no additional tools or configuration — werf automatically downloads the Deno TypeScript runtime and renders the TypeScript templates. + +### Why TypeScript + +Helm's templating language works well for simple cases but becomes hard to maintain as chart complexity grows: primitive language with lots of gotchas, limited library, performance issues, debug difficulties, poor IDE/editor support and so on. TypeScript in werf solves these problems without complicating the deployment workflow. + +### Features + +- IDE support — full autocompletion, type checking, go-to-definition, and refactoring in any editor with Deno/TypeScript support (VS Code, JetBrains, Neovim, etc.). +- Standard syntax — proper functions, loops, and conditionals instead of awkward template engine constructs. +- Pure TypeScript — `ts` directory is a regular Deno TypeScript project, and can be render without werf, with just [Deno TypeScript runtime](https://deno.com/). +- Large ecosystem — TypeScript is one of the most popular languages with extensive documentation, community resources, and tooling. +- Almost any third-party TypeScript/JavaScript library can be used, for example [kubernetes-models](https://github.com/tommy351/kubernetes-models-ts), [cdk8s](https://cdk8s.io/) or any other library from npm/Deno ecosystems. +- Testing — test your code using common TypeScript libraries and tooling. +- No extra host requirements — to deploy a TS chart all you need is werf. No need to install Node, Deno, npm, npm modules or anything else. We handle all of this for you, just do a `werf converge`. +- Isolated environments — npm modules are bundled into the chart by default, and the Deno runtime can be provided by the host system, so no network calls will be done during the deployment, except to the Kubernetes itself. +- Security — code runs in an isolated Deno sandbox with no access to the network, environment variables, or process execution. Filesystem access is limited to reading chart files. + +## Quick start + +Initialize TypeScript files in an existing chart: + +```shell +werf chart ts init +``` + +It will bootstrap the `.helm/ts/` directory, which contains a TypeScript project skeleton and a few files with sample resources. Try modifying `ts/src/deployment.ts` — for example, change the number of replicas — then check the result: + +```shell +werf render --dev +``` + +To deploy: + +```shell +werf converge --dev +``` + +## Chart structure + +{% tree_file_viewer 'examples/ts/example-chart' default_file='ts/src/index.ts' expanded=true %} + +## Developing a chart with TypeScript templates + +Install [Deno](https://docs.deno.com/runtime/getting_started/installation/) and follow the [setup guide](https://docs.deno.com/runtime/getting_started/setup_your_environment/) for your IDE/editor (VS Code, JetBrains, Neovim, etc.). + +Initialize TypeScript files in the chart if not already initialized: + +```shell +werf chart ts init +``` + +Open the `ts/` directory in your editor as a regular Deno/TypeScript project. You can work with it the same way you would with any TypeScript codebase — run scripts, write tests, use a debugger. Deno provides a rich set of tools for testing, linting, formatting, and more. See [Deno documentation](https://docs.deno.com/runtime/) for details. + +The codebase can be organized as you wish. The only requirement is that `ts/src/index.ts` exists, and `render` function from `@nelm/chart-ts-sdk` **must** be called. Otherwise, no TypeScript rendering happens. + +To debug templates rendering in an environment that is very close to how werf runs Deno, you can use `dev` task from `ts/deno.json`: + +```shell +cd .helm/ts +deno task dev +``` +TypeScript engine will call `render` function from `ts/src/index.ts` with the example context from `ts/input.example.yaml`. The resulting YAML will be printed to the console below the `Rendered manifests:` message. + +Install libraries using `deno add`, for example, try to install [kubernetes-models](https://github.com/tommy351/kubernetes-models-ts) — library for strict Kubernetes resource typing: + +```shell +deno add npm:kubernetes-models +``` + +The dependency is added to `deno.json` automatically. Now you can import and use it: + +```typescript +// .helm/ts/src/deployment.ts: +import { Deployment } from 'kubernetes-models/apps/v1'; + +export function newDeployment($: WerfRenderContext): object { + return new Deployment({ + metadata: { name: 'myapp' }, + spec: { + // other fields + }, + }).toJSON(); +} +``` + +To ensure that everything actually works with the werf deno runtime, run: +```shell +werf lint --dev +``` + +```shell +werf render --dev +``` + +## How to deploy a chart with TypeScript templates + +Simply run `werf converge`: the Deno binary will be downloaded into the cache and TypeScript templates will be rendered and deployed. + +> **Note**: According to [giterminism policies]({{ "/usage/project_configuration/giterminism.html" | true_relative_url }}), all changed files must be committed. + +## Deploying into isolated environments + +For the isolated environments, where Deno cannot be downloaded automatically: + +1. Publish the chart: + ```shell + werf bundle publish --repo example.org/mycompany/myapp + ``` + All npm modules will be minified and bundled inside, so that the chart can be installed even without Internet access. + +2. On the target machine with an isolated environment (no network access), download Deno manually and run: + ```shell + werf bundle apply --repo example.org/mycompany/myapp --deno-binary-path /usr/local/bin/deno + ``` + Where `/usr/local/bin/deno` is the path to the local Deno binary. TypeScript templates will be rendered and deployed using pre-compiled files from the chart bundle. + +## SDK API overview + +TypeScript engine uses the [@nelm/chart-ts-sdk](https://github.com/werf/nelm-chart-ts-sdk) package. + +### "render" and "generate" functions + +`index.ts` must call the `render()` function. The function `generate()`, which will actually generate the manifests, should be passed to the `render()` function as an argument, for example: + +```typescript +// .helm/ts/src/index.ts: +await render(generate); +``` + +### "WerfRenderContext" object + +The `generate` function receives the root context in the `$` variable of type `WerfRenderContext` — the same context as in Helm templates: + +| Field | Type | Description | +|-------|------|-------------| +| `$.Values` | `WerfServiceValues` | Chart parameters + service values at `$.Values.global.werf` | +| `$.Release` | `Release` | Release information | +| `$.Chart` | `ChartMetadata` | Metadata from Chart.yaml | +| `$.Capabilities` | `Capabilities` | Cluster capabilities (API versions, Kubernetes version) | +| `$.Files` | `Record<string, Uint8Array>` | Raw chart files (except `templates/` and `ts/`) | + +See the example context in `ts/input.example.yaml`. For details on parameters and how they are constructed, see [Parametrize templates]({{ "/usage/deploy/values.html" | true_relative_url }}). + +### "RenderResult" object + +The `generate` function returns `RenderResult` — an object with a `manifests` array. Each element is a plain JavaScript object representing a Kubernetes resource. Example output: + +```json +{ + "manifests": [ + { + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { "name": "myapp" }, + "spec": { "..." } + }, + { + "apiVersion": "v1", + "kind": "Service", + "metadata": { "name": "myapp" }, + "spec": { "..." } + } + ] +} +``` + +Each object is serialized to YAML and included in the final rendered output. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/docs/pages_ru/usage/deploy/typescript.md new/werf-2.68.0/docs/pages_ru/usage/deploy/typescript.md --- old/werf-2.67.2/docs/pages_ru/usage/deploy/typescript.md 1970-01-01 01:00:00.000000000 +0100 +++ new/werf-2.68.0/docs/pages_ru/usage/deploy/typescript.md 2026-04-23 17:45:53.000000000 +0200 @@ -0,0 +1,179 @@ +--- +title: TypeScript-шаблоны +permalink: usage/deploy/typescript.html +--- + +> **Обратите внимание**: TypeScript-шаблоны — экспериментальная функция. Для включения установите переменную окружения `NELM_FEAT_TYPESCRIPT=true`. + +## Обзор + +Помимо [Helm-шаблонов]({{ "/usage/deploy/templates.html" | true_relative_url }}), werf поддерживает генерацию Kubernetes-манифестов с помощью TypeScript. Helm-шаблоны и TypeScript-шаблоны могут сосуществовать в одном чарте — полученные манифесты объединяются в единый мульти-документный YAML. + +TypeScript-шаблоны работают из коробки: развёртывание чарта с директорией `ts/` не требует дополнительных инструментов или настройки — werf автоматически скачивает рантайм Deno TypeScript и рендерит TypeScript-шаблоны. + +### Зачем TypeScript + +Язык шаблонов Helm хорошо работает для простых случаев, но с ростом сложности чарта становится сложным в поддержке: примитивный язык с большим количеством подводных камней, ограниченная стандартная библиотека, проблемы с производительностью, сложная отладка, слабая поддержка в IDE и редакторах. TypeScript в werf решает эти проблемы, не усложняя процесс развёртывания. + +### Возможности + +- Поддержка IDE — автокомплит, проверка типов, go-to-definition и рефакторинг в любом редакторе с поддержкой Deno/TypeScript (VS Code, JetBrains, Neovim и др.). +- Стандартный синтаксис — обычные функции, циклы и условия вместо неудобных конструкций шаблонизатора. +- Чистый TypeScript — директория `ts` является обычным Deno TypeScript-проектом и может рендериться без werf, с помощью одного лишь [рантайма Deno TypeScript](https://deno.com/). +- Большая экосистема — TypeScript один из самых популярных языков с обширной документацией, ресурсами сообщества и инструментарием. +- Возможность использовать практически любую стороннюю TypeScript/JavaScript-библиотеку, например [kubernetes-models](https://github.com/tommy351/kubernetes-models-ts), [cdk8s](https://cdk8s.io/) или любую другую из экосистем npm/Deno. +- Тестирование — тестируйте код с помощью привычных TypeScript-библиотек и инструментов. +- Никаких дополнительных требований к хосту — для развёртывания TypeScript-чарта достаточно только werf. Не нужно устанавливать Node, Deno, npm, модули npm или что-либо ещё. Мы берём это на себя — просто выполните `werf converge`. +- Изолированные окружения — модули npm по умолчанию включаются в бандл чарта, а рантайм Deno может предоставляться хостовой системой, так что во время развёртывания не будет сетевых обращений, кроме обращений к самому Kubernetes. +- Безопасность — код выполняется в изолированной песочнице Deno без доступа к сети, переменным окружения и запуску процессов. Доступ к файловой системе ограничен чтением файлов чарта. + +## Быстрый старт + +Инициализация TypeScript-файлов в существующем чарте: + +```shell +werf chart ts init +``` + +Команда создаст директорию `.helm/ts/` с готовым скелетом TypeScript-проекта и несколькими файлами с примерами ресурсов. Попробуйте отредактировать `ts/src/deployment.ts` — например, изменить количество реплик — и проверьте результат: + +```shell +werf render --dev +``` + +Для развёртывания: + +```shell +werf converge --dev +``` + +## Структура чарта + +{% tree_file_viewer 'examples/ts/example-chart' default_file='ts/src/index.ts' expanded=true %} + +## Разработка чарта с TypeScript-шаблонами + +Установите [Deno](https://docs.deno.com/runtime/getting_started/installation/) и следуйте [руководству по настройке](https://docs.deno.com/runtime/getting_started/setup_your_environment/) для вашей IDE или редактора (VS Code, JetBrains, Neovim и др.). + +Инициализируйте TypeScript-файлы в чарте, если они ещё не инициализированы: + +```shell +werf chart ts init +``` + +Откройте директорию `ts/` в редакторе как обычный Deno/TypeScript-проект. Работайте с ним так же, как с любой TypeScript-кодовой базой — запускайте скрипты, пишите тесты, используйте отладчик. Deno предоставляет богатый набор инструментов для тестирования, линтинга, форматирования и многого другого. Подробнее см. [документацию Deno](https://docs.deno.com/runtime/). + +Структуру кодовой базы можно организовать по своему усмотрению. Единственное требование — файл `ts/src/index.ts` должен существовать, и функция `render` из `@nelm/chart-ts-sdk` **обязательно** должна быть вызвана. Иначе рендеринг TypeScript не произойдёт. + +Для отладки рендеринга шаблонов в окружении, максимально близком к тому, как werf запускает Deno, используйте задачу `dev` из `ts/deno.json`: + +```shell +cd .helm/ts +deno task dev +``` +TypeScript-движок вызовет функцию `render` из `ts/src/index.ts` с примером контекста из `ts/input.example.yaml`. Полученный YAML будет выведен в консоль после сообщения `Rendered manifests:`. + +Устанавливайте библиотеки с помощью `deno add`, например попробуйте установить [kubernetes-models](https://github.com/tommy351/kubernetes-models-ts) — библиотеку для строгой типизации Kubernetes-ресурсов: + +```shell +deno add npm:kubernetes-models +``` + +Зависимость добавится в `deno.json` автоматически. Теперь можно импортировать и использовать её: + +```typescript +// .helm/ts/src/deployment.ts: +import { Deployment } from 'kubernetes-models/apps/v1'; + +export function newDeployment($: WerfRenderContext): object { + return new Deployment({ + metadata: { name: 'myapp' }, + spec: { + // other fields + }, + }).toJSON(); +} +``` + +Чтобы убедиться, что всё работает с рантаймом Deno из werf, выполните: +```shell +werf lint --dev +``` + +```shell +werf render --dev +``` + +## Как развернуть чарт с TypeScript-шаблонами + +Просто запустите `werf converge`: бинарный файл Deno будет скачан в кеш, TypeScript-шаблоны будут отрендерены и развёрнуты. + +> **Обратите внимание**: Согласно [политикам гиттерминизма]({{ "/usage/project_configuration/giterminism.html" | true_relative_url }}), все изменённые файлы должны быть закоммичены. + +## Развёртывание в изолированных окружениях + +Для изолированных окружений, где Deno не может быть скачан автоматически: + +1. Опубликуйте чарт: + ```shell + werf bundle publish --repo example.org/mycompany/myapp + ``` + Все модули npm будут минифицированы и включены в бандл, так что чарт можно установить даже без доступа к интернету. + +2. На целевой машине в изолированном окружении (без доступа к сети) скачайте Deno вручную и выполните: + ```shell + werf bundle apply --repo example.org/mycompany/myapp --deno-binary-path /usr/local/bin/deno + ``` + Где `/usr/local/bin/deno` — путь к локальному бинарному файлу Deno. TypeScript-шаблоны будут отрендерены и развёрнуты с использованием предварительно скомпилированных файлов из бандла чарта. + +## Обзор SDK API + +TypeScript-движок использует пакет [@nelm/chart-ts-sdk](https://github.com/werf/nelm-chart-ts-sdk). + +### Функции "render" и "generate" + +`index.ts` обязан вызвать функцию `render()`. Функция `generate()`, которая непосредственно генерирует манифесты, должна быть передана в `render()` в качестве аргумента, например: + +```typescript +// .helm/ts/src/index.ts: +await render(generate); +``` + +### Объект "WerfRenderContext" + +Функция `generate` получает корневой контекст в переменной `$` типа `WerfRenderContext` — тот же контекст, что и в Helm-шаблонах: + +| Поле | Тип | Описание | +|------|-----|----------| +| `$.Values` | `WerfServiceValues` | Параметры чарта + сервисные значения в `$.Values.global.werf` | +| `$.Release` | `Release` | Информация о релизе | +| `$.Chart` | `ChartMetadata` | Метаданные из Chart.yaml | +| `$.Capabilities` | `Capabilities` | Возможности кластера (API-версии, версия Kubernetes) | +| `$.Files` | `Record<string, Uint8Array>` | Исходные файлы чарта (кроме `templates/` и `ts/`) | + +Пример контекста — в файле `ts/input.example.yaml`. Подробнее о параметрах и их формировании — в разделе [Параметризация шаблонов]({{ "/usage/deploy/values.html" | true_relative_url }}). + +### Объект "RenderResult" + +Функция `generate` возвращает `RenderResult` — объект с массивом `manifests`. Каждый элемент — обычный JavaScript-объект, представляющий Kubernetes-ресурс. Пример вывода: + +```json +{ + "manifests": [ + { + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { "name": "myapp" }, + "spec": { "..." } + }, + { + "apiVersion": "v1", + "kind": "Service", + "metadata": { "name": "myapp" }, + "spec": { "..." } + } + ] +} +``` + +Каждый объект сериализуется в YAML и включается в итоговый результат рендеринга. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/go.mod new/werf-2.68.0/go.mod --- old/werf-2.67.2/go.mod 2026-04-21 14:30:19.000000000 +0200 +++ new/werf-2.68.0/go.mod 2026-04-23 17:45:53.000000000 +0200 @@ -64,7 +64,7 @@ github.com/werf/kubedog-for-werf-helm v0.0.0-20241217155728-9d45c48b82b6 github.com/werf/lockgate v0.1.1 github.com/werf/logboek v0.6.1 - github.com/werf/nelm v1.23.3-0.20260413152602-4b9025485408 + github.com/werf/nelm v1.23.3-0.20260421131859-144b20397bc1 github.com/werf/nelm-for-werf-helm v0.0.0-20241217155925-b0e6734d1dbf go.opentelemetry.io/otel v1.24.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/go.sum new/werf-2.68.0/go.sum --- old/werf-2.67.2/go.sum 2026-04-21 14:30:19.000000000 +0200 +++ new/werf-2.68.0/go.sum 2026-04-23 17:45:53.000000000 +0200 @@ -1424,6 +1424,8 @@ github.com/werf/nelm v1.23.3-0.20260410174511-c9b4ee409c39/go.mod h1:Gy6XJ42rwJVA+UyB6ka9/DVFPzm+lh7lmcjLAZECdIs= github.com/werf/nelm v1.23.3-0.20260413152602-4b9025485408 h1:OH415PBFMNKk1p09p1fanT9P9LLjDUFcfK2NzuliL3M= github.com/werf/nelm v1.23.3-0.20260413152602-4b9025485408/go.mod h1:Gy6XJ42rwJVA+UyB6ka9/DVFPzm+lh7lmcjLAZECdIs= +github.com/werf/nelm v1.23.3-0.20260421131859-144b20397bc1 h1:Lsh9+Px89cfXa5U+WbBz2Z4pI5QYSkxZPmUDLxSPz0M= +github.com/werf/nelm v1.23.3-0.20260421131859-144b20397bc1/go.mod h1:Gy6XJ42rwJVA+UyB6ka9/DVFPzm+lh7lmcjLAZECdIs= github.com/werf/nelm-for-werf-helm v0.0.0-20241217155925-b0e6734d1dbf h1:K51qz209c1yJgKzPw8AeS72T21F/ACp0VI3RJvT4THA= github.com/werf/nelm-for-werf-helm v0.0.0-20241217155925-b0e6734d1dbf/go.mod h1:7RJXSGPKKPEvfPqrTwNA8jT7y52O0ebwhSbSn29ESMA= github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/werf-2.67.2/trdl_channels.yaml new/werf-2.68.0/trdl_channels.yaml --- old/werf-2.67.2/trdl_channels.yaml 2026-04-21 14:30:19.000000000 +0200 +++ new/werf-2.68.0/trdl_channels.yaml 2026-04-23 17:45:53.000000000 +0200 @@ -38,12 +38,12 @@ - name: "2" channels: - name: alpha - version: 2.67.1 + version: 2.67.2 - name: beta - version: 2.67.0 + version: 2.67.2 - name: ea - version: 2.67.0 + version: 2.67.2 - name: stable version: 2.65.4 - name: rock-solid - version: 2.64.0 + version: 2.65.4 ++++++ werf.obsinfo ++++++ --- /var/tmp/diff_new_pack.OxZOmU/_old 2026-05-13 17:23:50.170485865 +0200 +++ /var/tmp/diff_new_pack.OxZOmU/_new 2026-05-13 17:23:50.178486197 +0200 @@ -1,5 +1,5 @@ name: werf -version: 2.67.2 -mtime: 1776774619 -commit: d8dc46d511d9b688016ca74fc34c254c628efba2 +version: 2.68.0 +mtime: 1776959153 +commit: 32fdbc60570bbd34b916e28f6ec61d33e5cd72d4
