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

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions