Skip to content

Assigning values to variables in env is broken #1496

@cknowlto

Description

@cknowlto

Jenkins and plugins versions report

Environment
Jenkins: 2.541.1
OS: Linux - 4.18.0-553.89.1.el8_10.x86_64
Java: 21.0.9 - Amazon.com Inc. (OpenJDK 64-Bit Server VM)
---
Parameterized-Remote-Trigger:3.2.2
additional-metrics:207.v0407e7fe201b_
ant:520.vd082ecfb_16a_9
antisamy-markup-formatter:173.v680e3a_b_69ff3
apache-httpcomponents-client-4-api:4.5.14-269.vfa_2321039a_83
apache-httpcomponents-client-5-api:5.6-183.ve5a_8a_b_e71e59
artifactory:4.0.8
asm-api:9.9.1-189.vb_5ef2964da_91
atlassian-bitbucket-server-integration:5.0.1
audit-log:1.3
authentication-tokens:1.144.v5ff4a_5ec5c33
badge:2.562.vc3c0b_6925377
bitbucket:282.v85a_7e442f57b_
bitbucket-approve:1.0.3
bootstrap5-api:5.3.8-895.v4d0d8e47fea_d
bouncycastle-api:2.30.1.82-277.v70ca_0b_877184
branch-api:2.1268.v044a_87612da_8
build-timeout:1.39
build-token-root:151.va_e52fe3215fc
build-user-vars-plugin:212.vd6b_e9f6d0cdb_
caffeine-api:3.2.3-194.v31a_b_f7a_b_5a_81
cctray-xml:155.v5139a_4591a_3e
checks-api:402.vca_263b_f200e3
cloudbees-bitbucket-branch-source:937.2.3
cloudbees-folder:6.1073.va_7888eb_dd514
command-launcher:123.v37cfdc92ef67
commons-collections4-api:4.5.0-8.va_d5448ef9011
commons-compress-api:1.28.0-2
commons-lang3-api:3.20.0-109.ve43756e2d2b_4
commons-text-api:1.15.0-210.v7480a_da_70b_9e
compatibility-action-storage:1.0
compress-buildlog:1.2
conditional-buildstep:1.5.0
config-file-provider:1006.vc7366c201f57
copyartifact:795.ve8e151429b_27
credentials:1480.v2246fd131e83
credentials-binding:702.vfe613e537e88
data-tables-api:2.3.5-1497.v38449eb_7d5a_1
datadog:9.1.8
description-setter:264.v1957f215dcd5
disable-job-button:1.3.vf55949267366
display-url-api:2.217.va_6b_de84cc74b_
docker-commons:457.v0f62a_94f11a_3
docker-workflow:634.vedc7242b_eda_7
durable-task:651.v1f5e074fc83f
echarts-api:6.0.0-1165.vd1283a_3e37d4
eddsa-api:0.3.0.1-29.v67e9a_1c969b_b_
email-ext:1933.v45cec755423f
emoji-symbols-api:17.0-57.v8d44b_9a_b_d5ea_
envinject:2.934.vc674e76cf954
envinject-api:1.237.v82803a_511906
extended-read-permission:68.vd270568a_7520
external-monitor-job:223.vb_fddcf42c9b_3
extra-columns:1.28
flatpickr-api:4.6.13-32.v60a_51029c136
font-awesome-api:7.1.0-882.v1dfb_771e3278
git:5.9.0
git-client:6.5.0
git-server:137.ve0060b_432302
github:1.45.0
github-api:1.330-492.v3941a_032db_2a_
github-branch-source:1934.v23cf60a_47fc3
global-build-stats:347.v32a_eb_0493c4f
gradle:2.18.1203.v2c96b_1243c72
groovy:497.v7b_061a_a_de65d
groovy-postbuild:300.va_253b_2988cb_1
gson-api:2.13.2-173.va_a_092315913c
handy-uri-templates-2-api:2.1.8-38.vcea_5d521d5f3
htmlpublisher:427
instance-identity:203.v15e81a_1b_7a_38
ionicons-api:94.vcc3065403257
ivy:604.v6dd214d04ef3
jackson2-api:2.20.1-423.v13951f6b_6532
jakarta-activation-api:2.1.4-1
jakarta-mail-api:2.1.5-1
jakarta-xml-bind-api:4.0.6-12.vb_1833c1231d3
javadoc:354.vee1a_660b_4990
javax-activation-api:1.2.0-8
javax-mail-api:1.6.2-11
jaxb:2.3.9-143.v5979df3304e6
jdk-tool:83.v417146707a_3d
jersey2-api:2.47-165.ve7809a_3e87e0
jjwt-api:0.11.5-120.v0268cf544b_89
jnr-posix-api:3.1.21-186.vb_7ec9b_23ce83
jobConfigHistory:1356.ve360da_6c523a_
joda-time-api:2.14.0-177.vd7e9347b_e7d5
join:1.21
jquery:1.12.4-3
jquery3-api:3.7.1-619.vdb_10e002501a_
jsch:0.2.16-95.v3eecb_55fa_b_78
json-api:20251224-185.v0cc18490c62c
json-path-api:2.10.0-202.va_9cc16c1e476
jsoup:1.22.1-76.v9cdb_2456c0e3
junit:1396.v095840ed8491
ldap:807.v7d7de30930cf
leastload:62.vfa_8830902733
lenientshutdown:2.125.v1156982d427d
lockable-resources:1438.v3c0f8c9e2060
mailer:525.v2458b_d8a_1a_71
mapdb-api:1.0.9-44.va_1e1310c9118
mask-passwords:212.v4967a_a_73b_506
matrix-auth:3.2.9
matrix-groovy-execution-strategy:1.0.8
matrix-project:870.v9db_fcfc2f45b_
maven-plugin:3.27
mercurial:1323.ve69d2a_db_8a_b_d
metrics:4.2.37-494.v06f9a_939d33a_
mina-sshd-api-common:2.16.0-167.va_269f38cc024
mina-sshd-api-core:2.16.0-167.va_269f38cc024
monitoring:2.6.0
naginator:1.530.vb_6d120f250b_1
nested-view:241.v178f0b_a_cd76a_
nodelabelparameter:851.vd94e5048d321
okhttp-api:4.12.0-195.vc02552c04ffd
opentelemetry:3.1573.v72f1a_711ca_98
opentelemetry-api:1.49.0.94.v5fc5325d5e7a_
oss-symbols-api:442.v99039087229b_
pam-auth:1.12
parameterized-scheduler:374.v531b_4f4d99b_3
parameterized-trigger:873.v8b_e37dd8418f
pipeline-build-step:584.vdb_a_2cc3a_d07a_
pipeline-github-lib:65.v203688e7727e
pipeline-graph-analysis:245.v88f03631a_b_21
pipeline-groovy-lib:787.ve2fef0efdca_6
pipeline-input-step:540.v14b_100d754dd
pipeline-milestone-step:138.v78ca_76831a_43
pipeline-model-api:2.2277.v00573e73ddf1
pipeline-model-definition:2.2277.v00573e73ddf1
pipeline-model-extensions:2.2277.v00573e73ddf1
pipeline-rest-api:2.39
pipeline-stage-step:322.vecffa_99f371c
pipeline-stage-tags-metadata:2.2277.v00573e73ddf1
pipeline-stage-view:2.39
pipeline-utility-steps:2.20.0
plain-credentials:199.v9f8e1f741799
plugin-util-api:6.1192.v30fe6e2837ff
postbuild-task:78.v24529f1f5cdb_
postbuildscript:3.4.1-695.vf6b_0b_8053979
powershell:2.3
prism-api:1.30.0-703.v116fb_3b_5b_b_a_a_
publish-over:0.22
publish-over-ssh:390.vb_f56e7405751
purge-build-queue-plugin:125.v09ee2147746f
purge-job-history:74.vf21030329dda_
rebuild:338.va_0a_b_50e29397
remote-file:1.24
resource-disposer:0.25
run-condition:276.v97298f3a_cd51
scm-api:724.v7d839074eb_5c
script-security:1385.v7d2d9ec4d909
scriptler:444.v7fd079eb_3b_86
shelve-project-plugin:3.3196.v0052de37a_8d3
skip-notifications-trait:576.v7a_67396e2e0b_
slack:795.v4b_9705b_e6d47
sloccount:1.27
snakeyaml-api:2.5-143.v93b_c004f89de
ssh-credentials:361.vb_f6760818e8c
ssh-slaves:3.1096.v0b_cc466e4323
sshd:3.374.v19b_d59ce6610
strict-crumb-issuer:2.1.1
structs:362.va_b_695ef4fdf9
text-finder:1.33
throttle-concurrents:625.vc8b_e469e9a_b_c
timestamper:1.30
token-macro:477.vd4f0dc3cb_cf1
trilead-api:2.284.v1974ea_324382
uno-choice:2.8.8
variant:70.va_d9f17f859e0
versionnumber:234.v315d3b_3cb_fb_5
view-job-filters:406.va_0ec67147ee2
workflow-aggregator:608.v67378e9d3db_1
workflow-api:1398.v67030756d3fb_
workflow-basic-steps:1098.v808b_fd7f8cf4
workflow-cps:4254.v0c8e228524ea_
workflow-durable-task-step:1464.v2d3f5c68f84c
workflow-job:1571.vb_423c255d6d9
workflow-multibranch:821.vc3b_4ea_780798
workflow-scm-step:466.va_d69e602552b_
workflow-step-api:710.v3e456cc85233
workflow-support:1010.vb_b_39488a_9841
ws-cleanup:0.49
xerox-accurev:3.4
xvnc:1.28

