如何在Linux利用Jenkins构建CI-CD自动化发布流水线

如何在Linux利用Jenkins构建CI-CD自动化发布流水线p p jenkins agent 连接失败主因是 master 未启用 jnlp 协议 需勾选 allow tcp port for inbound agents pipeline 拉取私有 git 应用 credentialsi 配置 ssh 凭据 部署需用目标用户免密 ssh 执行 rsync 与 systemctl docker

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。



 

jenkins agent 连接失败主因是 master 未启用 jnlp 协议,需勾选“allow tcp port for inbound agents”;pipeline 拉取私有 git 应用 credentialsid 配置 ssh 凭据;部署需用目标用户免密 ssh 执行 rsync 与 systemctl;docker build 失败因 agent 用户未加入 docker 组或未挂载 socket。

如何在linux利用jenkins构建ci-cd自动化发布流水线

多数人卡在第一步:Jenkins master 装好了,但 jenkins-agent 启动后立刻断连,日志里反复出现 Connection refusedFailed to connect to master。根本原因不是权限或防火墙,而是默认配置下 Jenkins master 没开启 JNLP 代理协议支持。

实操建议:

  • 进 Jenkins 管理界面 → Manage JenkinsSecurity → 勾选 Agents 下的 Allow TCP port for inbound agents(别只改端口数字,必须勾选)
  • 确认 jenkins-agent.jar 启动时用的是 -jnlpUrl 而非 -url(后者是旧版 Web UI 连接方式,已弃用)
  • Linux 上运行 agent 的用户不能是 root(Jenkins 默认禁用),用 sudo -u jenkins java -jar jenkins-agent.jar … 更稳妥

git clone 在 pipeline 中失败,常见报错是 Permission denied (publickey)fatal: could not read Username —— 这说明凭证没进对上下文。Jenkins 的凭据(Credentials)不会自动透传到 shell 执行环境,尤其当用 sh 步骤调用 git 命令时。

实操建议:

  • 不要在 sh 里手动写 git clone https://user:/...,Token 明文暴露且易过期
  • 在 pipeline 中用 checkout scm 或显式指定 credentialsId
    checkout([ $class: ‘GitSCM’, branches: [[name: ‘*/main’]], doGenerateSubmoduleConfigurations: false, extensions: [], userRemoteConfigs: [[

url: ':org/repo.git', credentialsId: 'ssh-key-id-in-jenkins' 

]] ])

  • SSH 凭据必须是 Jenkins 管理界面中添加的 SSH Username with private key 类型,且私钥不能带密码(Jenkins 不支持交互式解密)
  • 很多人用 scprsync 直接推,结果遇到权限混乱、路径不存在、SELinux 拦截等问题。关键不是“能不能传”,而是“谁在传、传到哪、以什么身份落地”。

    实操建议:

    • 远程目标机器上提前建好部署用户(如 deploy),并配置免密 SSH 登录(用 Jenkins agent 所在机器的公钥)
    • 别在 sh 里写 sudo rsync —— Jenkins agent 通常没配 NOPASSWD,会卡住;改用部署用户自己的家目录做中转,再用 chown + systemctl restart 完成服务切换
    • 推荐用 ssh 单行命令组合,避免中间状态残留:
      sh "ssh deploy@prod-server ‘mkdir -p /opt/myapp/releases/\({BUILD_ID} && rsync -av --delete ./target/app.jar deploy@prod-server:/opt/myapp/releases/\){BUILD_ID}/ && ln -sfn /opt/myapp/releases/${BUILD_ID} /opt/myapp/current && systemctl restart myapp.service’"

    Jenkins agent 进程默认不在 docker 用户组里,即使宿主机装了 Docker,sh ‘docker build’ 也会因 socket 权限被拒。这不是 Docker 服务没启,而是 Unix socket 文件(/var/run/docker.sock)的属组访问控制生效了。

    实操建议:

    • 把运行 agent 的用户加进 docker 组:sudo usermod -aG docker jenkins,然后重启 agent 进程(不是 reload)
    • 如果用容器化 agent(比如 jenkins/inbound-agent 镜像),必须挂载 /var/run/docker.sock:/var/run/docker.sock,且镜像内用户 UID 要匹配宿主机 docker 组 GID
    • 避免在 pipeline 里用 docker login 存凭据 —— 改用 Jenkins 的 Docker Server Credentials 插件绑定 registry 凭据,再通过 withDockerRegistry 块调用

    整个链路最易被忽略的点:Jenkins agent 的工作目录权限、远程服务器上部署用户的 $HOME/.ssh/known_hosts 是否预置了目标主机指纹、以及所有 shell 步骤里的路径是否都用了绝对路径(pwd 在 pipeline 中不可靠)。这些细节不提前压平,流水线会在看似无关的环节突然静默失败。

    小讯
    上一篇 2026-04-08 19:56
    下一篇 2026-04-08 19:54

    相关推荐

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
    如需转载请保留出处:https://51itzy.com/kjqy/251693.html