写点什么

怎样用 Jenkins、Docker 和 CI/CD 构建无服务器应用程序?

  • 2020-02-08
  • 本文字数:4292 字

    阅读完需:约 14 分钟

怎样用Jenkins、Docker和CI/CD构建无服务器应用程序?


我正在用 AWS lambda 开发一个无服务器架构的自由职业项目。


用 Jenkins 和 Docker 实现 CI/CD,并在 Docker 容器上运行 Jenkins pipelines。我会向你展示如何一步步设置环境。


由于是苹果电脑,我首先在电脑上安装 Docker 软件。还需 Jenkins 软件。我选择在 Docker 容器中运行 Jenkins,因为这样的运行环境更简单干净。于是,我为 Jenkins 找到一个 Docker 镜像版本(image)。


简而言之,Docker 把容器当作独立的计算机来操作。


Docker 会利用镜像文件创建容器。例如,在使用的这个 Docker 镜像中,包含了 Linux 操作系统和 Jenkins 软件。当 Docker 用这个镜像创建一个容器时,就相当于我们有一台计算机已经预先安装了 Linux 和 Jenkins。

一、设置容器

接下来,让我们看看如何设置这个容器。一开始,我们从 Docker 镜像的线上资源库 Docker hub 中提取镜像文件。


docker pull jenkins/jenkins:lts
复制代码


lts: Pulling from jenkins/jenkins844c33c7e6ea: Pull complete ada5d61ae65d: Pull complete f8427fdf4292: Pull complete f025bafc4ab8: Pull complete 67b8714e1225: Pull complete 64b12da521a3: Pull complete 2e38df533772: Pull complete b1842c00e465: Pull complete b08450b01d3d: Pull complete 2c6efeb9f289: Pull complete 0805b9b9cdc4: Pull complete f129619fc383: Pull complete cd27f3a82cdf: Pull complete f31251f493ed: Pull complete 2c902f1f4dfa: Pull complete 2fe1d2cb7aab: Pull complete 908723de775f: Pull complete 54aa3899e429: Pull complete f48cf8764dc1: Pull complete Digest: sha256:d5069c543e80454279caacd13457d012fb32c5229b5037a163d8bf61ffa6b80bStatus: Downloaded newer image for jenkins/jenkins:lts
复制代码


Docker 软件下载镜像文件并对之解压。现在,我们可以在自己的目录下看到该镜像文件。


alis-MBP:scms aliyuksel$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEjenkins/jenkins     lts                 a3f949e5ebfd        2 weeks ago         582MB
复制代码


然后,我们可以用这个镜像构建一个容器并运行。使用以下命令:


docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
复制代码


一旦这个容器正常启动,我们就能使用 Jenkins 软件,直到该容器关闭。但在容器关闭后会有一个问题:在下一次运行中,我们找不到之前已创建的任何 pipeline 或配置。


这是因为,Docker 是在镜像文件上运行容器,而镜像文件本身是不可更改的。这就意味着,当我们在 Jenkins 中定义一个 pipeline 时,Jenkins 会将它保存到容器文件系统中而不是镜像文件中。当关闭容器时,这些信息就丢失了。


因此,我们必须使用“Volumes”来解决这个问题。


Volumes 用于将虚拟容器的文件系统固化到我们的实际物理计算机文件系统中。为此,我们必须定义新的 Volume 以保留容器中的 Jenkins_home 目录。这并不难,我们需要更改 run 命令如下:


docker run -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts
复制代码


这里-v 代表“Volume”。如果没有 Volume,它将自动创建一个 Volume。你可以查看Docker相关文档以了解更多信息。


简而言之,我们用这种方法定义了名为 jenkins_home 的新卷,并挂载容器文件系统中的路径至:/var/jenkins_home。之后,即使关闭容器,我们的更改也不会丢失。因为/var/jenkins_home 文件夹下的所有文件都保存在 Volume 中。


现在,我们可以在浏览器上调用 Jenkins 的 url 了。这时应开启 Jenkins。我们需要初始密码 initialAdminPassword。当执行以上命令时,我们可以看到日志,并在日志中找到需要的 initialAdminPassword


***************************************************************************************************************************************************************************************Jenkins initial setup is required. An admin user has been created and a password generated.Please use the following password to proceed to installation:fb7b0666b23f40db985817700d1d0821This may also be found at: /var/jenkins_home/secrets/initialAdminPassword***************************************************************************************************************************************************************************************
复制代码


我们在 Jenkins 的页面中输入十六进制的密码。之后,我们会完成以下步骤:


  • 安装建议的插件

  • 创建第一个管理员用户

  • Jenkins 实例配置

  • 开始使用 Jenkins


到这里,我们完成本教程的第一部分。

二、实现 pipeline

我们已经得到一个 Jenkins 的实例(instance)。


然后,开始实现 pipeline。该 pipeline 将执行以下步骤:


  • 下面的所有步骤都将在另一个 Docker 容器上运行

  • 从 Git(bitbucket)中提取我的项目代码,这是用 nodejs 编写的一个 lambda 项目。

  • 使用无服务器架构将该 lambda 项目部署到 AWS 云上。


我们需要这个新容器的镜像文件。这个镜像其实是一台简单的 linux 计算机。我们从 Docker hub 提取这个新容器的镜像文件。


docker pull alpine
复制代码


此时,我们在本地机器上已经有这个 Docker 镜像文件了。但是 Jenkin 运行在另一个容器中。所以 Jenkins 需要连接这个新的 Docker 镜像。


我们必须在容器和 Docker 之间建立一座桥梁,用“Volume”定义来解决这个问题。


-v /var/run/docker.sock:/var/run/docker.sock  -v $(which docker):$(which docker) 
复制代码


分析一下上面的命令。其中,docke.sock 文件用于侦听套接字(socket)。在将这些 Volume 添加到命令行之后,docker.sock 会挂载到本地计算机(localmachine)里的 docker.sock 文件中。


如果我们使用-v,并在之后指定本地计算机的真实路径,这条命令的意思就是执行“挂载(mount)”。如果我们在-v 之后使用(which docker):$(which docker) 语句表示,如果“which docker”在容器上运行,Docker 也会在本地计算机上运行“which container”,并将执行结果返回给容器。


必须在以上命令中添加这个参数,因为 Jenkins 通过运行“which docker”来查找具体运行的 Docker。


我们还须改变这个文件的权限,因为缺省情况下,Jenkins 用户无法访问这个文件。我们需要用根用户权限(root user)连接到该容器。


执行这个命令,并运行容器。


 docker run -p 8080:8080 -p 50000:50000 --name jenkins  -v jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock  -v $(which docker):$(which docker)  jenkins/jenkins:lts
复制代码


我们使用以下命令打开容器的终端窗口。简单而言,使用根用户权限在容器上运行 bash 命令,我们然后用 chmod 更改文件权限。



这里强调的一个重点是,同一个容器名不能被使用两次。当关闭容器时,你必须删除该容器。


docker container rm jenkins
复制代码


在此之后,下次可以用–name 命令来使用 Jenkins。


我们现在可以构建 pipeline 了。


点击容器终端窗口菜单下的“New Item”。为这个 Item 输入一个名称。选择 PipeLine 类型并单击 OK。



在屏幕上选择 PipeLine。首先,pipeline 创建一个新容器,并执行容器上的所有命令。


pipeline {   agent {        docker { image 'alpine' }    }   stages {      stage('pull project') {         steps {             sh 'pwd'         }      }   }}
复制代码


现在可以通过 Jenkins 查看日志,看到的应该类似下图:



接下来,我们需要从 bitbucket 中提取项目。


首先,我们应该在 Jenkins 上定义一个可以访问 bitbucket 的用户。


单击菜单上的 Credentials/System(证书/系统)。然后单击屏幕上的 Global Credentials(全局证书)。这时菜单会发生改变,我们可以看到 Add Credentials(添加证书)的新菜单。单击 Add Credentials 并定义你已经在 bitbucket 上预先建立的用户。



这时要重点关注的是 ID 字段。当从 bitbucket 中提取出该项目时,我们将使用这个字段的值。


这时进入 pipeline.的配置页面。我们通过编写 pipeline.脚本来从 bitbucket 中提取出该项目。


pipeline {   agent {        docker { image 'alpine' }    }   stages {      stage('pull project') {         steps {             git credentialsId : 'aliyksel', url:'https://aliyksel@bitbucket.org/allscms/scms.git'         }      }   }}
复制代码


保存,并运行 pipeline。点击“Build Now”。


然后,该 pipeline 开始运行,并从 bitbucket 提取项目。

三、运行单元测试

接下来,就需要使用 npm。通常可以使用 npm plug-in 插件。但既然需要为无服务器创建一个新的镜像文件,我更倾向于使用新镜像文件中的 npm,而不是 npm plug-in。因此,我们将创建一个包含 npm 和无服务器架构的镜像文件。


首先,提取包含节点的镜像文件。


docker pull node
复制代码


之后,我们会把无服务器架构添加到这个镜像中。


从节点运行容器。


docker run -it --name node  node bash
复制代码


现在已经进入容器。我们安装无服务器架构。


npm install serverless -g
复制代码


现在我可以从这个容器创建一个新的镜像文件。于是在本地机器上运行以下命令。


docker commit node  serverlessimg
复制代码


退出该 Docker 容器。


exit
复制代码


此时,我们已经有了一个新的无服务器镜像,能在 Jenkins 中使用这个镜像。我们也可以使用 pipeline,该 pipeline 能将无服务器应用程序部署到 AWS 云端。


你需要更改镜像文件的名称,并向 pipeline 添加以下步骤。


  agent {        docker { image 'serverlessimg' }    }...stage('pull and deploy project : scms') {         steps {               git credentialsId : 'aliyksel', url:'https://aliyksel@bitbucket.org/allscms/scms.git'               sh 'npm install'               sh 'serverless config credentials --provider aws --key AKIAIOSFODNN7EXAMPLE --secret wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'               sh 'serverless deploy'             }         }      }
