近日,使用 Serverless 开发了一个应用。其中 CI/CD,是需要考虑的一个问题。这里用到了 Jenkins 和 Docker。并且 Jenkins Pipeline 运行在容器中。
本文将介绍如何使用 Jenkins 和 Docker 构建并部署 Serverless 应用。
需要安装的软件
笔者用的 MacBook,已经事先安装好了 Docker,并且由于从 DockerHub 下载镜像比较慢,为了加快镜像下载速度,设置了使用国内的 Docker 镜像源。
Jenkins 有多种运行方式:
笔者这里使用 Docker 运行 Jenkins,因为构建步骤也会运行在 Docker 中,需要将 docker.sock 和 docker 命令挂载到容器中,启动 jenkins 命令如下:
docker run -d -p 8080:8080 --name jenkins -e TZ="Asia/Shanghai" -v jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):$(which docker) jenkins/jenkins:lts
注意:由于容器内 Jenkins 服务是由 jenkins 用户启动的,它无法访问 /var/run/docker.sock,因此我们需要更改这个文件的权限。
在 Jenkins 启动后安装需要用到的插件:
建议启动后只先安装 Localization: Chinese (Simplified) 插件(该插件由 Jenkins 中文社区维护)。
等安装好 Localization: Chinese (Simplified) 插件,并设置好管理员账号后,再安装其他所需的插件。
为什么要这样做呢?
由于 Jenkins 插件服务器在国外,通常情况下因为网络问题,下载插件会比较慢,也经常会遇到插件下载失败的问题。
为了解决这个痛点,Localization: Chinese (Simplified) 插件提供了使用国内 Jenkins 插件源的功能。
因此,在安装好 Localization: Chinese (Simplified) 插件后,请立即设置使用国内的 Jenkins 插件源,这样之后其他插件的下载将变得快如闪电。
本文使用 Serverless Framework 部署应用到腾讯云。
serverless 命令行是使用 nodejs 开发的,所以会需要 nodejs 环境。
此外,计划部署的应用是用 python 开发的,也会需要到 python 环境。
应用构建部署是在 docker 容器中运行的,所以需要一个同时安装有 nodejs 和 python 的 docker 镜像。
在 GitHub 上找到了 docker-python-nodejs 仓库:https://github.com/nikolaik/docker-python-nodejs。
基于 nikolaik/python-nodejs 镜像构建了新镜像 python-nodejs-serverless,Dockerfile 如下:
FROM nikolaik/python-nodejs:python3.6-nodejs12RUN npm config set registry http://registry.npm.taobao.org&&npm install -g serverless
使用 docker build 命令构建镜像:
docker build -t python-nodejs-serverless .
创建一个 Pipeline 类型的 job,名称为:serverless-python-demo-pipeline,并开启参数化构建,增加两个密码参数:TENCENT_SECRET_ID 和 TENCENT_SECRET_KEY,用于自动登陆腾讯云。
经过不断实践、不断完善,Jenkinsfile 最终内容如下:
pipeline {
agent {
docker {
image 'python-nodejs-serverless'
args '-e TZ="Asia/Shanghai"'
}
}
stages {
stage('Checkout') {
steps {
git branch: 'main', url: 'https://github.com/donhui/serverless-python-demo.git'
}
}
stage('EnvSetUp') {
steps{
wrap([$class: 'MaskPasswordsBuildWrapper']) {
sh 'touch .env'
sh 'echo TENCENT_SECRET_ID=${TENCENT_SECRET_ID} >> .env'
sh 'echo TENCENT_SECRET_KEY=${TENCENT_SECRET_KEY} >> .env'
}
}
}
stage('Build') {
steps {
sh 'pip install -i https://pypi.douban.com/simple/ -r requirments.txt -t ./'
}
}
stage('Deploy') {
steps {
sh 'serverless deploy'
}
}
}
post{
always {
deleteDir()
}
}
}
对于 Jenkinsfile 做如下说明:
点击 Build With Parameters—>开始构建,运行 Job:
运行状态截图如下,从下图中可以看到每次构建各个 stage 的耗时:
查看 EnvSetUp stage 的日志,可以看到敏感信息已经被隐藏,保证了信息安全,这要归功于 Mask Passwords 插件:
关于 Mask Passwords 插件的设置,在系统管理—>系统配置中,可以对 Mask Passwords 插件做一些全局设置,如下图所示:
查看 Deploy 日志,可以看到部署成功的信息提示:
打开应用控制台,serverless-python-demo 应用详细信息如下:
本文介绍了如何使用安装 Jenkins 及插件,如何定制构建环境的 Docker 镜像,并展开分析了 Jenkins Pipeline 的核心配置文件:Jenkinsfile。此外,还用到了 Mask Passwords 插件来隐藏敏感信息,保证了信息安全。
本次实践使用 Jenkins + Docker 成功部署了 Serverless 应用,希望对看到这篇文章的读者带来一定的借鉴参考意义。
头图:Unsplash
作者:donghui
原文: 使用 Jenkins、Docker 构建部署 Serverless 应用
来源:ServerlessLife - 微信公众号 [ID:donghui-2020]
转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
领取专属 10元无门槛券
私享最新 技术干货