What Operating System are you using (both controller, and any agents involved in the problem)?

Operating system = Linux decaf 3.10.0-1160.142.1.el7.x86_64 jenkinsci/jenkins#1 SMP Tue Oct 28 11:22:35 EDT 2025 x86_64 x86_64 x86_64 GNU/Linux

Reproduction steps

  1. Create new pipeline job.
  2. Use code:
pipeline {
    agent any
    environment {
        // Initial value (treated as a string 'true')
        MY_FLAG = 'true'
        MY_OTHER_FLAG = 'false'
        MY_BAD_FLAG = true
        MY_OTHER_BAD_FLAG = false
    }
    stages {
        stage('Check initial values as strings') {
            steps {
                script {
                    // Access and print the initial value (string)
                    echo "Initial flag value MY_FLAG: ${env.MY_FLAG}" 
                    echo "Initial flag value MY_OTHER_FLAG: ${env.MY_OTHER_FLAG}" 
                    echo "Initial flag value MY_BAD_FLAG: ${env.MY_BAD_FLAG}" 
                    echo "Initial flag value MY_OTHER_BAD_FLAG: ${env.MY_OTHER_BAD_FLAG}" 
                }
            }
        }
        stage('Change values') {
            steps {
                script {
                    // Change the value within the script block
                    env.MY_FLAG = 'false'
                    env.MY_OTHER_FLAG = 'true'
                    env.MY_BAD_FLAG = false
                    env.MY_OTHER_BAD_FLAG = true
                    echo "Updated local flag value MY_FLAG: ${env.MY_FLAG}" 
                    echo "Updated local flag value MY_OTHER_FLAG: ${env.MY_OTHER_FLAG}" 
                    echo "Updated local flag value MY_BAD_FLAG: ${env.MY_BAD_FLAG}" 
                    echo "Updated local flag value MY_OTHER_BAD_FLAG: ${env.MY_OTHER_BAD_FLAG}" 
                }
            }
        }
        stage('Global values') {
            steps {
                script {
                    echo "Updated global flag value MY_FLAG: ${env.MY_FLAG}" 
                    echo "Updated global flag value MY_OTHER_FLAG: ${env.MY_OTHER_FLAG}" 
                    echo "Updated global flag value MY_BAD_FLAG: ${env.MY_BAD_FLAG}" 
                    echo "Updated global flag value MY_OTHER_BAD_FLAG: ${env.MY_OTHER_BAD_FLAG}" 
                }
            }
        }
    }
}