复制代码


我们还需定义用户信息以实现对 AWS 服务的访问。如果你还没建立自己的 AWS 用户账户,可以查看该文档。鉴于我已有一个 AWS 用户名了。我将以如下方式设置自己的用户证书(credentials)。


serverless config credentials --provider aws --key AKIAIOSFODNN7EXAMPLE --secret wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
复制代码


至此,所有步骤完成,我们为无服务器架构创建了一个新镜像,并部署了一个 AWS 应用程序。


英文原文:


Using Jenkins, Docker and CI/CD for Serverless Applications


2020-02-08 08:0011255
用户头像

发布了 63 篇内容, 共 42.1 次阅读, 收获喜欢 119 次。

关注

评论 1 条评论

发布
用户头像
> docker pull jenkins/jenkins:lts
give me error

"Error response from daemon: Bad response from Docker engine"
but `docker pull jenkins/jenkins:latest`


展开
2020-02-21 11:40
回复
没有更多了
发现更多内容

移动应用架构与React Native、Flutter的关联

Onegun

flutter 移动应用 ReactNative 软件应用架构

数学计算软件开发巨头MathWorks助力嵌入式开发创新,将MATLAB、Simulink与Perforce Helix Core集成

龙智—DevSecOps解决方案

版本控制 数学计算软件 MathWorks

基于低代码平台的多租户解决方案

力软低代码开发平台

腾讯广告技术版图|把脉生意困局,助力全域经营

科技热闻

软件测试/测试开发丨自动化测试定位策略实战-测试人论坛搜索

测试人

程序员 软件测试 自动化测试 测试开发

快速易用pdf编辑器:PDF Expert 中文激活版

真大的脸盆

Mac Mac 软件 PDF编辑 编辑PDF文件

上海国家会计学院杨寅: 数据、业务、技术三大事项相互融合,促进财务发展

用友BIP

智能会计 价值财务

Kyligence 客户案例招商银行批发业务分析平台获评金融数字化最佳实践案例

Kyligence

金融数字化 指标平台

异地组网——ZeroTier

数新网络官方账号

大数据

财务共享中心成功建立!用友帮助河南水投集团打造财务效率新高地

用友BIP

财务共享

我的 UI 组件库发布了!

DUFU

JavaScript Svelte 移动端 Tailwind UI组件库

如何在Windows中设置应用程序开机启动?

IT蜗壳-Tango

低代码开发:构建企业数字化生态系统的秘密武器!

加入高科技仿生人

低代码 数字化 企业数字化 数字转型

MobTech 秒验|运营商网关取号​

MobTech袤博科技

浅谈电解电容在电路设计中的作用

华秋PCB

电路 元器件 PCB PCB设计 电解电容

缺乏集成和标准的协作框架,企业如何确保API质量?

龙智—DevSecOps解决方案

git API API 接口

点云分割技术的发展现状及挑战

来自四九城儿

阿里P9架构师推荐的Spring领域巅峰之作,颠覆了我对Spring的认知

程序知音

Java spring java架构 Java进阶 后端技术

SSH和SFTP是否相同

镭速

【活动报名】openEuler如何实现高效运维?南京用户组Meetup现场来聊聊!

openEuler

Linux 运维 操作系统 openEuler

塞尔达工业革命卷到数字电路了!网友:怕不是要在Switch里造Switch

Openlab_cosmoplat

能让中国联通青睐的财务共享智能报账平台是什么样的?

用友BIP

财务共享

分布式架构天花板笔记开源了,一上线GitHub 45K star

小小怪下士

Java 程序员 分布式 分布式架构

2023上海国际嵌入式展 | 如何通过版本控制与IP管理建立嵌入式开发的单一可信数据源

龙智—DevSecOps解决方案

版本控制 嵌入式开发 静态代码扫描

flutter系列之:做一个下载按钮的动画

程序那些事

flutter 大前端 程序那些事

激发创造力!如何轻松录制PPT和人像视频

淋雨

PPT Camtasia 录屏

Sprint回顾会及Scrum工具

顿顿顿

Scrum 敏捷开发 敏捷项目管理 敏捷开发管理工具 sprint回顾会

阿里大佬随手甩出一份覆盖全网的微服务架构笔记,让我涨薪60%

程序知音

Java 微服务 spring-cloud 后端技术 spring-boot

Scrum的执行过程及产品Backlog梳理的目的、时间、内容

顿顿顿

Scrum 敏捷开发 敏捷开发管理 敏捷项目管理

浅谈安全测试之AppScan

数新网络官方账号

大数据 安全测试

面试进阶齐飞!Github一天10w赞的阿里Java系统性能优化笔记有多牛?

程序员小毕

JVM 面试题 架构师 java面试 Java性能优化

怎样用Jenkins、Docker和CI/CD构建无服务器应用程序?_架构_Ali Yuksel_InfoQ精选文章