【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

怎样用 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:0011120
用户头像

发布了 63 篇内容, 共 41.2 次阅读, 收获喜欢 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
回复
没有更多了
发现更多内容

如何使用 NFTScan 追踪 NFT 巨鲸

NFT Research

NFT 数据基础设施

玩转OpenHarmony社交场景:即时通讯平台

OpenHarmony开发者

OpenHarmony

万物皆可集成系列:低代码对接微信小程序

葡萄城技术团队

如何看待PyTorch 2.0?

OneFlow

人工智能 深度学习 PyTorch

《迷你世界》亿级玩家都在用的游戏场景推荐系统长啥样?

华为云开发者联盟

数据库 后端 华为云 企业号 1 月 PK 榜

阿里云专有云重磅亮相中国信通院2022混合云技术发展论坛

云布道师

阿里云 混合云

解密秒杀系统架构:不是所有的秒杀都是秒杀

华为云开发者联盟

后端 开发 华为云 企业号 1 月 PK 榜

Spring Security怎么添加图片验证功能?

小小怪下士

Java spring spring security

如何使用自助式商业智能 (BI) 避免组织中的数据孤岛

葡萄城技术团队

邮箱中的Qt线程设计

统信软件

邮箱 邮箱系统

视觉大模型训练和推理加速

Baidu AICLOUD

异构计算 AI加速 云原生AI 百度百舸

数据赋能的未来,看向嵌入式BI

葡萄城技术团队

消息服务 + Serverless 函数计算如何助力企业降本提效?

阿里巴巴云原生

阿里云 云原生 消息队列

性能成本难两全?OpenMLDB 实时计算双存储引擎让你不必纠结(附测评报告)

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

袋鼠云产品功能更新报告03期丨产品体验全面优化,请查收!

袋鼠云数栈

大数据

大咖说·阿里云瑶池|电商业务与数据库技术发展的双向奔赴

大咖说

数据库 电商

天翼账号网关系统架构演进历程

Sean Chen

高并发 API网关 Kong 网关 天翼账号 网关演进

从开源安全看汽车安全新挑战

安势信息

开源安全 汽车安全 SBOM 开源漏洞 清源CleanSource SCA

《SBOM: 提高软件供应链透明度的关键》重磅白皮书来袭

安势信息

SCA SBOM 清源CleanSource SCA 安势信息 开源软件供应链安全

【Paper Reading】Cloud-Native Transactions and Analytics in SingleStore

阿里云数据库开源

数据库 阿里云 开源 分布式 云原生

构建api gateway - 序与目录

八苦-瞿昙

Gateway API Gateway build api gateway

细数华为云云原生产品及五大开源实践

华为云开发者联盟

云计算 云原生 后端 华为云 企业号 1 月 PK 榜

技术贴 | SQL编译与执行-parser

KaiwuDB

“新范式”——2022创业邦100未来独角兽峰会暨创业邦年会圆满落幕

创业邦

专精特新小巨人VC/PE覆盖率24.2%;上市649家;北京以589家位居城市榜首丨创业邦发布《2022专精特新小巨人发展报告》

创业邦

商业智能BI工具评估指南

葡萄城技术团队

Java常见异常:NPE空指针异常怎么解决?

千锋IT教育

巧用数据分析表达式,让数据指标创建更简单

葡萄城技术团队

性能测试技术笔记(一):如何快速上手压测工作

老张

性能测试

Intel 联合测试:YMatrix 并发查询 TPS 最高达 163 万

YMatrix 超融合数据库

intel 超融合数据库 HTAP 场景实践 YMatrix tpcb

14条日常维护LED显示屏的建议

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家

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