Expected Results

Running on [build-300](https://jenkins.sdsp.mc.xerox.com:8443/computer/build%2D300/) in /opt/jenkins/workspace/ProblemTicket
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Check initial values as strings)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Initial flag value MY_FLAG: true
[Pipeline] echo
Initial flag value MY_OTHER_FLAG: false
[Pipeline] echo
Initial flag value MY_BAD_FLAG: true
[Pipeline] echo
Initial flag value MY_OTHER_BAD_FLAG: false
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Change values)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Updated local flag value MY_FLAG: false
[Pipeline] echo
Updated local flag value MY_OTHER_FLAG: true
[Pipeline] echo
Updated local flag value MY_BAD_FLAG: whatever
[Pipeline] echo
Updated local flag value MY_OTHER_BAD_FLAG: whatever
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Global values)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Updated global flag value MY_FLAG: false
[Pipeline] echo
Updated global flag value MY_OTHER_FLAG: true
[Pipeline] echo
Updated global flag value MY_BAD_FLAG: different whatever
[Pipeline] echo
Updated global flag value MY_OTHER_BAD_FLAG: different whatever

Actual Results

Running on [build-300](https://jenkins.sdsp.mc.xerox.com:8443/computer/build%2D300/) in /opt/jenkins/workspace/ProblemTicket
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Check initial values as strings)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Initial flag value MY_FLAG: true
[Pipeline] echo
Initial flag value MY_OTHER_FLAG: false
[Pipeline] echo
Initial flag value MY_BAD_FLAG: true
[Pipeline] echo
Initial flag value MY_OTHER_BAD_FLAG: false
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Change values)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Updated local flag value MY_FLAG: true
[Pipeline] echo
Updated local flag value MY_OTHER_FLAG: false
[Pipeline] echo
Updated local flag value MY_BAD_FLAG: true
[Pipeline] echo
Updated local flag value MY_OTHER_BAD_FLAG: false
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Global values)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Updated global flag value MY_FLAG: true
[Pipeline] echo
Updated global flag value MY_OTHER_FLAG: false
[Pipeline] echo
Updated global flag value MY_BAD_FLAG: true
[Pipeline] echo
Updated global flag value MY_OTHER_BAD_FLAG: false

Anything else?

I did not expect the assignments to work as booleans as env variables are clearly type string, but apparently NEITHER works. I have spend DAYS debugging conditional statements and long pipelines because of this.

This has to be new behavior. something this core doesn't break without causing a lot of issues, but I did not see it reported yet. SO, this may be a pipeline plugin problem???? But this is variable assignment. It feels core.

Are you interested in contributing a fix?

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions