热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:怎样用JenkinsDocker和CI/CD构建无服务器应用程序?

本文由编程笔记#小编为大家整理,主要介绍了怎样用JenkinsDocker和CI/CD构建无服务器应用程序?相关的知识,希望对你有一定的参考价值。
本文由编程笔记#小编为大家整理,主要介绍了怎样用JenkinsDocker和CI/CD构建无服务器应用程序?相关的知识,希望对你有一定的参考价值。







作者 | Ali Yuksel


策划 | 万佳


本文展示一个详细教程,实现了在无服务器应用程序中使用 Jenkins 和 Docker,在 Docker 容器运行 Jenkins pipelines,并用 pipelines 将无服务器应用程序部署到 AWS。

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


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


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


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


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



1 设置容器

接下来,让我们看看如何设置这个容器。一开始,我们从 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 相关文档以了解更多信息。


https://docs.docker.com/engine/reference/commandline/volume_create/


简而言之,我们用这种方法定义了名为 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



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



2 二、实现 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 之后使用 $(),则表示运行命令。-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 更改文件权限。


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


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






docker container rm jenkins


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


我们现在可以构建 pipeline 了。


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


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


在屏幕上选择 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 提取项目。



3 三、运行单元测试

接下来,就需要使用 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)。


https://serverless.com/framework/docs/providers/aws/guide/credentials/






serverless config credentials --provider aws --key AKIAIOSFODNN7EXAMPLE --secret wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY


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



相关阅读:

https://hackernoon.com/jenkins-docker-and-cicd-for-serverless-bw5p323d



点个在看少个 bug

推荐阅读
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
author-avatar
安韦苇8
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有