You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jenkins Groovy脚本中检测Linux VM的Chrome并按需安装?

在Jenkins Groovy流水线中按需安装Chrome的解决方案

嗨,作为前端开发人员,我完全理解你在搭建Angular E2E测试流水线时遇到的痛点——毕竟在不确定的Jenkins节点环境里,确保依赖存在确实很头疼。下面我会一步步帮你实现“检测到Chrome未安装才执行安装”的逻辑,同时兼顾不同Linux发行版的兼容性:

核心思路

我们可以在Groovy脚本中通过执行shell命令检测Chrome是否存在,根据命令的返回状态码判断是否需要触发安装流程。这样既不会每次重复安装,也能适配不同的虚拟机节点。


1. 编写Chrome检测函数

首先写一个Groovy函数,用来验证Chrome是否已正确安装:

def isChromeInstalled() {
    // 先检查Chrome可执行文件是否在系统路径中
    def chromeExists = sh(script: 'which google-chrome || which chromium-browser', returnStatus: true)
    if (chromeExists != 0) {
        return false
    }
    // 进一步验证Chrome能否正常执行(避免存在损坏的安装)
    def chromeWorks = sh(script: 'google-chrome --version || chromium-browser --version', returnStatus: true)
    return chromeWorks == 0
}
  • which命令用来查找Chrome的可执行文件路径,返回0表示找到;
  • 额外检查版本命令的执行状态,确保Chrome不是损坏的安装包。

2. 编写跨发行版的Chrome安装函数

因为不同Linux发行版(如Ubuntu/CentOS)的包管理命令不同,我们需要先检测发行版类型,再执行对应的安装流程:

def installChrome() {
    // 先更新包索引(可选,但能避免安装失败)
    sh 'sudo apt update || sudo yum update -y'

    // 检测当前Linux发行版
    def distro = sh(
        script: 'lsb_release -is || cat /etc/os-release | grep -E "^ID=" | cut -d= -f2',
        returnStdout: true
    ).trim().toLowerCase()

    // 根据发行版执行安装命令
    if (distro in ['ubuntu', 'debian', 'linuxmint']) {
        sh '''
            sudo apt install -y wget gnupg2
            # 添加Google官方签名密钥
            wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
            # 添加Chrome软件源
            echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
            sudo apt update
            # 安装稳定版Chrome
            sudo apt install -y google-chrome-stable
        '''
    } else if (distro in ['centos', 'rhel', 'fedora']) {
        sh '''
            sudo yum install -y wget
            # 下载Chrome RPM包
            wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
            # 安装RPM包(自动处理依赖)
            sudo yum install -y ./google-chrome-stable_current_x86_64.rpm
            # 清理安装包
            rm -f google-chrome-stable_current_x86_64.rpm
        '''
    } else {
        error "Unsupported Linux distribution: ${distro} - 请手动添加对应发行版的Chrome安装命令"
    }
}

3. 在流水线中整合逻辑

把上面的函数嵌入到你的Jenkins流水线脚本中,在测试前的准备阶段执行检测和安装:

pipeline {
    agent any // 适配不确定的虚拟机节点
    stages {
        stage('Prepare Testing Environment') {
            steps {
                script {
                    if (!isChromeInstalled()) {
                        echo "⚠️ Chrome未检测到,开始自动安装..."
                        installChrome()
                        echo "✅ Chrome安装完成!"
                    } else {
                        def chromeVersion = sh(
                            script: 'google-chrome --version || chromium-browser --version',
                            returnStdout: true
                        ).trim()
                        echo "✅ Chrome已安装: ${chromeVersion}"
                    }
                }
            }
        }

        stage('Install Dependencies & Run E2E Tests') {
            steps {
                // 安装前端依赖
                sh 'npm install'
                // 自动安装匹配版本的ChromeDriver(Protractor需要)
                sh 'npx webdriver-manager update --versions.chrome=$(google-chrome --version | cut -d " " -f3)'
                // 执行Protractor E2E测试(确保配置了无头模式)
                sh 'ng e2e'
            }
        }
    }
}

关键注意事项

🔑 Jenkins节点权限问题

安装Chrome需要sudo权限,你需要确保Jenkins用户拥有免密sudo权限(推荐),或者通过Jenkins凭据管理传递sudo密码:

withCredentials([string(credentialsId: 'jenkins-sudo-pass', variable: 'SUDO_PASSWORD')]) {
    sh "echo ${SUDO_PASSWORD} | sudo -S apt install -y google-chrome-stable"
}

绝对不要把密码硬编码在脚本里!

🖥️ Protractor无头模式配置

因为Jenkins是无头环境,必须在protractor.conf.js中配置Chrome无头运行:

exports.config = {
    capabilities: {
        browserName: 'chrome',
        chromeOptions: {
            args: [
                '--headless', // 无头模式
                '--no-sandbox', // 非root用户运行需要
                '--disable-dev-shm-usage', // 避免内存不足问题
                '--disable-gpu' // 无头模式下无需GPU加速
            ]
        }
    },
    // 其他测试配置...
}

🚀 ChromeDriver版本匹配

用webdriver-manager自动安装与当前Chrome版本匹配的ChromeDriver,避免版本不兼容导致测试失败。

内容的提问来源于stack exchange,提问作者Tom Oakley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:53:01