{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/",
  "atlas": "https://www.pystone.net/?node=jenkins-user-env-variable-issues#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/jenkins-user-env-variable-issues.md",
  "context": "https://www.pystone.net/notes/jenkins-user-env-variable-issues.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:jenkins-user-env-variable-issues",
  "slug": "jenkins-user-env-variable-issues",
  "title": "【Jenkins】用户与环境变量问题",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "【Jenkins】用户与环境变量问题",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "5d446690418788d5e03b37311b83284789137d22be62cfa31fd5e944130c0905",
  "assets": [
    {
      "reference": "assets/0028 - 【Jenkins】用户与环境变量问题__resource-001-2af138a09e6a.png",
      "url": "/media/a8d8c55046521eccbbb5.png",
      "mediaType": "image/png",
      "contentHash": "a8d8c55046521eccbbb5a18148505fd2c61a6de896379968b2e2e3ed026ccafc",
      "byteLength": 5020,
      "width": 470,
      "height": 67
    },
    {
      "reference": "assets/0028 - 【Jenkins】用户与环境变量问题__resource-006-e9df4973a88e.png",
      "url": "/media/79fa75a4384279d2f44f.png",
      "mediaType": "image/png",
      "contentHash": "79fa75a4384279d2f44f00caeb4a6d0f81e648dd6cbc715876c529094845d59a",
      "byteLength": 12899,
      "width": 781,
      "height": 209
    },
    {
      "reference": "assets/0028 - 【Jenkins】用户与环境变量问题__resource-002-a29fc8a59bf2.png",
      "url": "/media/9a1bb31c84b9873ddab8.png",
      "mediaType": "image/png",
      "contentHash": "9a1bb31c84b9873ddab87d075ea5845eefed55b0fca9a88fbdec2e91e89493c0",
      "byteLength": 6256,
      "width": 381,
      "height": 259
    },
    {
      "reference": "assets/0028 - 【Jenkins】用户与环境变量问题__resource-003-63fd855a5ab5.png",
      "url": "/media/8fafa7076e6a692d019f.png",
      "mediaType": "image/png",
      "contentHash": "8fafa7076e6a692d019f669740988f9b5d76f8a626cfa05b88eab093562e5e54",
      "byteLength": 4486,
      "width": 714,
      "height": 107
    },
    {
      "reference": "assets/0028 - 【Jenkins】用户与环境变量问题__resource-004-5d201cbc834b.png",
      "url": "/media/10fadb08c69293a69644.png",
      "mediaType": "image/png",
      "contentHash": "10fadb08c69293a6964445336661937e8e4142307e4cddbeac04f346fa7c8fd3",
      "byteLength": 8895,
      "width": 794,
      "height": 216
    },
    {
      "reference": "assets/0028 - 【Jenkins】用户与环境变量问题__resource-005-ceb5c8dfbadf.png",
      "url": "/media/ca4624e4b2d57290037d.png",
      "mediaType": "image/png",
      "contentHash": "ca4624e4b2d57290037de285822453e76f2f087762bf8ca44f9e9b09b7e9202c",
      "byteLength": 1676,
      "width": 145,
      "height": 73
    }
  ],
  "headings": [
    {
      "depth": 1,
      "text": "【Jenkins】用户与环境变量问题",
      "anchor": "jenkins用户与环境变量问题",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#jenkins%E7%94%A8%E6%88%B7%E4%B8%8E%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E9%97%AE%E9%A2%98"
    },
    {
      "depth": 2,
      "text": "综述",
      "anchor": "综述",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#%E7%BB%BC%E8%BF%B0"
    },
    {
      "depth": 2,
      "text": "Jenkins运行Shell的机制",
      "anchor": "jenkins运行shell的机制",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#jenkins%E8%BF%90%E8%A1%8Cshell%E7%9A%84%E6%9C%BA%E5%88%B6"
    },
    {
      "depth": 3,
      "text": "SSH远程登录与环境变量",
      "anchor": "ssh远程登录与环境变量",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#ssh%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95%E4%B8%8E%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F"
    },
    {
      "depth": 3,
      "text": "运行shell脚本",
      "anchor": "运行shell脚本",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#%E8%BF%90%E8%A1%8Cshell%E8%84%9A%E6%9C%AC"
    },
    {
      "depth": 3,
      "text": "修改What shell is used",
      "anchor": "修改what-shell-is-used",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#%E4%BF%AE%E6%94%B9what-shell-is-used"
    },
    {
      "depth": 2,
      "text": "Jenkins不同层次环境变量的加载特性和时机",
      "anchor": "jenkins不同层次环境变量的加载特性和时机",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#jenkins%E4%B8%8D%E5%90%8C%E5%B1%82%E6%AC%A1%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E7%9A%84%E5%8A%A0%E8%BD%BD%E7%89%B9%E6%80%A7%E5%92%8C%E6%97%B6%E6%9C%BA"
    },
    {
      "depth": 3,
      "text": "全局配置、节点配置和节点本身环境变量之间的关系",
      "anchor": "全局配置节点配置和节点本身环境变量之间的关系",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE%E8%8A%82%E7%82%B9%E9%85%8D%E7%BD%AE%E5%92%8C%E8%8A%82%E7%82%B9%E6%9C%AC%E8%BA%AB%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E4%B9%8B%E9%97%B4%E7%9A%84%E5%85%B3%E7%B3%BB"
    },
    {
      "depth": 3,
      "text": "节点本身环境变量加载方式",
      "anchor": "节点本身环境变量加载方式",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#%E8%8A%82%E7%82%B9%E6%9C%AC%E8%BA%AB%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%8A%A0%E8%BD%BD%E6%96%B9%E5%BC%8F"
    },
    {
      "depth": 4,
      "text": "Master Windows",
      "anchor": "master-windows",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#master-windows"
    },
    {
      "depth": 4,
      "text": "Master Linux",
      "anchor": "master-linux",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#master-linux"
    },
    {
      "depth": 4,
      "text": "Slave Windows",
      "anchor": "slave-windows",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#slave-windows"
    },
    {
      "depth": 4,
      "text": "Slave MacOS",
      "anchor": "slave-macos",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#slave-macos"
    },
    {
      "depth": 3,
      "text": "Pipeline中通过environment字段",
      "anchor": "pipeline中通过environment字段",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#pipeline%E4%B8%AD%E9%80%9A%E8%BF%87environment%E5%AD%97%E6%AE%B5"
    },
    {
      "depth": 2,
      "text": "Jenkins环境变量设置方式",
      "anchor": "jenkins环境变量设置方式",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#jenkins%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E8%AE%BE%E7%BD%AE%E6%96%B9%E5%BC%8F"
    },
    {
      "depth": 3,
      "text": "全局变量",
      "anchor": "全局变量",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F"
    },
    {
      "depth": 3,
      "text": "节点本身的环境变量",
      "anchor": "节点本身的环境变量",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#%E8%8A%82%E7%82%B9%E6%9C%AC%E8%BA%AB%E7%9A%84%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F"
    },
    {
      "depth": 4,
      "text": "在Jenkins中设置全局变量",
      "anchor": "在jenkins中设置全局变量",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#%E5%9C%A8jenkins%E4%B8%AD%E8%AE%BE%E7%BD%AE%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F"
    },
    {
      "depth": 4,
      "text": "使用Initialization files",
      "anchor": "使用initialization-files",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#%E4%BD%BF%E7%94%A8initialization-files"
    },
    {
      "depth": 3,
      "text": "某个Project的环境变量",
      "anchor": "某个project的环境变量",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#%E6%9F%90%E4%B8%AAproject%E7%9A%84%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F"
    },
    {
      "depth": 4,
      "text": "Pipeline脚本中使用",
      "anchor": "pipeline脚本中使用",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#pipeline%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8"
    },
    {
      "depth": 4,
      "text": "shell脚本中设置",
      "anchor": "shell脚本中设置",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#shell%E8%84%9A%E6%9C%AC%E4%B8%AD%E8%AE%BE%E7%BD%AE"
    },
    {
      "depth": 3,
      "text": "某个Shell进程（会话）的环境变量",
      "anchor": "某个shell进程会话的环境变量",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#%E6%9F%90%E4%B8%AAshell%E8%BF%9B%E7%A8%8B%E4%BC%9A%E8%AF%9D%E7%9A%84%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F"
    },
    {
      "depth": 2,
      "text": "内置环境变量",
      "anchor": "内置环境变量",
      "citation": "https://www.pystone.net/notes/jenkins-user-env-variable-issues/#%E5%86%85%E7%BD%AE%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:software-engineering-and-quality",
      "title": "软件工程与质量保障",
      "url": "https://www.pystone.net/notes/software-engineering-and-quality/",
      "atlas": "https://www.pystone.net/?node=software-engineering-and-quality#knowledge-atlas",
      "label": "软件工程与质量保障",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "CI-CD与质量保障/CI-CD工具链中的“【Jenkins】用户与环境变量问题”导航项",
      "citation": "https://www.pystone.net/notes/software-engineering-and-quality/#ci-cd%E4%B8%8E%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9Cci-cd%E5%B7%A5%E5%85%B7%E9%93%BE"
    }
  ],
  "contentMarkdown": "# 【Jenkins】用户与环境变量问题\n\n﻿# 【Jenkins】用户与环境变量问题\n\n> 创建时间：2021/7/6 16:08\n\n* 综述\n  * Jenkins运行Shell的机制\n    * SSH远程登录与环境变量\n    * 运行shell脚本\n    * 修改What shell is used\n  * Jenkins不同层次环境变量的加载特性和时机\n    * 全局配置、节点配置和节点本身环境变量之间的关系\n    * 节点本身环境变量加载方式\n      * Master Windows\n      * Master Linux\n      * Slave Windows\n      * Slave MacOS\n    * Pipeline中通过environment字段\n  * Jenkins环境变量设置方式\n    * 全局变量\n    * 节点本身的环境变量\n      * 在Jenkins中设置全局变量\n      * 使用Initialization files\n    * 某个Project的环境变量\n      * Pipeline脚本中使用\n      * shell脚本中设置\n    * 某个Shell进程（会话）的环境变量\n  * 内置环境变量\n\n## 综述\n\nJenkins下自动运行shell/bat与手动运行、在命令行/终端下运行的区别主要在于两点：\n\n  * 登陆的用户身份不同，导致权限不同\n  * 加载的环境变量不同，导致一些命令无法找到，或者运行结果出错\n\n## Jenkins运行Shell的机制\n\n### SSH远程登录与环境变量\n\nJenkins使用SSH远程登录Unix系统时，实质上是直接在SSH登录的命令中加入了指令，属于non-interactive + non-login shell，类似于以下语句：\n\n```csharp\nstring a = &quot;test&quot;;\nstring tmp = &quot;est&quot;;\nstring b = &quot;t&quot; + tmp;\nConsole.WriteLine(string .ReferenceEquals(str1, str2));\n\n```\n\n因此， **不会读取任何文件** （profile等）\n因此，Jenkins远程执行任务，使用的环境变量只能使用Jenkins来配置，用户在profile等文件中配置的变量是无效的。有两种思路：\n\n  * 直接设置环境变量。\n  * 使用source指令，使profile或rc文件生效。\n\n### 运行shell脚本\n\nJenkins运行Shell命令的机制与以下代码类似，每执行一段sh命令，shell都会启动一个sh程序，传入参数来执行。\n\n![](assets/0028 - 【Jenkins】用户与环境变量问题__resource-001-2af138a09e6a.png)\n\n```csharp\nstring a = &quot;test&quot;;\nstring tmp = &quot;est&quot;;\nstring b = &quot;t&quot; + tmp;\nConsole.WriteLine(string .ReferenceEquals(str1, str2));\n\n```\n\n### 修改What shell is used\n\n方法一：Manage Jenkins --> Configure System --> Shell executable\n\n> （不推荐）因为这会修改在所有节点上运行shell的路径，如果windows和linux系统混用，会导致出错。\n\n方法二：declare your shell on the first line of your script as you do in any shell script file:\n\n```csharp\nstring a = &quot;test&quot;;\nstring tmp = &quot;est&quot;;\nstring b = &quot;t&quot; + tmp;\nConsole.WriteLine(string .ReferenceEquals(str1, str2));\n\n```\n\n## Jenkins不同层次环境变量的加载特性和时机\n\n### 全局配置、节点配置和节点本身环境变量之间的关系\n\n  * 全局配置：Config System当中设置Global properties -> Environment variables\n  * 节点配置：可以在某个节点设置Configure -> Environment variables\n  * 节点本身：Jenkins启动某个节点时，会加载这个节点上的环境变量。\n\n全局配置和节点配置都可以引用节点本身的环境变量。节点本身的环境变量在初始化时就会加载好，而配置当中环境变量的设定在此之后。\n全局配置和节点配置的环境变量，如果名称不同，并且在不出现循环引用的情况下，可以互相引用。\n如果名称相同，优先使用节点的配置，全局的配置不生效。节点配置中的环境变量所引用的环境变量来自全局配置，还是来及节点本身，笔者暂时没有确定，两种情况似乎都会出现。\n\n总之，Jenkins中对全局、节点配置的环境变量都可以引用节点本身的环境变量，全局和节点的配置也可以相互引用，但是初始化顺序不明确，如果出现循环引用，会产生多次递归现象。\n\n### 节点本身环境变量加载方式\n\n#### Master Windows\n\nJenkins以服务的形式安装运行，系统变量会加载，用户变量不会被加载。修改了环境变量后，需要重启Jenkins才能加载到。\n\n#### Master Linux\n\n以用户jenkins的身份登录，大多数环境变量都是与Jenkins自身有关的，基本不会加载什么用户配置文件里的环境变量。\n\n#### Slave Windows\n\n在Windows节点上环境变量会加载的比较全。系统变量和用户变量都会被加载到。\n双击运行或者cmd运行，就是以当前登录的用户身份运行的，系统变量和用户变量都会被加载到。\n如果命令行运行，那么在命令行设置过的环境变量会被继承。\n\n#### Slave MacOS\n\n**不会读取任何环境变量配置文件** 。可以在Prefix Start Agent Command中进行设置。\n\n### Pipeline中通过environment字段\n\n通过Enviroment字段的方式设置的环境变量，不能引用已有的环境变量。\n设置代码如下：\n\n```csharp\nstring a = &quot;test&quot;;\nstring tmp = &quot;est&quot;;\nstring b = &quot;t&quot; + tmp;\nConsole.WriteLine(string .ReferenceEquals(str1, str2));\n\n```\n\n打印结果：\n\n![](assets/0028 - 【Jenkins】用户与环境变量问题__resource-006-e9df4973a88e.png)\n\n## Jenkins环境变量设置方式\n\n  * 全局环境变量（所有节点，所有Job都生效的）\n  * 某个节点（node）的环境变量\n  * 某个项目（project）的环境变量\n  * 某次构建（build）的环境变量\n\n### 全局变量\n\nManage Jenkins -> Global properties -> Environment variables -> Add\n\n### 节点本身的环境变量\n\nnode上执行的的所有 shell 命令都会继承这个node的环境变量。\n\n#### 在Jenkins中设置全局变量\n\nManage node -> Configure -> Environment variables -> List of variables -> Add\n\n![](assets/0028 - 【Jenkins】用户与环境变量问题__resource-002-a29fc8a59bf2.png)\n\n这个环境变量在构建(Build)执行时候才生效。\n\n#### 使用Initialization files\n\n如果 Launch agents via SSH，可以在节点的配置中添加命令来加载profile文件：\nConfigure -> Launch method -> Launch Launch agents via SSH -> Prefix Start Agent Command\n\n> 注意：每条语句都要使用分号结尾\n\n![](assets/0028 - 【Jenkins】用户与环境变量问题__resource-003-63fd855a5ab5.png)\n\nJenkins会在启动代理进程时，将上述命令加入到shell语句当中\n\n```csharp\nstring a = &quot;test&quot;;\nstring tmp = &quot;est&quot;;\nstring b = &quot;t&quot; + tmp;\nConsole.WriteLine(string .ReferenceEquals(str1, str2));\n\n```\n\n环境变量会加到这个Node的Environment Variable列表中：\n\n![](assets/0028 - 【Jenkins】用户与环境变量问题__resource-004-5d201cbc834b.png)\n\n### 某个Project的环境变量\n\n#### Pipeline脚本中使用\n\n可以在各个级别上设置环境变量\n\n![](assets/0028 - 【Jenkins】用户与环境变量问题__resource-005-ceb5c8dfbadf.png)\n\n#### shell脚本中设置\n\n可以通过-i参数和-l参数让bash为login shell and interactive shell，就可以读取/etc/profile和~/.bash_profile等文件。\n\n即在jenkins Execute Shell里可以这么写\n\n```csharp\nstring str1 = String.Empty;\nstring str2 = String.Empty;\n\nstr2 = String.Intern(sb.ToString());\n\nif((object)str1==(object)str2)\n    Console.WriteLine(&quot;The strings are equal.&quot;);\nelse\n    Console.WriteLine(&quot;The strings are not equal.&quot;);\n\n```\n\n### 某个Shell进程（会话）的环境变量\n\n  * 可以使用export命令设置\n  * 可以使用Initialization files - 在shell命令前添加描述\n\n```csharp\nstring str1 = String.Empty;\nstring str2 = String.Empty;\n\nstr2 = String.Intern(sb.ToString());\n\nif((object)str1==(object)str2)\n    Console.WriteLine(&quot;The strings are equal.&quot;);\nelse\n    Console.WriteLine(&quot;The strings are not equal.&quot;);\n\n```\n\n## 内置环境变量\n\n```csharp\nstring str1 = String.Empty;\nstring str2 = String.Empty;\n\nstr2 = String.Intern(sb.ToString());\n\nif((object)str1==(object)str2)\n    Console.WriteLine(&quot;The strings are equal.&quot;);\nelse\n    Console.WriteLine(&quot;The strings are not equal.&quot;);\n\n```\n```csharp\nstring str1 = String.Empty;\nstring str2 = String.Empty;\n\nstr2 = String.Intern(sb.ToString());\n\nif((object)str1==(object)str2)\n    Console.WriteLine(&quot;The strings are equal.&quot;);\nelse\n    Console.WriteLine(&quot;The strings are not equal.&quot;);\n\n```\n"
}
