吃不上鱼的dj猫

明月如镜 高悬草原映照千年岁月


  • 首页

  • 技术

  • 感想

  • 笔记

  • 归档

  • 关于

  • 搜索
close

使用jenkins pipeline部署Gcloud Function

时间: 2022-05-06   |   分类: notes     |   阅读: 2045 字 ~5分钟

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操作系统错不了,简单整理官方文档步骤如下:

1
2
3
4
5
6
7
8
9
# 下载google cloud sdk压缩包
curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-377.0.0-linux-x86_64.tar.gz
# 解压
tar -xf google-cloud-sdk-377.0.0-linux-x86.tar.gz
# 执行安装sh脚本
./google-cloud-sdk/install.sh
# 由于要把代码上传到cloud storage,用到alpha组件
gcloud components install beta
#接下来不要执行gcloud init,jenkins部署提供了secret file认证文件的管理,为了安全。

以上操作是在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。 Google Cloud Platform 添加密钥

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添加密钥文件 在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

上海在《这个春天》郝景芳
curl 关于服务时间性能的指标探究及应用
  • 文章目录
  • 站点概览
D&J

D&J

程序员

27 日志
3 分类
17 标签
GitHub
  • Google Cloud Function 部署
    • 代码载体选择
    • gcloud sdk安装
    • gcloud sdk认证
  • jenkins pipeline部署
    • pipeline介绍
    • 添加密钥文件
  • jenkins pipeline部署Gcloud Function
    • pipeline示例
    • 可能遇到的问题
  • 总结
  • 引用
© 2009 - 2024 吃不上鱼的dj猫
Powered by - Hugo v0.124.0
Theme by - NexT 沪ICP备14008426号-3
0%