以自动化方式为您的团队设置和配置 Jenkins






4.50/5 (3投票s)
提供使用 Ansible 自动配置构建服务器的方法。
背景
如今,持续集成是敏捷软件开发生命周期中的重要组成部分。市面上有许多工具:Atlassian Bamboo、Jenkins、Jetbrains TeamCity。在我看来,Jenkins 拥有最理想的产品社区和一套真正有用的插件,适合您的大部分软件项目:您可以构建软件、部署软件,
将网站、门户部署到各种地方,包括 AWS、DigitalOcean、裸机服务器或运行单元测试。它可以与您选择的通信工具集成,如 Slack、HipChat 或电子邮件。
如果您以前没有机会尝试过 Jenkins,请随时使用下面的教程开始。
手动安装
为了安装 Jenkins,我们需要
- 一个 Unix 系统。我推荐基于 Debian 的系统,如 Ubuntu Server LTS
- 安装 Java 运行时环境。我通常使用 Java 8
- 获取基础 Jenkins 设置
- 安装必要的插件
-
将其部署在 Web 服务器后面。
安装 Java
安装 Java 最简单的方法是使用 apt-get 包管理器
sudo apt-get install python-software-properties sudo add-apt-repository ppa:webupd8team/java sudo apt-get update
添加上述 PPA 后,您可以使用以下命令安装 Java
sudo apt-get install oracle-java8-installer
获取基础 Jenkins 设置
您需要执行一系列命令,即:添加 Jenkins 签名密钥、注册 Jenkins apt 源、更新包列表,以及安装 Jenkins 包。
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - sudo echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list sudo apt-get update sudo apt-get install jenkins
默认情况下,它将安装基础 Jenkins 设置,这是不安全的。您需要访问安装 Jenkins 的主机,例如:http://jenkins-host:8080/。导航到“管理 Jenkins”(在左侧),然后在加载的页面上选择“配置全局安全”项。
现在向下看“基于 Matrix 的安全”(如果之前未选中,请选中它),并确保“匿名用户”在“视图”组下只有“读取”权限。点击页面底部的“保存”。页面加载后,您将看到一个登录表单,只需忽略它,然后转到主页(例如:http://jenkins-host:8080/)。您将看到此注册表单,第一个注册的帐户将是管理员。
插件的威力。
没有插件,Jenkins 就不会如此强大。我通常默认安装以下插件
-
bitbucket BitBucket 插件旨在提供 BitBucket 和 Jenkins 之间的集成。BitBucket 提供 Jenkins Hook,但这只能在提交时触发特定作业的构建,仅此而已。BitBucket 插件,就像 GitHub 插件已经做的那样,使用 POST Hook 有效负载来检查哪些作业需要基于更改的存储库/分支来触发。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/BitBucket+Plugin -
bitbucket-pullrequest-builder 此插件构建来自 Bitbucket.org 的拉取请求。如果您对每个提交的拉取请求执行 QA 部署,则必须安装此插件。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/Bitbucket+pullrequest+builder+plugin -
build-pipeline-plugin 此插件提供了一个构建管道视图,显示通常构成构建管道的上游和下游连接的作业。此外,它还提供了定义手动触发器以在执行前需要干预的作业(例如,Jenkins 之外的批准流程)的能力。提供良好的路径和流程可视化。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/Build+Pipeline+Plugin -
copyartifact 添加一个构建步骤以从另一个项目复制构件。该插件允许您指定要从中复制构件的构建(例如,最后一次成功/稳定的构建,按构建号或按构建参数)。您还可以通过过滤要复制的文件、在目标项目中指定目标目录等来控制复制过程。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/Copy+Artifact+Plugin - credentials 添加一个构建步骤以从另一个项目复制构件。该插件允许您指定要从中复制构件的构建(例如,最后一次成功/稳定的构建,按构建号或按构建参数)。您还可以通过过滤要复制的文件、在目标项目中指定目标目录等来控制复制过程。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/Credentials+Plugin - delivery-pipeline-plugin 可视化交付/构建管道,根据上游/下游作业渲染管道。当使用 Jenkins 作为构建服务器时,使用 Delivery Pipeline 插件现在可以使一个或多个交付管道在同一个视图中可视化,甚至全屏显示。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/Delivery+Pipeline+Plugin - environment-script Environment Script 插件允许您在 SCM 签出后、构建之前运行脚本。如果脚本失败(退出代码非零),则构建将被标记为失败。标准输出上的任何输出都将被解析为应用于构建的环境变量。它支持“覆盖语法”以将路径附加到 PATH 类变量。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/Environment+Script+Plugin - git 支持流行的 git 版本控制系统
- ghprb 此插件用于构建 GitHub 中的拉取请求。如果您的软件开发生命周期包括将拉取请求部署到 PR 环境进行测试,则必须安装此插件。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin -
greenballs 最有趣的插件 - 将 Jenkins 的成功构建图例从蓝色更改为绿色。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/Green+Balls -
hipchat 此插件允许您的团队设置将构建通知发送到 HipChat 房间。要启用通知,请将“HipChat 通知”添加为构建后步骤。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/HipChat+Plugin - junit 允许发布 JUnit 格式的测试结果。注意:许多工具,包括 Karma、PhpUNIT 和其他工具,都允许以 JUnit 格式发布测试结果。因此,对于单元测试流程来说,这是必备插件。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Plugin - matrix-auth 提供基于 Matrix 的安全授权策略(全局和按项目)。如果您有一个跨多个团队共享的构建服务器,则此插件很有用。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/Matrix+Authorization+Strategy+Plugin - parameterized-trigger 此插件允许您在构建完成后触发新的构建,并提供各种指定新构建参数的方法。您可以添加多个配置:每个配置都包含一个要触发的项目列表、一个触发它们的条件(基于当前构建的结果)以及一个参数部分。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin - rebuild 与上一个插件配合良好:此插件允许用户在不重新输入参数的情况下重新构建参数化构建。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/Rebuild+Plugin - ssh 您可以使用 SSH 插件通过 SSH 在远程机器上运行 shell 命令。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/SSH+plugin - s3 允许将构件上传到 S3,并提供多种选项。
插件页面:https://wiki.jenkins-ci.org/display/JENKINS/S3+Plugin - throttle-concurrents 此插件允许限制每个节点或全局项目并发构建的数量。不幸的是,对于 Node (0.10-0.12) 项目和 NPM 来说,这是一个必备插件——两个并发的 npm install 经常会失败。插件页面:https://wiki.jenkins-ci.org/display/JENKINS/Throttle+Concurrent+Builds+Plugin
插件使用“管理 Jenkins”部分中的插件管理器进行安装。
将其部署在 Web 服务器后面
我通常将 Jenkins 隐藏在 Nginx 后面。典型的配置如下所示
server { listen 443 ssl; server_name jenkins.vagrant.dev; ssl_certificate /etc/nginx/jenkins_selfsigned.crt; ssl_certificate_key /etc/nginx/jenkins_selfsigned.key; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; proxy_connect_timeout 150; proxy_send_timeout 100; proxy_read_timeout 100; } ... }
自动化安装
我每次都手动安装 Jenkins 吗?当然不是,我经常为我的客户这样做。使用 Ansible 和 sa-box-jenkins 角色,您可以在喝咖啡的时间内部署新的 Jenkins 安装。
让我们准备一个基本的引导项目,供您将来使用。它包含以下文件
- bootstrap.sh - 安装 Ansible 以及依赖项。
- init.sh - 初始化第三方依赖项
- .projmodules - 完全兼容 .gitmodules Git 语法,指定了 playbook 将使用的依赖项列表。特别是,它包含 Ansible - 默认情况下 developer_recipes(包含一组方便的部署配方)和一个名为 sa-box-bootstrap 的 Ansible 角色,负责框安全步骤(假设您计划将 Jenkins 放在远程主机上)。
[submodule "public/ansible_developer_recipes"] path = public/ansible_developer_recipes url = git@github.com:Voronenko/ansible-developer_recipes.git [submodule "roles/sa-box-bootstrap"] path = roles/sa-box-bootstrap url = git@github.com:softasap/sa-box-bootstrap.git [submodule "roles/sa-box-jenkins"] path = roles/sa-box-jenkins url = git@github.com:softasap/sa-box-jenkins.git
- *hosts* - 在此处列出提供给您服务器的初始框凭据。注意:jenkins-bootstrap 假定您拥有只有 root 访问权限的全新框。如果您的框已安全,请相应地调整凭据
[jenkins-bootstrap] jenkins_bootstrap ansible_ssh_host=192.168.0.17 ansible_ssh_user=yourrootuser ansible_ssh_pass=yourpassword [jenkins] jenkins ansible_ssh_host=192.168.0.17 ansible_ssh_user=jenkins
- jenkins_vars.yml - 在此处设置特定的环境覆盖,例如您喜欢的部署用户名和密钥。
- jenkins_bootstrap.yml - 第一步 - 框安全。创建 jenkins 用户,并使用 sa-box-bootstrap 角色保护框。有关 sa-box-bootstrap 角色的更多详细信息。为了覆盖 sa-box-bootstrap 的参数 - 像下面的示例一样传递参数。
- hosts: all vars_files: - ./jenkins_vars.yml roles: - { role: "sa-box-bootstrap", root_dir: "{{playbook_dir}}/public/ansible_developer_recipes", deploy_user: "{{jenkins_user}}", deploy_user_keys: "{{jenkins_authorized_keys}}" }
- *jenkins.yml* - 配置 Jenkins 的插件和用户的置备脚本。 - *jenkins_vars.yml* - Jenkins 部署的配置选项。 - *setup_jenkins.sh* - 调用分两步部署的 shell 脚本:初始框引导和 Jenkins 设置
#!/bin/sh ansible-playbook jenkins_bootstrap.yml --limit jenkins_bootstrap ansible-playbook jenkins.yml --limit jenkins
自动化安装的配置选项
您需要覆盖
- jenkins_authorized_keys(这是允许您使用 jenkins 用户登录 Jenkins 框的密钥列表)
- jenkins_domain - 您的代理域
- jenkins_host - jenkins 主机的名称(站点将绑定到 jenkins_host.jenkins_domain)
- java_version - 您的 Java 选择(支持 6、7、8)
jenkins_user: jenkins jenkins_authorized_keys: - "{{playbook_dir}}/components/files/ssh/vyacheslav.pub" jenkins_domain: "vagrant.dev" jenkins_host: "jenkins" java_version: 8
-jenkins_users - 要创建的用户及其密码列表。Admin 和 deploy 是必需的用户。Admin 用于管理实例,deploy 用于通过部署脚本访问构件。如果您不覆盖密码,将使用默认密码(按角色),这对于公共部署来说不是最佳选择。
jenkins_users: - { name: "Admin", password: "AAAdmin", email: "no-reply@localhost" } - { name: "deploy", password: "DeDeDeDeploy", email: "no-reply@localhost" }
- jenkins_plugins - 您选择要安装的插件。默认情况下
jenkins_plugins: - bitbucket # https://wiki.jenkins-ci.org/display/JENKINS/BitBucket+Plugin - bitbucket-pullrequest-builder - build-pipeline-plugin - copyartifact # https://wiki.jenkins-ci.org/display/JENKINS/Copy+Artifact+Plugin - credentials # https://wiki.jenkins-ci.org/display/JENKINS/Credentials+Plugin - delivery-pipeline-plugin # https://wiki.jenkins-ci.org/display/JENKINS/Delivery+Pipeline+Plugin - environment-script # https://wiki.jenkins-ci.org/display/JENKINS/Environment+Script+Plugin - git - ghprb # https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin - greenballs # https://wiki.jenkins-ci.org/display/JENKINS/Green+Balls - hipchat # https://wiki.jenkins-ci.org/display/JENKINS/HipChat+Plugin - junit # https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Plugin - matrix-auth # https://wiki.jenkins-ci.org/display/JENKINS/Matrix+Authorization+Strategy+Plugin - matrix-project #https://wiki.jenkins-ci.org/display/JENKINS/Matrix+Project+Plugin - parameterized-trigger #https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin - rebuild # https://wiki.jenkins-ci.org/display/JENKINS/Rebuild+Plugin - ssh - s3 # https://wiki.jenkins-ci.org/display/JENKINS/S3+Plugin - throttle-concurrents #https://wiki.jenkins-ci.org/display/JENKINS/Throttle+Concurrent+Builds+Plugin
代码实战
代码可以从仓库下载https://github.com/Voronenko/devops-jenkins-box-template。要使用它 - Fork 它,根据您的需求调整参数,然后使用。
运行就像
./bootstrap.sh ./init.sh ./setup_jenkins.sh
欢迎来到持续集成和部署的世界。