搭建舞台
在过去的两年中,我一直在从事Node.js项目。 我们使用GitHub进行源管理,使用Jenkins进行持续集成。 我们还有一个基于Docker和Terraform的部署工具 。
在此期间,我们对配置进行了一些改进。 产生积极影响的更改之一是在分支上运行CI管道,并在GitHub上查看反馈。
在合并PR之前检查构建的结果可以防止由于微小错误而造成的大量损坏。 就像忘记运行lint或添加新文件一样。 一旦我们决定自动执行依赖关系的更新,反馈将使其变得快速,安全。
在这篇文章中,我将解释如何使用以下方法配置Continuos集成和部署管道:
- Jenkins用于构建配置。 用于创建构建的多分支管道。 Jenkinsfile,用于决定在每个构建中执行什么
- GitHub用于存储源代码,检查构建输出以及将分支合并到master
- Docker将构建与执行环境隔离。 无论是开发人员机器还是Jenkins节点
特征
构建管道的配置与源代码一起进行版本控制。 这给您:
- 旧配置的历史和回滚功能
- 配置和源的原子更改
- 使用分支来尝试配置本身
分支机构的建立和反馈意味着您可以:
- 在代码审查期间查看构建结果
- 如果分支破坏了构建,则防止分支合并
- 自动合并不间断的更改
其他小事:
- 该构建被定义为一系列步骤而不是作业,因此一旦开始就不会重新进入队列
- 您可以通过编辑文件而不是使用Jenkins Web UI来执行大多数构建配置
缺点
- 您需要学习Jenkinsfile的语法
- 您需要注意两种不同的语法选项(脚本式和声明式)
- 有关如何使用插件的文档并不总是很清楚,并且通常没有任何示例
该应用程序
我创建了一个Node.js Web应用程序作为示例。 为了简化构建,该应用程序没有外部运行时依赖项,例如数据库或服务。 可以扩展此配置以应对外部依赖性,而不会影响隔离性。 例如通过使用Docker Compose设置依赖关系。
Dockerfile
FROM node:lts-slim WORKDIR /opt/app COPY package .json yarn.lock ./ RUN yarn COPY . . EXPOSE 8080 CMD yarn start
Docker是最流行的应用程序容器化解决方案。 有关Docker的完整介绍,我推荐Andre Torres的Docker容器 。
在此CI管道中,Docker将应用程序代码与Jenkins节点隔离。
隔离启用复制。 如果在Jenkins中构建失败,并且我们需要调查失败,则可以在开发人员机器上将其复制,因为Jenkins节点及其软件的状态在容器内不起作用。
隔离还解决了具有不同运行时环境的问题。 每个应用程序可以在Dockerfile中指定不同版本的Node.js,以用于测试和部署。
詹金斯档案
pipeline { agent any stages { stage( 'Build' ) { steps { sh 'docker build -t codurance/jenkins-pipeline-blog:latest .' } } stage( 'Test' ) { steps { sh 'docker run codurance/jenkins-pipeline-blog:latest yarn test' } } stage( 'Deploy' ) { when { branch 'master' } steps { sh 'docker push codurance/jenkins-pipeline-blog:latest' } } } post { failure { echo 'build is broken. notify team!' 'build is broken. notify team!' } } }
该常规文件替换了通常用于在Jenkins中配置作业的长Web表单。 此示例中的管道具有三个阶段(构建,测试,部署),每个阶段均由步骤实现。
部署阶段仅在主分支或中继分支受到影响时运行。 在此示例中,它将映像发布到hub.docker.com,但您可能会将其替换为用于部署应用程序的基础结构命令。
管道还具有一个称为post
的部分,其中包含在构建完成后触发的诸如always
和failure
步骤。 这些扩展点可以在您的工作流中集成消息传递系统,例如Slack。
Jenkins设置
Jenkins需要访问GitHub。 在我的情况下,有效的方法是使用新的GitHub个人令牌作为密码,在Jenkins中创建用户名和密码凭据。 这取决于在GitHub中设置用户的方式,因此它可能不适用于您的帐户。 我在CloudBees知识库中找到了详细的解释
配置完凭据后,就可以在Jenkins中创建新作业了。 当询问类型时,选择“多分支管道”
Jenkins提供的默认设置对我的工作流程很明智,因此我对其进行了很少的修改。 如果您习惯了Jenkins的自由职业,您可能会对少量可用选项感到惊讶。 那是因为我们已经在Jenkinsfile中定义了整个构建管道。
您可以配置哪些提交,分支或PR触发管道。 使用上面显示的设置,在推送到主节点,推送到分支以及创建PR时将触发管道。
保存配置后,最好在GitHub中检查webhook。 Jenkins将在存储库中配置一个Webhook,以在推送提交或创建PR后立即触发管道。 它要求Jenkins可以从Internet进行访问,最好使用有效的SSL证书。
单击自由样式的Jenkins作业时,熟悉的景象就是减少内部版本号的列表。 现在,只需单击一下即可,因为每个分支和PR都有自己的内部编号序列。
GitHub中分支的构建状态通过链接到Jenkins的叉和刻度线报告。
对于PR,管道是在与master合并之后运行的,并且与PR对话一起可见。
也可以将GitHub配置为网守,以便无法合并测试失败的PR。 此功能称为受保护分支 。
根据您的工作流程配置管道之后,您就可以开始开发应用程序了。
然后去哪儿?
最先进的技术并不意味着完美。 这是我目前所知道的最好的事情,我想学习更多,并回顾这是迈向更好的一步。
Jenkins是我在该领域使用最多的工具。 使用不同的工具很有可能会获得更好的结果。 我狭窄的经验是限制因素。
这篇文章中未涉及的领域是如何使用具有外部依赖项的应用程序。 我将在以后的文章中介绍。
在@jaramir或@codurance上发推文,让我知道您的想法。
快乐黑客!
资源资源
- 示例Node.js项目https://github.com/codurance/jenkins-pipeline-blog
- Jenkinsfile语法https://jenkins.io/doc/book/pipeline/syntax/
- Jenkinsfile步骤参考https://jenkins.io/doc/pipeline/steps/
- 多分支管道https://jenkins.io/doc/book/pipeline/multibranch/
翻译自: https://www.javacodegeeks.com/2019/05/continuous-integration-deployment-pipeline-jenkins-github-docker.html