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-20 15:25:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/werf (Old)
 and      /work/SRC/openSUSE:Factory/.werf.new.1966 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "werf"

Wed May 20 15:25:27 2026 rev:73 rq:1354146 version:2.68.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/werf/werf.changes        2026-05-13 
17:23:44.722259863 +0200
+++ /work/SRC/openSUSE:Factory/.werf.new.1966/werf.changes      2026-05-20 
15:26:43.007567434 +0200
@@ -1,0 +2,24 @@
+Wed May 20 04:58:32 UTC 2026 - Johannes Kastl 
<[email protected]>
+
+- Update to version 2.68.1:
+  * Bug Fixes
+    - build, stapel, import: regenerate import checksums if it`s
+      empty (#7506) (eebb1df)
+    - build: non-local synchronization server requires --repo be
+      set (f078e04)
+    - build: resolve dependency image refs in FROM stage before
+      computing cache digest (#7492) (b42f0b1)
+    - build: show "default" in log network field when no explicit
+      network (c54a78d)
+    - build: use image tag instead of sha256 for docker run
+      (725a629)
+    - ci: trigger website production deploy after trdl channel
+      update (#7502) (310298c)
+    - deploy: retry on webhook unavailable errors (#7505) (1718543)
+    - host-cleanup: support nested cli command (ee5f78a)
+    - host-clenaup: apply WERF_SELF_INVOCATION_COMMAND in Detach
+      (faf5bf2)
+    - parallel: eliminate race between context timeout and
+      goroutine (ed67c0f)
+
+-------------------------------------------------------------------

Old:
----
  werf-2.68.0.obscpio

New:
----
  werf-2.68.1.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ werf.spec ++++++
--- /var/tmp/diff_new_pack.afEih5/_old  2026-05-20 15:26:44.031609630 +0200
+++ /var/tmp/diff_new_pack.afEih5/_new  2026-05-20 15:26:44.035609795 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           werf
-Version:        2.68.0
+Version:        2.68.1
 Release:        0
 Summary:        CLI for the Werf CI/CD system
 License:        Apache-2.0

++++++ _service ++++++
--- /var/tmp/diff_new_pack.afEih5/_old  2026-05-20 15:26:44.079611608 +0200
+++ /var/tmp/diff_new_pack.afEih5/_new  2026-05-20 15:26:44.083611773 +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.68.0</param>
+    <param name="revision">v2.68.1</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)</param>
     <param name="changesgenerate">enable</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.afEih5/_old  2026-05-20 15:26:44.107612762 +0200
+++ /var/tmp/diff_new_pack.afEih5/_new  2026-05-20 15:26:44.111612927 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param name="url">https://github.com/werf/werf</param>
-              <param 
name="changesrevision">32fdbc60570bbd34b916e28f6ec61d33e5cd72d4</param></service></servicedata>
+              <param 
name="changesrevision">508fb9aee29baca228674ba7a3d2d4fa1f5844d5</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.68.0.obscpio -> werf-2.68.1.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/CHANGELOG.md new/werf-2.68.1/CHANGELOG.md
--- old/werf-2.68.0/CHANGELOG.md        2026-04-23 17:45:53.000000000 +0200
+++ new/werf-2.68.1/CHANGELOG.md        2026-04-30 14:18:50.000000000 +0200
@@ -1,5 +1,21 @@
 # Changelog
 
+## [2.68.1](https://github.com/werf/werf/compare/v2.68.0...v2.68.1) 
(2026-04-30)
+
+
+### Bug Fixes
+
+* **buiild, stapel, import:** regenerate import checksums if it`s empty 
([#7506](https://github.com/werf/werf/issues/7506)) 
([eebb1df](https://github.com/werf/werf/commit/eebb1dfdd0ceab4ef7f274a89d122a44942fdffb))
+* **build:** non-local synchronization server requires --repo be set 
([f078e04](https://github.com/werf/werf/commit/f078e049261c35e2a4fced88a92a078205021806))
+* **build:** resolve dependency image refs in FROM stage before computing 
cache digest ([#7492](https://github.com/werf/werf/issues/7492)) 
([b42f0b1](https://github.com/werf/werf/commit/b42f0b120a46e7eeaf06f66339561ed486cc04c9))
+* **build:** show "default" in log network field when no explicit network 
([c54a78d](https://github.com/werf/werf/commit/c54a78da6c956455578d4c2a67064276498b0f68))
+* **build:** use image tag instead of sha256 for docker run 
([725a629](https://github.com/werf/werf/commit/725a62942d4fe57f8d88093d636d5f7be750ab5d))
+* **ci:** trigger website production deploy after trdl channel update 
([#7502](https://github.com/werf/werf/issues/7502)) 
([310298c](https://github.com/werf/werf/commit/310298c5ba2f7f1e88c49bd8c45c2eedb4986c2d))
+* **deploy:** retry on webhook unavailable errors 
([#7505](https://github.com/werf/werf/issues/7505)) 
([1718543](https://github.com/werf/werf/commit/171854373681fc3c98b1c381052281b026e71c12))
+* **host-cleanup:** support nested cli command 
([ee5f78a](https://github.com/werf/werf/commit/ee5f78a7b05cebc3b1334d0e885c1b1aa8aaffdd))
+* **host-clenaup:** apply WERF_SELF_INVOCATION_COMMAND in Detach 
([faf5bf2](https://github.com/werf/werf/commit/faf5bf2c6552b38cfe8881d334a862d636d08612))
+* **parallel:** eliminate race between context timeout and goroutine 
([ed67c0f](https://github.com/werf/werf/commit/ed67c0f7f988a3bcf489baad9d428850fa6d3326))
+
 ## [2.68.0](https://github.com/werf/werf/compare/v2.67.2...v2.68.0) 
(2026-04-22)
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/cmd/werf/common/synchronization.go 
new/werf-2.68.1/cmd/werf/common/synchronization.go
--- old/werf-2.68.0/cmd/werf/common/synchronization.go  2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/cmd/werf/common/synchronization.go  2026-04-30 
14:18:50.000000000 +0200
@@ -100,6 +100,9 @@
                ServerAddress: *cmdData.Synchronization,
                StagesStorage: stagesStorage,
        }
+       if params.ServerAddress != "" && !protocolIsLocal(params.ServerAddress) 
&& protocolIsLocal(params.StagesStorage.Address()) {
+               return nil, fmt.Errorf("--synchronization (or 
WERF_SYNCHRONIZATION) is set to %q but --repo (or WERF_REPO) is not specified: 
--repo is required when using a non-local synchronization server", 
params.ServerAddress)
+       }
 
        if params.ServerAddress == "" {
                return initDefault(ctx, params)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/docs/_data/sidebars/_documentation.yml 
new/werf-2.68.1/docs/_data/sidebars/_documentation.yml
--- old/werf-2.68.0/docs/_data/sidebars/_documentation.yml      2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/docs/_data/sidebars/_documentation.yml      2026-04-30 
14:18:50.000000000 +0200
@@ -78,6 +78,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
 
@@ -236,6 +239,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.68.0/docs/pages_en/usage/deploy/overview.md 
new/werf-2.68.1/docs/pages_en/usage/deploy/overview.md
--- old/werf-2.68.0/docs/pages_en/usage/deploy/overview.md      2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/docs/pages_en/usage/deploy/overview.md      2026-04-30 
14:18:50.000000000 +0200
@@ -14,7 +14,7 @@
 - arbitrary deployment order for any resources, not just hooks;
 - waiting for resources that are not part of the release to be created and 
ready;
 - using much more robust Server-Side Apply for resource updates instead of 
3-Way Merge;
-- `terraform plan`-like capabilities out of the box;
+- `terraform plan`-like capabilities with two-stage deployment support;
 - integrating building and deployment, and much more.
 
 werf strives to make working with Helm deployments easier, more convenient and 
flexible without breaking backward compatibility with Helm charts, Helm 
templates, and Helm releases.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/docs/pages_en/usage/deploy/planning.md 
new/werf-2.68.1/docs/pages_en/usage/deploy/planning.md
--- old/werf-2.68.0/docs/pages_en/usage/deploy/planning.md      2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/docs/pages_en/usage/deploy/planning.md      2026-04-30 
14:18:50.000000000 +0200
@@ -3,9 +3,9 @@
 permalink: usage/deploy/planning.html
 ---
 
-## Show expected changes in cluster before deployment
+## Review ongoing changes before deployment
 
-To see how the resources in the cluster will change during the next deployment 
run `werf plan` command before running `werf converge`:
+To see how the resources in the cluster will change during the next deployment 
run `werf plan`:
 
 ```shell
 $ werf plan --repo example.org/mycompany/myapp
@@ -35,16 +35,17 @@
 - update: 1 resource(s)
 ```
 
-Now run `werf converge` and see that this is exactly what happens:
+## Deploying with a two-stage workflow
 
-```shell
-$ werf converge --repo example.org/mycompany/myapp
-...
-
-┌ Completed operations
-│ Update resource: Deployment/myapp
-│ Create resource: ConfigMap/mycm
-└ Completed operations
+The planning feature is quite handy, but on its own, it does not guarantee 
that the exact same deployment plan will be used during a subsequent `werf 
converge`, as the cluster state may change after the `werf plan` run. To ensure 
that the exact planned changes will be applied, you can utilize a two-stage 
deployment workflow:
 
-Succeeded release "myapp" (namespace: "myapp")
+1. **Plan:** Generate, review, and save a plan artifact using the --save-plan 
flag:
+```
+werf plan --save-plan=plan.gz
 ```
+2. **Deploy:** Perform `werf converge` using the pre-generated reviewed plan:
+```
+werf converge --use-plan=plan.gz
+```
+
+The plan artifact is a gzip-compressed JSON file that can be reviewed with 
`werf plan --show-plan plan.gz` command. If you used `--secret-key` or 
`WERF_SECRET_KEY` environment variable during planning, the plan artifact will 
be encrypted.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/docs/pages_ru/usage/deploy/overview.md 
new/werf-2.68.1/docs/pages_ru/usage/deploy/overview.md
--- old/werf-2.68.0/docs/pages_ru/usage/deploy/overview.md      2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/docs/pages_ru/usage/deploy/overview.md      2026-04-30 
14:18:50.000000000 +0200
@@ -14,7 +14,7 @@
 - использование произвольного порядка развертывания для любых ресурсов, а не 
только для хуков;
 - ожидание создания и готовности ресурсов, не принадлежащих релизу;
 - использование более надежного метода Server-Side Apply для обновления 
ресурсов вместо 3-Way Merge;
-- возможности по типу `terraform plan`, доступные "из коробки";
+- возможности планирования, аналогичные `terraform plan`, с поддержкой 
двухстадийного деплоя;
 - интеграция сборки и развертывания и многое другое.
 
 werf стремится сделать работу с Helm-развертываниями более простой, удобной и 
гибкой, при этом не ломая обратную совместимость с Helm-чартами, Helm-шаблонами 
и Helm-релизами.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/docs/pages_ru/usage/deploy/planning.md 
new/werf-2.68.1/docs/pages_ru/usage/deploy/planning.md
--- old/werf-2.68.0/docs/pages_ru/usage/deploy/planning.md      2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/docs/pages_ru/usage/deploy/planning.md      2026-04-30 
14:18:50.000000000 +0200
@@ -3,9 +3,9 @@
 permalink: usage/deploy/planning.html
 ---
 
-## Показать ожидаемые изменения в кластере перед развертыванием
+## Показать запланированные изменения перед развертыванием
 
-Чтобы увидеть, как изменятся ресурсы в кластере во время следующего 
развертывания, выполните команду `werf plan` перед выполнением `werf converge`:
+Чтобы увидеть, как изменятся ресурсы в кластере во время следующего 
развертывания, выполните команду `werf plan`:
 
 ```shell
 $ werf plan --repo example.org/mycompany/myapp
@@ -35,16 +35,17 @@
 - update: 1 resource(s)
 ```
 
-Теперь выполните `werf converge` и убедитесь, что это именно то, что 
произойдет:
+## Выполнение деплоя в две стадии
 
-```shell
-$ werf converge --repo example.org/mycompany/myapp
-...
-
-┌ Completed operations
-│ Update resource: Deployment/myapp
-│ Create resource: ConfigMap/mycm
-└ Completed operations
+Функция планирования Werf весьма удобна, но сама по себе она не гарантирует, 
что при последующем выполнении `werf converge` будет использован тот же самый 
план развертывания, так как состояние кластера может измениться после запуска 
`werf plan`. Чтобы гарантировать применение именно запланированы изменений, вы 
можете выполнить деплой в две стации:
 
-Succeeded release "myapp" (namespace: "myapp")
+1. **Plan:** Сгенерируйте, проверьте и сохраните артефакт плана с помощью 
флага --save-plan:
+```
+werf plan --save-plan=plan.gz
 ```
+2. **Deploy:** Выполните `werf converge`, используя ранее созданный и 
проверенный план:
+```
+werf converge --use-plan=plan.gz
+```
+
+Артефакт плана представляет собой JSON-файл, сжатый с помощью gzip, который 
можно просмотреть командой `werf plan --show-plan plan.gz`. Если при 
планировании использовался флаг `--secret-key` или переменная окружения 
`$WERF_SECRET_KEY`, артефакт плана будет зашифрован.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/go.mod new/werf-2.68.1/go.mod
--- old/werf-2.68.0/go.mod      2026-04-23 17:45:53.000000000 +0200
+++ new/werf-2.68.1/go.mod      2026-04-30 14:18:50.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.20260421131859-144b20397bc1
+       github.com/werf/nelm v1.24.1-0.20260424100520-ccde5a15521e
        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.68.0/go.sum new/werf-2.68.1/go.sum
--- old/werf-2.68.0/go.sum      2026-04-23 17:45:53.000000000 +0200
+++ new/werf-2.68.1/go.sum      2026-04-30 14:18:50.000000000 +0200
@@ -1404,8 +1404,6 @@
 github.com/werf/3p-helm-for-werf-helm 
v0.0.0-20241217155820-089f92cd5c9d/go.mod 
h1:fozJ+C/Llp1e+jHxrJOZUu+D4QEw+laQK6W6RFqvTsg=
 github.com/werf/3p-oras v0.9.1-0.20240115121544-03962ecbd40a 
h1:PsU9szHZlIH+CjcuIuPXRLc5dsdoaFldvYjS6YHI7YQ=
 github.com/werf/3p-oras v0.9.1-0.20240115121544-03962ecbd40a/go.mod 
h1:XTePf8biMMCkqbuuWBZ24xOwo3hZej+BBM0uvd8aGqk=
-github.com/werf/common-go v0.0.0-20251113140850-a1a98e909e9b 
h1:58850oFrnw5Jy5YaB8QifXz75qpGotfx6qqZ9Q2my1A=
-github.com/werf/common-go v0.0.0-20251113140850-a1a98e909e9b/go.mod 
h1:MXS0JR9zut+oR9oEM8PEkdXXoEbKDILTmWopt0z1eZs=
 github.com/werf/common-go v0.0.0-20260414103517-0558f83edc6d 
h1:WFZpNiMTDOu6nRCExCgSA0X8boiZCBn2+QSXoDR82oE=
 github.com/werf/common-go v0.0.0-20260414103517-0558f83edc6d/go.mod 
h1:MXS0JR9zut+oR9oEM8PEkdXXoEbKDILTmWopt0z1eZs=
 github.com/werf/copy-recurse v0.2.7 
h1:3FTOarbJ9uhFLi75oeUCioK9zxZwuV7o28kuUBPDZPM=
@@ -1418,14 +1416,8 @@
 github.com/werf/lockgate v0.1.1/go.mod 
h1:0yIFSLq9ausy6ejNxF5uUBf/Ib6daMAfXuCaTMZJzIE=
 github.com/werf/logboek v0.6.1 h1:oEe6FkmlKg0z0n80oZjLplj6sXcBeLleCkjfOOZEL2g=
 github.com/werf/logboek v0.6.1/go.mod 
h1:Gez5J4bxekyr6MxTmIJyId1F61rpO+0/V4vjCIEIZmk=
-github.com/werf/nelm v1.23.3-0.20260407195144-942d8aad2341 
h1:k/rx0R2Or9Y7ymkw003/A1dioXWy41Eg4tXi0gBsMTE=
-github.com/werf/nelm v1.23.3-0.20260407195144-942d8aad2341/go.mod 
h1:Gy6XJ42rwJVA+UyB6ka9/DVFPzm+lh7lmcjLAZECdIs=
-github.com/werf/nelm v1.23.3-0.20260410174511-c9b4ee409c39 
h1:5dxs3OEskHbdryRV2RVozplNSjIsyyaW0jko/i2nLvk=
-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 v1.24.1-0.20260424100520-ccde5a15521e 
h1:RXJnWNZ/ErHQuAGPjMed4lRmkWTY0gUuxInukYi3LUY=
+github.com/werf/nelm v1.24.1-0.20260424100520-ccde5a15521e/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.68.0/pkg/build/build_phase.go 
new/werf-2.68.1/pkg/build/build_phase.go
--- old/werf-2.68.0/pkg/build/build_phase.go    2026-04-23 17:45:53.000000000 
+0200
+++ new/werf-2.68.1/pkg/build/build_phase.go    2026-04-30 14:18:50.000000000 
+0200
@@ -598,6 +598,9 @@
                        network = 
img.StapelImageConfig.ImageBaseConfig().Network
                }
        }
+       if network == "" {
+               network = "default"
+       }
        return network
 }
 
@@ -633,6 +636,14 @@
                }
        }
 
+       if img.IsDockerfileImage && img.DockerfileImageConfig.Staged {
+               if werf.GetStagedDockerfileVersion() == werf.StagedDockerfileV2 
{
+                       if err := stg.ExpandDependencies(ctx, phase.Conveyor, 
img.GetStagedDockerfileBaseEnv()); err != nil {
+                               return err
+                       }
+               }
+       }
+
        var foundSuitableStage bool
        var calculateStageCleanupFunc cleanup.Func
 
@@ -740,9 +751,7 @@
        if img.IsDockerfileImage && img.DockerfileImageConfig.Staged {
                if werf.GetStagedDockerfileVersion() == werf.StagedDockerfileV2 
{
                        if _, isFromStage := stg.(*instruction.From); 
isFromStage {
-                               if err := img.ExpandDependencies(ctx, 
image.EnvToMap(stg.GetStageImage().Image.GetStageDesc().Info.Env)); err != nil {
-                                       return err
-                               }
+                               
img.SetStagedDockerfileBaseEnv(image.EnvToMap(stg.GetStageImage().Image.GetStageDesc().Info.Env))
                        }
                }
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/pkg/build/conveyor.go 
new/werf-2.68.1/pkg/build/conveyor.go
--- old/werf-2.68.0/pkg/build/conveyor.go       2026-04-23 17:45:53.000000000 
+0200
+++ new/werf-2.68.1/pkg/build/conveyor.go       2026-04-30 14:18:50.000000000 
+0200
@@ -11,7 +11,6 @@
        "sync"
        "time"
 
-       "github.com/opencontainers/go-digest"
        "github.com/samber/lo"
 
        "github.com/werf/common-go/pkg/util"
@@ -1004,11 +1003,6 @@
                if prevStageImage == nil || prevStageImage.Image == nil {
                        return ""
                }
-               if stageDesc := prevStageImage.Image.GetStageDesc(); stageDesc 
!= nil && stageDesc.Info != nil {
-                       if _, err := digest.Parse(stageDesc.Info.ID); err == 
nil {
-                               return stageDesc.Info.ID
-                       }
-               }
                return prevStageImage.Image.Name()
        }
 
@@ -1111,8 +1105,8 @@
        return c.StorageManager.GetStagesStorage().GetImportMetadata(ctx, 
projectName, id)
 }
 
-func (c *Conveyor) PutImportMetadata(ctx context.Context, projectName string, 
metadata *storage.ImportMetadata) error {
-       return c.StorageManager.GetStagesStorage().PutImportMetadata(ctx, 
projectName, metadata)
+func (c *Conveyor) PutImportMetadata(ctx context.Context, projectName string, 
metadata *storage.ImportMetadata, opts storage.PutImportMetadataOptions) error {
+       return c.StorageManager.GetStagesStorage().PutImportMetadata(ctx, 
projectName, metadata, opts)
 }
 
 func (c *Conveyor) RmImportMetadata(ctx context.Context, projectName, id 
string) error {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/pkg/build/image/dockerfile.go 
new/werf-2.68.1/pkg/build/image/dockerfile.go
--- old/werf-2.68.0/pkg/build/image/dockerfile.go       2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/pkg/build/image/dockerfile.go       2026-04-30 
14:18:50.000000000 +0200
@@ -181,7 +181,7 @@
                        baseStageOptions.LogName = "FROM1"
 
                        imageCacheVersion := 
option.ValueOrDefault(dockerfileImageConfig.CacheVersion(), 
metaConfig.Build.CacheVersion)
-                       fromStage := 
stage_instruction.NewFrom(img.GetBaseImageReference(), 
img.GetBaseImageRepoDigest(), imageCacheVersion, &baseStageOptions)
+                       fromStage := 
stage_instruction.NewFrom(img.GetBaseImageReference(), 
img.GetBaseImageRepoDigest(), imageCacheVersion, 
dockerfileImageConfig.Dependencies, stg.ExpanderFactory, &baseStageOptions)
 
                        img.stages = append(img.stages, fromStage)
                        instrNum = 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/pkg/build/image/image.go 
new/werf-2.68.1/pkg/build/image/image.go
--- old/werf-2.68.0/pkg/build/image/image.go    2026-04-23 17:45:53.000000000 
+0200
+++ new/werf-2.68.1/pkg/build/image/image.go    2026-04-30 14:18:50.000000000 
+0200
@@ -125,6 +125,8 @@
        baseStageImage   *stage.StageImage
        stageAsBaseImage stage.Interface
 
+       stagedDockerfileBaseEnv map[string]string
+
        logImageIndex  int
        logTotalImages int
 }
@@ -242,6 +244,14 @@
        return i.LogName()
 }
 
+func (i *Image) SetStagedDockerfileBaseEnv(env map[string]string) {
+       i.stagedDockerfileBaseEnv = env
+}
+
+func (i *Image) GetStagedDockerfileBaseEnv() map[string]string {
+       return i.stagedDockerfileBaseEnv
+}
+
 func (i *Image) SetRebuilt(rebuilt bool) {
        i.rebuilt = rebuilt
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/pkg/build/stage/conveyor.go 
new/werf-2.68.1/pkg/build/stage/conveyor.go
--- old/werf-2.68.0/pkg/build/stage/conveyor.go 2026-04-23 17:45:53.000000000 
+0200
+++ new/werf-2.68.1/pkg/build/stage/conveyor.go 2026-04-30 14:18:50.000000000 
+0200
@@ -11,7 +11,7 @@
 
 type Conveyor interface {
        GetImportMetadata(ctx context.Context, projectName, id string) 
(*storage.ImportMetadata, error)
-       PutImportMetadata(ctx context.Context, projectName string, metadata 
*storage.ImportMetadata) error
+       PutImportMetadata(ctx context.Context, projectName string, metadata 
*storage.ImportMetadata, opts storage.PutImportMetadataOptions) error
        RmImportMetadata(ctx context.Context, projectName, id string) error
 
        GetImageStageContentDigest(targetPlatform, imageName, stageName string) 
string
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/pkg/build/stage/dependencies.go 
new/werf-2.68.1/pkg/build/stage/dependencies.go
--- old/werf-2.68.0/pkg/build/stage/dependencies.go     2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/pkg/build/stage/dependencies.go     2026-04-30 
14:18:50.000000000 +0200
@@ -330,7 +330,12 @@
                return "", fmt.Errorf("unable to get import metadata: %w", err)
        }
 
-       if importMetadata == nil {
+       emptyChecksum := importMetadata != nil && importMetadata.Checksum == ""
+       if emptyChecksum {
+               logboek.Context(ctx).Warn().LogF("Import metadata %s has empty 
checksum, will regenerate\n", importSourceID)
+       }
+
+       if importMetadata == nil || emptyChecksum {
                checksum, err := s.generateImportChecksum(ctx, c, cb, importElm)
                if err != nil {
                        return "", fmt.Errorf("unable to generate import source 
checksum: %w", err)
@@ -343,7 +348,7 @@
                        Checksum:       checksum,
                }
 
-               if err := c.PutImportMetadata(ctx, s.projectName, 
importMetadata); err != nil {
+               if err := c.PutImportMetadata(ctx, s.projectName, 
importMetadata, storage.PutImportMetadataOptions{Force: emptyChecksum}); err != 
nil {
                        return "", fmt.Errorf("unable to put import metadata: 
%w", err)
                }
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/pkg/build/stage/instruction/from.go 
new/werf-2.68.1/pkg/build/stage/instruction/from.go
--- old/werf-2.68.0/pkg/build/stage/instruction/from.go 2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/pkg/build/stage/instruction/from.go 2026-04-30 
14:18:50.000000000 +0200
@@ -2,12 +2,15 @@
 
 import (
        "context"
+       "fmt"
 
        "github.com/werf/common-go/pkg/util"
        "github.com/werf/logboek"
        "github.com/werf/werf/v2/pkg/build/stage"
+       "github.com/werf/werf/v2/pkg/config"
        "github.com/werf/werf/v2/pkg/container_backend"
        "github.com/werf/werf/v2/pkg/docker_registry"
+       "github.com/werf/werf/v2/pkg/dockerfile"
 )
 
 type From struct {
@@ -16,10 +19,12 @@
        BaseImageReference  string
        BaseImageRepoDigest string
 
-       imageCacheVersion string
+       imageCacheVersion         string
+       dependencies              []*config.Dependency
+       dockerfileExpanderFactory dockerfile.ExpanderFactory
 }
 
-func NewFrom(baseImageReference, baseImageRepoDigest, imageCacheVersion 
string, opts *stage.BaseStageOptions) *From {
+func NewFrom(baseImageReference, baseImageRepoDigest, imageCacheVersion 
string, dependencies []*config.Dependency, dockerfileExpanderFactory 
dockerfile.ExpanderFactory, opts *stage.BaseStageOptions) *From {
        return &From{
                BaseImageReference:  baseImageReference,
                BaseImageRepoDigest: baseImageRepoDigest,
@@ -27,7 +32,9 @@
                        stage.StageName("FROM"),
                        opts,
                ),
-               imageCacheVersion: imageCacheVersion,
+               imageCacheVersion:         imageCacheVersion,
+               dependencies:              dependencies,
+               dockerfileExpanderFactory: dockerfileExpanderFactory,
        }
 }
 
@@ -44,6 +51,17 @@
 }
 
 func (stg *From) ExpandDependencies(ctx context.Context, c stage.Conveyor, 
baseEnv map[string]string) error {
+       if stg.dockerfileExpanderFactory == nil {
+               return nil
+       }
+
+       dependenciesArgs := stage.ResolveDependenciesArgs(stg.TargetPlatform(), 
stg.dependencies, c)
+       ref, err := 
stg.dockerfileExpanderFactory.GetExpander(dockerfile.ExpandOptions{SkipUnsetEnv:
 false}).ProcessWordWithMap(stg.BaseImageReference, dependenciesArgs)
+       if err != nil {
+               return fmt.Errorf("unable to expand dockerfile base image 
reference %q: %w", stg.BaseImageReference, err)
+       }
+       stg.BaseImageReference = ref
+
        return nil
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/pkg/build/stage/instruction/from_test.go 
new/werf-2.68.1/pkg/build/stage/instruction/from_test.go
--- old/werf-2.68.0/pkg/build/stage/instruction/from_test.go    2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/pkg/build/stage/instruction/from_test.go    2026-04-30 
14:18:50.000000000 +0200
@@ -8,6 +8,8 @@
 
        "github.com/werf/werf/v2/pkg/build/stage"
        "github.com/werf/werf/v2/pkg/build/stage/instruction"
+       "github.com/werf/werf/v2/pkg/config"
+       "github.com/werf/werf/v2/pkg/dockerfile/frontend"
 )
 
 var _ = DescribeTable("FROM digest",
@@ -22,32 +24,83 @@
        },
 
        Entry("FROM with empty options", NewTestData(
-               instruction.NewFrom("", "", "", &stage.BaseStageOptions{}),
+               instruction.NewFrom("", "", "", nil, nil, 
&stage.BaseStageOptions{}),
                
"8a54a5b1f4e60cfae40553461549416865ff5ee3531444285ddadb4eb8cb939d",
                TestDataOptions{},
        )),
 
        Entry("FROM with BaseImageReference option only ", NewTestData(
-               instruction.NewFrom("test-image-reference", "", "", 
&stage.BaseStageOptions{}),
+               instruction.NewFrom("test-image-reference", "", "", nil, nil, 
&stage.BaseStageOptions{}),
                
"37478b120f37e3acfce89dc834fff808ed63e317e824316197bedbbbe513d0bf",
                TestDataOptions{},
        )),
 
        Entry("FROM with BaseImageRepoDigest option only", NewTestData(
-               instruction.NewFrom("", "test-image-repo-digest", "", 
&stage.BaseStageOptions{}),
+               instruction.NewFrom("", "test-image-repo-digest", "", nil, nil, 
&stage.BaseStageOptions{}),
                
"306fe2574cce78188720fc4341950df9f1fae8908854da6f7054f3c0c35aa132",
                TestDataOptions{},
        )),
 
        Entry("FROM with ImageCacheVersion option only", NewTestData(
-               instruction.NewFrom("", "", "image-cache-version", 
&stage.BaseStageOptions{}),
+               instruction.NewFrom("", "", "image-cache-version", nil, nil, 
&stage.BaseStageOptions{}),
                
"9de9441477c5d35efbc350204fe9b71ad80116bd17c77972ac34232fb23e7c0b",
                TestDataOptions{},
        )),
 
        Entry("FROM with full options", NewTestData(
-               instruction.NewFrom("test-image-reference", 
"test-image-repo-digest", "image-cache-version", &stage.BaseStageOptions{}),
+               instruction.NewFrom("test-image-reference", 
"test-image-repo-digest", "image-cache-version", nil, nil, 
&stage.BaseStageOptions{}),
                
"05fc69b51fbf058a81c5822ba4c8d1aa952a75280a16654b03c02deb00a534bb",
                TestDataOptions{},
        )),
 )
+
+var _ = Describe("FROM dependency expansion", func() {
+       newGiterminismManager := func() *stage.GiterminismManagerStub {
+               return 
stage.NewGiterminismManagerStub(stage.NewLocalGitRepoStub("test"), 
stage.NewGiterminismInspectorStub())
+       }
+
+       deps := []*config.Dependency{
+               {
+                       ImageName: "ssr",
+                       Imports: []*config.DependencyImport{
+                               {Type: config.ImageNameImport, TargetBuildArg: 
"SSR_IMAGE"},
+                       },
+               },
+       }
+
+       expanderFactory := frontend.NewShlexExpanderFactory('\\')
+
+       It("should produce different digests when dependency image changes", 
func(ctx SpecContext) {
+               conveyorV1 := stage.NewConveyorStub(
+                       newGiterminismManager(),
+                       map[string]string{"ssr": 
"registry.example.com/ssr:v1"}, nil, nil,
+               )
+               fromV1 := instruction.NewFrom("${SSR_IMAGE}", "", "", deps, 
expanderFactory, &stage.BaseStageOptions{})
+               Expect(fromV1.ExpandDependencies(ctx, conveyorV1, 
nil)).To(Succeed())
+               
Expect(fromV1.BaseImageReference).To(Equal("registry.example.com/ssr:v1"))
+               digestV1, err := fromV1.GetDependencies(ctx, conveyorV1, nil, 
nil, nil, nil)
+               Expect(err).To(Succeed())
+
+               conveyorV2 := stage.NewConveyorStub(
+                       newGiterminismManager(),
+                       map[string]string{"ssr": 
"registry.example.com/ssr:v2"}, nil, nil,
+               )
+               fromV2 := instruction.NewFrom("${SSR_IMAGE}", "", "", deps, 
expanderFactory, &stage.BaseStageOptions{})
+               Expect(fromV2.ExpandDependencies(ctx, conveyorV2, 
nil)).To(Succeed())
+               
Expect(fromV2.BaseImageReference).To(Equal("registry.example.com/ssr:v2"))
+               digestV2, err := fromV2.GetDependencies(ctx, conveyorV2, nil, 
nil, nil, nil)
+               Expect(err).To(Succeed())
+
+               Expect(digestV1).NotTo(Equal(digestV2))
+       })
+
+       It("should leave BaseImageReference unchanged when no expander factory 
provided", func(ctx SpecContext) {
+               conveyor := stage.NewConveyorStub(
+                       newGiterminismManager(),
+                       map[string]string{"ssr": 
"registry.example.com/ssr:v1"}, nil, nil,
+               )
+               from := instruction.NewFrom("${SSR_IMAGE}", "", "", deps, nil, 
&stage.BaseStageOptions{})
+               Expect(from.ExpandDependencies(ctx, conveyor, 
nil)).To(Succeed())
+               Expect(from.BaseImageReference).To(Equal("${SSR_IMAGE}"))
+       })
+})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/werf-2.68.0/pkg/container_backend/legacy_stage_image.go 
new/werf-2.68.1/pkg/container_backend/legacy_stage_image.go
--- old/werf-2.68.0/pkg/container_backend/legacy_stage_image.go 2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/pkg/container_backend/legacy_stage_image.go 2026-04-30 
14:18:50.000000000 +0200
@@ -6,8 +6,6 @@
        "os"
        "strings"
 
-       "github.com/opencontainers/go-digest"
-
        "github.com/werf/common-go/pkg/util"
        "github.com/werf/lockgate"
        "github.com/werf/logboek"
@@ -68,14 +66,8 @@
        if i.buildImage != nil {
                return i.buildImage.Name()
        }
-       stageDesc := i.legacyBaseImage.GetStageDesc()
-       if stageDesc != nil && stageDesc.Info != nil {
-               if _, err := digest.Parse(stageDesc.Info.ID); err == nil {
-                       return stageDesc.Info.ID
-               }
-               if stageDesc.Info.Name != "" {
-                       return stageDesc.Info.Name
-               }
+       if stageDesc := i.legacyBaseImage.GetStageDesc(); stageDesc != nil && 
stageDesc.Info != nil {
+               return stageDesc.Info.Name
        }
        return i.legacyBaseImage.Name()
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/werf-2.68.0/pkg/container_backend/legacy_stage_image_test.go 
new/werf-2.68.1/pkg/container_backend/legacy_stage_image_test.go
--- old/werf-2.68.0/pkg/container_backend/legacy_stage_image_test.go    
2026-04-23 17:45:53.000000000 +0200
+++ new/werf-2.68.1/pkg/container_backend/legacy_stage_image_test.go    
2026-04-30 14:18:50.000000000 +0200
@@ -9,7 +9,7 @@
 )
 
 var _ = Describe("LegacyStageImage", func() {
-       It("prefers stage image ID when available", func() {
+       It("returns stage image name", func() {
                t := GinkgoT()
 
                stageImage := NewLegacyStageImage(nil, "repo:tag", nil, "")
@@ -20,35 +20,6 @@
                        },
                })
 
-               require.NotNil(t, stageImage.GetStageDesc())
-               assert.Equal(t, 
"sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 
stageImage.GetID())
-       })
-
-       It("falls back to image name when stage image ID is missing", func() {
-               t := GinkgoT()
-
-               stageImage := NewLegacyStageImage(nil, "repo:tag", nil, "")
-               stageImage.SetStageDesc(&image.StageDesc{
-                       Info: &image.Info{
-                               Name: "repo:tag",
-                       },
-               })
-
-               require.NotNil(t, stageImage.GetStageDesc())
-               assert.Equal(t, "repo:tag", stageImage.GetID())
-       })
-
-       It("falls back to image name when stage image ID is invalid", func() {
-               t := GinkgoT()
-
-               stageImage := NewLegacyStageImage(nil, "repo:tag", nil, "")
-               stageImage.SetStageDesc(&image.StageDesc{
-                       Info: &image.Info{
-                               Name: "repo:tag",
-                               ID:   "sha256:",
-                       },
-               })
-
                require.NotNil(t, stageImage.GetStageDesc())
                assert.Equal(t, "repo:tag", stageImage.GetID())
        })
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/pkg/storage/import_metadata.go 
new/werf-2.68.1/pkg/storage/import_metadata.go
--- old/werf-2.68.0/pkg/storage/import_metadata.go      2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/pkg/storage/import_metadata.go      2026-04-30 
14:18:50.000000000 +0200
@@ -28,6 +28,10 @@
        }
 }
 
+type PutImportMetadataOptions struct {
+       Force bool
+}
+
 func newImportMetadataFromLabels(labels map[string]string) *ImportMetadata {
        return &ImportMetadata{
                ImportSourceID: 
labels[image.WerfImportMetadataImportSourceIDLabel],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/pkg/storage/local_stages_storage.go 
new/werf-2.68.1/pkg/storage/local_stages_storage.go
--- old/werf-2.68.0/pkg/storage/local_stages_storage.go 2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/pkg/storage/local_stages_storage.go 2026-04-30 
14:18:50.000000000 +0200
@@ -268,16 +268,18 @@
        return newImportMetadataFromLabels(info.Labels), nil
 }
 
-func (storage *LocalStagesStorage) PutImportMetadata(ctx context.Context, 
projectName string, metadata *ImportMetadata) error {
+func (storage *LocalStagesStorage) PutImportMetadata(ctx context.Context, 
projectName string, metadata *ImportMetadata, opts PutImportMetadataOptions) 
error {
        logboek.Context(ctx).Debug().LogF("-- 
LocalStagesStorage.PutImportMetadata %s %v\n", projectName, metadata)
 
        fullImageName := makeLocalImportMetadataName(projectName, 
metadata.ImportSourceID)
        logboek.Context(ctx).Debug().LogF("-- 
LocalStagesStorage.PutImportMetadata full image name: %s\n", fullImageName)
 
-       if info, err := storage.ContainerBackend.GetImageInfo(ctx, 
fullImageName, container_backend.GetImageInfoOpts{}); err != nil {
-               return fmt.Errorf("unable to check existence of image %s: %w", 
fullImageName, err)
-       } else if info != nil {
-               return nil
+       if !opts.Force {
+               if info, err := storage.ContainerBackend.GetImageInfo(ctx, 
fullImageName, container_backend.GetImageInfoOpts{}); err != nil {
+                       return fmt.Errorf("unable to check existence of image 
%s: %w", fullImageName, err)
+               } else if info != nil {
+                       return nil
+               }
        }
 
        labels := metadata.ToLabels()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/pkg/storage/repo_stages_storage.go 
new/werf-2.68.1/pkg/storage/repo_stages_storage.go
--- old/werf-2.68.0/pkg/storage/repo_stages_storage.go  2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/pkg/storage/repo_stages_storage.go  2026-04-30 
14:18:50.000000000 +0200
@@ -692,30 +692,33 @@
        return newImportMetadataFromLabels(img.Labels), nil
 }
 
-func (storage *RepoStagesStorage) PutImportMetadata(ctx context.Context, 
projectName string, metadata *ImportMetadata) error {
+func (storage *RepoStagesStorage) PutImportMetadata(ctx context.Context, 
projectName string, metadata *ImportMetadata, opts PutImportMetadataOptions) 
error {
        logboek.Context(ctx).Debug().LogF("-- 
RepoStagesStorage.PutImportMetadata %v\n", metadata)
 
        tagName := makeRepoImportMetadataTag(metadata.ImportSourceID)
-       tags, err := storage.Tags(ctx, storage.RepoAddress)
-       if err != nil {
-               return fmt.Errorf("unable to get repo %s tags: %w", 
storage.RepoAddress, err)
-       }
 
-       for _, tag := range tags {
-               if tag == tagName {
-                       logboek.Context(ctx).Debug().LogF("-- 
RepoStagesStorage.PutImportMetadata tag %s already exists, skipping push\n", 
tagName)
+       if !opts.Force {
+               tags, err := storage.Tags(ctx, storage.RepoAddress)
+               if err != nil {
+                       return fmt.Errorf("unable to get repo %s tags: %w", 
storage.RepoAddress, err)
+               }
+
+               for _, tag := range tags {
+                       if tag == tagName {
+                               logboek.Context(ctx).Debug().LogF("-- 
RepoStagesStorage.PutImportMetadata tag %s already exists, skipping push\n", 
tagName)
 
-                       return nil
+                               return nil
+                       }
                }
        }
 
        fullImageName := makeRepoImportMetadataName(storage.RepoAddress, 
metadata.ImportSourceID)
        logboek.Context(ctx).Debug().LogF("-- 
RepoStagesStorage.PutImportMetadata full image name: %s\n", fullImageName)
 
-       opts := &docker_registry.PushImageOptions{Labels: 
metadata.ToLabelsMap()}
-       opts.Labels[image.WerfLabel] = projectName
+       pushOpts := &docker_registry.PushImageOptions{Labels: 
metadata.ToLabelsMap()}
+       pushOpts.Labels[image.WerfLabel] = projectName
 
-       if err := storage.DockerRegistry.PushImage(ctx, fullImageName, opts); 
err != nil {
+       if err := storage.DockerRegistry.PushImage(ctx, fullImageName, 
pushOpts); err != nil {
                if docker_registry.IsStatusForbiddenErr(err) {
                        logboek.Context(ctx).Warn().LogF("WARNING: Failed to 
push import meta tag image %s\n", fullImageName)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/pkg/storage/stages_storage.go 
new/werf-2.68.1/pkg/storage/stages_storage.go
--- old/werf-2.68.0/pkg/storage/stages_storage.go       2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/pkg/storage/stages_storage.go       2026-04-30 
14:18:50.000000000 +0200
@@ -95,7 +95,7 @@
        GetAllAndGroupImageMetadataByImageName(ctx context.Context, projectName 
string, imageNameOrManagedImageList []string, opts ...Option) 
(map[string]map[string][]string, map[string]map[string][]string, error)
 
        GetImportMetadata(ctx context.Context, projectName, id string) 
(*ImportMetadata, error)
-       PutImportMetadata(ctx context.Context, projectName string, metadata 
*ImportMetadata) error
+       PutImportMetadata(ctx context.Context, projectName string, metadata 
*ImportMetadata, opts PutImportMetadataOptions) error
        RmImportMetadata(ctx context.Context, projectName, id string) error
        GetImportMetadataIDs(ctx context.Context, projectName string, opts 
...Option) ([]string, error)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/pkg/util/parallel/parallel_test.go 
new/werf-2.68.1/pkg/util/parallel/parallel_test.go
--- old/werf-2.68.0/pkg/util/parallel/parallel_test.go  2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/pkg/util/parallel/parallel_test.go  2026-04-30 
14:18:50.000000000 +0200
@@ -32,6 +32,9 @@
                output := newSpyOutput(numberOfTasks)
                ctx = logboek.NewContext(ctx, logboek.NewLogger(output, output))
 
+               // tmp_manager requires werf init
+               Expect(werf.Init(GinkgoT().TempDir(), "")).To(Succeed())
+
                // Force GC to get timers more predictable for being able to 
rely on them
                runtime.GC()
 
@@ -41,9 +44,6 @@
                        defer cancel()
                }
 
-               // tmp_manager requires werf init
-               Expect(werf.Init(GinkgoT().TempDir(), "")).To(Succeed())
-
                err := parallel.DoTasks(ctx, numberOfTasks, options, 
spyTask.Callback)
 
                Expect(spyTask.Count()).To(Equal(expectedCallsCount))
@@ -198,7 +198,7 @@
        ),
        Entry(
                "should cancel execution via context for all workers",
-               time.Second,
+               3*time.Second,
                4,
                parallel.DoTasksOptions{
                        MaxNumberOfWorkers: 2,
@@ -261,7 +261,7 @@
        ),
        Entry(
                "should cancel execution of second task per single worker if 
1-st task is canceled",
-               time.Second,
+               3*time.Second,
                2,
                parallel.DoTasksOptions{
                        MaxNumberOfWorkers: 1,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/pkg/werf/exec/detach.go 
new/werf-2.68.1/pkg/werf/exec/detach.go
--- old/werf-2.68.0/pkg/werf/exec/detach.go     2026-04-23 17:45:53.000000000 
+0200
+++ new/werf-2.68.1/pkg/werf/exec/detach.go     2026-04-30 14:18:50.000000000 
+0200
@@ -2,6 +2,7 @@
 
 import (
        "context"
+       "fmt"
        "os"
        "slices"
        "strings"
@@ -17,8 +18,6 @@
 // Detach executes werf binary in new detached process.
 // The detached process will continue to work after termination of parent 
process.
 func Detach(ctx context.Context, args, envs []string) error {
-       name := option.ValueOrDefault(os.Getenv("WERF_ORIGINAL_EXECUTABLE"), 
os.Args[0])
-
        env := slices.Concat(envs, os.Environ(), 
[]string{"_WERF_BACKGROUND_MODE_ENABLED=1"})
        env = lo.Uniq(env)
 
@@ -31,6 +30,23 @@
                return err
        }
 
+       execPath, err := os.Executable()
+       if err != nil {
+               return fmt.Errorf("get executable path: %w", err)
+       }
+
+       name := option.ValueOrDefault(os.Getenv("WERF_ORIGINAL_EXECUTABLE"), 
execPath)
+
+       // WERF_SELF_INVOCATION_COMMAND allows wrapping the werf executable 
with another command.
+       // Example:
+       //      WERF_ORIGINAL_EXECUTABLE=some-exec
+       //      WERF_SELF_INVOCATION_COMMAND=embeding
+       //      args = ["host", "cleanup", ...]
+       //      Resulting command: "some-exec embeding host cleanup ..."
+       if val := os.Getenv("WERF_SELF_INVOCATION_COMMAND"); val != "" {
+               args = append(strings.Fields(val), args...)
+       }
+
        cmd := CommandContextCancellation(ctx, name, args...)
        cmd.Env = env
        cmd.Stdout = outStream
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/test/e2e/build/network_test.go 
new/werf-2.68.1/test/e2e/build/network_test.go
--- old/werf-2.68.0/test/e2e/build/network_test.go      2026-04-23 
17:45:53.000000000 +0200
+++ new/werf-2.68.1/test/e2e/build/network_test.go      2026-04-30 
14:18:50.000000000 +0200
@@ -54,7 +54,7 @@
                                if testOpts.ExpectNetworkValue != "" {
                                        
Expect(buildOut).To(ContainSubstring("network: " + testOpts.ExpectNetworkValue))
                                } else {
-                                       
Expect(buildOut).To(ContainSubstring("network:"))
+                                       
Expect(buildOut).To(ContainSubstring("network: default"))
                                }
                        }
                },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/werf-2.68.0/trdl_channels.yaml 
new/werf-2.68.1/trdl_channels.yaml
--- old/werf-2.68.0/trdl_channels.yaml  2026-04-23 17:45:53.000000000 +0200
+++ new/werf-2.68.1/trdl_channels.yaml  2026-04-30 14:18:50.000000000 +0200
@@ -38,7 +38,7 @@
   - name: "2"
     channels:
       - name: alpha
-        version: 2.67.2
+        version: 2.68.0
       - name: beta
         version: 2.67.2
       - name: ea

++++++ werf.obsinfo ++++++
--- /var/tmp/diff_new_pack.afEih5/_old  2026-05-20 15:26:46.831725010 +0200
+++ /var/tmp/diff_new_pack.afEih5/_new  2026-05-20 15:26:46.839725340 +0200
@@ -1,5 +1,5 @@
 name: werf
-version: 2.68.0
-mtime: 1776959153
-commit: 32fdbc60570bbd34b916e28f6ec61d33e5cd72d4
+version: 2.68.1
+mtime: 1777551530
+commit: 508fb9aee29baca228674ba7a3d2d4fa1f5844d5
 

Reply via email to