Jenkins 中文社区

  • 博客
  • 活动
  • 关于我们
  • Jenkins 官网
Star

翟志军

《Jenkins 2.x实践指南》作者,购买地址:https://item.jd.com/12512889.html?dist=jd

此页面上的内容

      • 背景
      • 期望实现的目标
      • 实现方式
      • 会遇到的坑
        • 需要适配只认 Jenkins 凭证的插件
        • 对凭证本身的加密
      • 小结

基于 Jenkins 的 DevOps 平台应该如何设计凭证管理

一种基于 Jenkins 的 DevOps 平台建设思路

背景

了解到行业内有些团队是基于 Jenkins 开发 DevOps 平台。而基于 Jenkins 实现的 DevOps 平台,就不得不考虑凭证的管理问题。

本文就此问题进行讨论,尝试找出相对合理的管理凭证的方案。

一开始我们想到的方案可能是这样的:用户在 DevOps 平台增加凭证后,DevOps 再将凭证同步到 Jenkins 上。Jenkins 任务在使用凭证时,使用的是存储在 Jenkins 上的凭证,而不是 DevOps 平台上的。

但是,仔细想想,这样做会存在以下问题: * Jenkins 与 DevOps 平台之间的凭证数据会存在不一致问题。 * 存在一定的安全隐患。通过 Jenkins 脚本命令行很容易就把所有密码的明文拿到。哪天 Jenkins 被注入了,所有的凭证一下子就被扒走。 * 无法实现 Jenkins 高可用,因为凭证存在 Jenkins master 机器上。

那么,有没有更好的办法呢?

期望实现的目标

先定我们觉得更合理的目标,然后讨论如何实现。以下是笔者觉得合理的目标: > 用户还是在 DevOps 管理自己的凭证。但是 DevOps 不需要将自己凭证同步到 Jenkins 上。Jenkins 任务在使用凭证时,从 DevOps 上取。

实现方式

Jenkins 有一个 Credentials Binding Plugin 插件,在 Jenkins pipeline 中的用法如下:

withCredentials([usernameColonPassword(credentialsId: 'mylogin', variable: 'USERPASS')]) {
    sh '''
      curl -u "$USERPASS" https://private.server/ > output
    '''
  }

withCredentials 方法做的事情就是从 Jenkins 的凭证列表中取出 id 为 mylogin 的凭证,并将值赋到变量名为 USERPASS 的变量中。接下来,你就可以在闭包中使用该变量了。

说到这里,不知道读者朋友是否已经有思路了?

思路就是实现一个和 Credentials Binding Plugin 插件类似功能的方法,比如叫 zWithCredentials(后文还会提到)。与 withCredentials 不同的是,zWithCredentials 根据凭证 id 获取凭证时,不是从 Jenkins 上获取,而是从 DevOps 平台获取。

会遇到的坑

需要适配只认 Jenkins 凭证的插件

withCredentials 方法是将凭证的内容存到变量中,这可以满足一大部分场景。但是有一种场景是无法满足的。就是某些 Jenkins 插件的步骤接收参数时,参数值必须是 Jenkins 凭证管理系统中的 id。比如 git 步骤中 credentialsId 参数:

git branch: 'master',
    credentialsId: '12345-1234-4696-af25-123455',
    url: 'ssh://git@bitbucket.org:company/repo.git'

这种情况,我们不可能修改现有的插件。因为那样做的成本太高了。

那怎么办呢?

笔者想到的办法是在 zWithCredentials 中做一些 hack 操作。也就是 zWithCredentials 除了从 DevOps 平台获取凭证,还在 Jenkins 中创建一个 Jenkins 凭证。在 Jenkins 任务执行完成后,再将这个临时凭证删除。这样就可以适配那些只认 Jenkins 凭证 id 的插件了。

对凭证本身的加密

DevOps 平台在存储凭证、传输凭证给 Jenkins 时,都需要对凭证进行加密。至于使用何种加密方式,交给读者思考了。

小结

以上解决方案对 Jenkins 本身的改造几乎没有,我们只通过一个插件就解耦了 Jenkins 的凭证管理和 DevOps 平台的凭证管理。

思路已经有了。具体怎么实现,由于一些原因不能开源,虽然实现起来不算难。还请读者见谅。

最后,希望能和遇到同样问题的同学进行交流。看看是否还可以有更好的设计思路。

“基于 Jenkins 的 DevOps 平台应该如何设计凭证管理” 更新于:May 14, 2019
原文作者:zacker330
改善此页
  • Tags:
  • jenkins
  • devops
  • 如何对 Jenkins 共享库进行单元测试
  • Related entries:
  • 基于 Jenkins + JaCoCo 实现功能测试代码覆盖率统计
  • 使用 Jenkins + Ansible 实现 Spring Boot 自动化部署101
  • 从 Jenkins 到 Jenkins X
  • 19年 GSoC 中 Jenkins 的七个项目
  • Jenkins 公众号送书福利
  • Jenkins 版本发布
  • Jenkins 插件开发之旅:两天内从 idea 到发布(下篇)
  • Jenkins 自动化安装插件
  • Jenkins 插件开发之旅:两天内从 idea 到发布(上篇)
  • 使用 Jenkins X 渐进式交付:自动化金丝雀部署
  • 使用 Jenkins X 渐进式交付
  • 使用 Jenkins + Ansible 实现自动化部署 Nginx
  • 关于 Jenkins master 共享 JENKINS_HOME 目录的实验
  • 持续交付的商业价值
  • 使用 Zabbix 监控 Jenkins
  • 简析 Jenkins 专有用户数据库加密算法
  • Java 应用使用 Docker 的入门指南:建立一个 CI/CD 流水线
  • 介绍:成为一名 Jenkins 贡献者的旅程
  • Electron 应用的流水线设计
  • 为 Continuous Delivery Foundation 的成立感到兴奋
  • MPL - 模块化的流水线库
  • 批量修改 Jenkins 任务的技巧
  • 在安全防火墙内通过 WebHook 触发构建
由 Jenkins 社区贡献者 维护
  • File an Issue
  • @suren69811254
  • YouTube
 

Jenkins® is a registered trademark of Software in the Public Interest, Inc.

Copyright 2018–2019 the original authors.

  • 博客
  • 活动
  • 关于我们
  • Jenkins 官网