专栏首页donghui的博客Jenkins获取JENKINS_HOME过程

Jenkins获取JENKINS_HOME过程

JENKINS_HOME是Jenkins的主目录。

在Jenkins上查看JENKINS_HOME:

系统管理→系统设置→主目录  (<JENKINS_URL>/configure页面)

如上图帮助文档所示:

Jenkins储存所有的数据文件在这个目录下. 你可以通过以下几种方式更改:

  1. 使用你Web容器的管理工具设置JENKINS_HOME环境参数.
  2. 在启动Web容器之前设置JENKINS_HOME环境变量.
  3. (不推荐)更改Jenkins.war(或者在展开的Web容器)内的web.xml配置文件.

这个值在Jenkins运行时是不能更改的. 其通常用来确保你的配置是否生效.

查看Jenkins的WEB-INF/web.xml,可以得知Jenkins主对象为hudson.WebAppMain:

查看WebAppMain.java的源码,getHomeDir方法即用来确定Jenkins的主目录,其逻辑如下:

鉴于Hudson是Jenkins的前身,所以为了兼容Jenkins主目录的名称有:JENKINS_HOME或HUDSON_HOME

private static final String[] HOME_NAMES = {"JENKINS_HOME","HUDSON_HOME"};

  1. 首先,会在JNDI(可在web.xml配置文件中配置)中查找JENKINS_HOME或HUDSON_HOME
  2. 其次会在系统属性中查找JENKINS_HOME或HUDSON_HOME
  3. 接着会在环境变量中查找JENKINS_HOME或HUDSON_HOME
  4. 最后,如果上述都找不到,会默认选择 $user.home/.jenkins为JENKINS_HOME($user.home/.hudson为HUDSON_HOME)

附:WebAppMain.java的getHomeDir方法源码

   /**
     * Determines the home directory for Jenkins.
     *
     * <p>
     * We look for a setting that affects the smallest scope first, then bigger ones later.
     *
     * <p>
     * People makes configuration mistakes, so we are trying to be nice
     * with those by doing {@link String#trim()}.
     * 
     * <p>
     * @return the File alongside with some description to help the user troubleshoot issues
     */
    public FileAndDescription getHomeDir(ServletContextEvent event) {
        // check JNDI for the home directory first
        for (String name : HOME_NAMES) {
            try {
                InitialContext iniCtxt = new InitialContext();
                Context env = (Context) iniCtxt.lookup("java:comp/env");
                String value = (String) env.lookup(name);
                if(value!=null && value.trim().length()>0)
                    return new FileAndDescription(new File(value.trim()),"JNDI/java:comp/env/"+name);
                // look at one more place. See issue #1314
                value = (String) iniCtxt.lookup(name);
                if(value!=null && value.trim().length()>0)
                    return new FileAndDescription(new File(value.trim()),"JNDI/"+name);
            } catch (NamingException e) {
                // ignore
            }
        }

        // next the system property
        for (String name : HOME_NAMES) {
            String sysProp = System.getProperty(name);
            if(sysProp!=null)
                return new FileAndDescription(new File(sysProp.trim()),"System.getProperty(\""+name+"\")");
        }

        // look at the env var next
        for (String name : HOME_NAMES) {
            String env = EnvVars.masterEnvVars.get(name);
            if(env!=null)
                return new FileAndDescription(new File(env.trim()).getAbsoluteFile(),"EnvVars.masterEnvVars.get(\""+name+"\")");
        }

        // otherwise pick a place by ourselves

        String root = event.getServletContext().getRealPath("/WEB-INF/workspace");
        if(root!=null) {
            File ws = new File(root.trim());
            if(ws.exists())
                // Hudson <1.42 used to prefer this before ~/.hudson, so
                // check the existence and if it's there, use it.
                // otherwise if this is a new installation, prefer ~/.hudson
                return new FileAndDescription(ws,"getServletContext().getRealPath(\"/WEB-INF/workspace\")");
        }

        File legacyHome = new File(new File(System.getProperty("user.home")),".hudson");
        if (legacyHome.exists()) {
            return new FileAndDescription(legacyHome,"$user.home/.hudson"); // before rename, this is where it was stored
        }

        File newHome = new File(new File(System.getProperty("user.home")),".jenkins");
        return new FileAndDescription(newHome,"$user.home/.jenkins");
    }

此外,在Tomcat/logs/stdout_YYYYMMDD.log中有如下日志:

Jenkins home directory: F:\JENKINS_HOME found at: EnvVars.masterEnvVars.get("JENKINS_HOME")

这与getHomeDir方法的相应源码对应:

System.out.println("Jenkins home directory: "+home+" found at: "+describedHomeDir.description);

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 每日备份JENKINS_HOME至SVN 顶

    ###JENKINS_HOME目录结构### Jenkins的相关文件都存放在文件系统中,而JENKINS_HOME主要用来存放这些文件的,如系统配置文件、插件...

    donghui
  • Docker Remote API简单使用 原

    默认情况下,Docker daemon监听unix://var/run/docker.sock,并且客户端必须有root权限用来与daemon交互。

    donghui
  • FastAPI 作为集大成者,它的灵感来自哪里?

    人生苦短,我用 Python。 在看到 FastAPI 在首期「OSC 开源软件趋势榜」名列前茅,作为一个 Pythoner,顿时对它产生了浓厚的兴趣,于是立即...

    donghui
  • 容器技术|Docker三剑客之docker-swarm

    Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Do...

    民工哥
  • Python情感分析:鹿晗的粉丝们究竟原谅他了吗?

    国庆长假的最后一天,鹿晗在微博上公开宣布和关晓彤的恋情。消息来得太突然,不仅粉丝圈里炸了,顺带连微博服务器也给炸了。在此心疼新浪运维工程师一秒,放个假都不能省心...

    Crossin先生
  • 监控现场无固定IP及公有云服务器如何通过手机查看视频直播?

    了解我们产品的小伙伴都知道,Easy系列产品是真正做到灵活部署,简单易用的,在小的场景中可以独立使用,既是能力平台也可以作为业务平台使用,当涉及到复杂场景时,又...

    EasyNVR
  • Leetcode: Construct Binary Tree from Inorder and Postorder Traversal

    题目: Given inorder and postorder traversal of a tree, construct the binary tree...

    卡尔曼和玻尔兹曼谁曼
  • FFmpeg使用手册 - ffplay 的常用命令

    在编译FFmpeg源代码时,如果系统中包含了SDL-1.2版本时,会默认将ffplay编译生成出来,如果不包含SDL-1.2或者版本不是SDL-1.2时,无...

    用户3765803
  • 一行命令实现cpu占用率100%

    cat /proc/cpuinfo |grep "physical id" | wc -l 可以获得CPU的个数, 我们将其表示为N.

    用户3148498
  • 【leetcode】Maximum Depth of Binary Tree

    Given a binary tree, find its maximum depth.

    阳光岛主

扫码关注云+社区

领取腾讯云代金券