Google Cloud Function、aws lambda都是类似的无服务器服务,一种轻量级计算解决方案,通过相应平台封装的对应事件,返回响应。无需管理服务器、并且可以根据负载量自动扩缩容,这些特点特别方便我们一些高负载的需求。
但是代码部署方式上,和在服务器上自主搭建服务是有差别的:gcf接受Cloud Source Repositories(google的代码库平台)、zip文件;aws lambda 接受编译好的二进制文件的压缩包。不过aws 和 gcloud 都提供了强大的命令行工具,配合jenkins部署是一个不错的选择。由于gcloud、aws机制类似,本文以gcloud为例。
Google Cloud Function 部署
代码载体选择
google cloud function支持四种:
- 内嵌编辑器: 只适合一些简单的测试
- zip文件上传:将zip打包比较适合jenkins,jenkins对shell脚本支持的比较好,但是gcloud命令没有看到接受文件上传的选项。
- cloud storage上的zip:google cloud storage对应aws的s3,将代码压缩好上传到这里还可以备份,是比较好的选择
- Cloud Source Repositories:考虑到一般公司都选择自建的gitlab仓库,需要做一层同步。
通过比较几种代码载体,第三种是适合博主的方式,具体选择哪种,视你的具体场景选择。
gcloud sdk安装
安装教程见 Google CLi安装 。一般服务器linux操作系统错不了,简单整理官方文档步骤如下:
|
|
以上操作是在jenkins同台机器上执行。
gcloud sdk认证
首先判断是否已认证:gcloud auth list
。该命令会列出已认证的账号,以及活跃账号。
google iam提供了几种认证方式,因为要在jenkins pipeline里使用,最好选择gcloud auth activate-service-account
。当然也可以选择直接在jenkins机器jenkins用户下直接执行gcloud init。
即使gcloud auth activate-service-account
该种方式认证,gcloud也会将私钥的副本存储在$HOME/.config/gcloud
目录下面。如果要可靠的存储gcloud身份验证信息,在运行完pipeline之后,清楚一下本地缓存的密钥文件rm -rf $HOME/.config/gcloud
。
另外建议创建权限足够但不多余的专门用户,服务于jenkins。权限请选择:Cloud Functions Admin
、Storage Admin
。
jenkins pipeline部署
pipeline介绍
jenkins pipeline 流水线是用户定义的一个cd模型,通过代码定义项目的整个构建过程,支持各种组件,灵活而强大。类似的有github runner、bitbucket pipeline以及比较通用的github actions。
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'make'
}
}
stage('Test'){
steps {
sh 'make check'
junit 'reports/**/*.xml'
}
}
stage('Deploy') {
steps {
sh 'make publish'
}
}
}
}
简单的语法定义将构建过程分成步骤stage,同时支持环境变量定义,同时jenkins还提供了pipeline-syntax片段生成器。详细参考Jenkins Pipeline文档。
添加密钥文件
在jenkins系统管理-全局凭据中,添加密钥,选择
secret file
。具体可参考 []
jenkins pipeline部署Gcloud Function
pipeline示例
pipeline {
agent any
stages {
stage('克隆') {
when {
branch 'main'
}
steps {
dir(path: "./") {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, userRemoteConfigs: [[credentialsId: "仓库git凭证", url: '仓库地址']]])
}
}
}
stage('上线') {
when {
branch 'main'
}
steps {
withCredentials([file(credentialsId: 'gcloud secret file id', variable: 'GCP_FILE')]) {
sh 'git archive -o /tmp/code.zip HEAD'
sh "gcloud auth activate-service-account 账户名称 --key-file='${GCP_FILE}'"
sh 'gcloud alpha storage cp /tmp/code.zip gs地址'
sh 'gcloud functions deploy 函数名 --source gs地址'
}
}
}
stage('测试') {
steps {
sh 'curl -vvv 链接'
}
}
}
}
触发构建,可以根据自己需要设置,例子中是main分支有更新。还可以选择手工点击构建。
可能遇到的问题
gcloud sdk not found
类似问题:安装gcloud cli必须安装在jenkins所在机器User does not have the 'iam.serviceAccounts.actAs' permission on *@appspot.gserviceaccount.com required to create the function. You can fix this by running gcloud iam service-accounts add-iam-policy-binding *@appspot.gserviceaccount.com --member=user: --role=roles/iam.serviceAccountUser"
,详见 官方解释 :是因为创建用户和部署用户不同,解决办法为gcloud iam service-accounts add-iam-policy-binding 创建function用户 --member=serviceAccount:serviceaccount用户 --role=roles/iam.serviceAccountUser
总结
jenkins pipeline是一个简单而又强大的cd工具,可以从平时复杂冗余的工作中解放出来。由于对shell及jenkins本身强大的插件机制,可扩展的地方很多,本文只是拿一个具体的任务举例。目前比较可惜的是pipeline类似的功能都是在具体的平台上,没有一个更宽泛的概念,期待。。。
引用
https://cloud.google.com/sdk/gcloud/reference/functions/deploy gcloud sdk function文档 https://tech.ray247k.com/blog/202204-jenkins-cicd-3-push-docker-image-to-gcr/ Jenkins 打包 Docker image 並推送到 GCR