使用Coding持续集成(CI)批量部署代码到阿里云/腾讯云云函数

前言

近期公司在做一款可用性监测产品,需要把代码部署到多个地域。由于仅仅涉及到网络请求与数据上报,直接在不同地域购买服务器显得有些小题大做,也不利于成本控制。最后选用阿里云的函数计算(FC)与腾讯云的无服务器云函数(SCF)产品。

问题

刚开始只有几个节点,还能勉强手动上传代码包解决。但随着节点数量越来越多,代码稍微改动,都要重复上传几十次代码包,这样一来工作量就非常大了,而且特别耗时间。

解决

公司代码托管使用Coding企业版,决定使用里面的持续集成功能去搞定。

整体思路是先把代码包压缩,代码测试完毕后,读取目录下存有节点信息的json文件,并调用腾讯云与阿里云的API上传代码包。

部署、测试代码语言使用Node.js。

编写节点信息

node.json
在阿里云中比腾讯云多出一个“服务”,由于我在阿里云上部署的代码,服务与函数名称是相同的,故这里只使用了funcname,如果你的实际情况和我不同,则需要稍作修改。

{
	"node1": {
		"type": "qcloud", //平台类型
		"region": "ap-guangzhou", //地域名称
		"funcname": "node-ap-guangzhou" //函数名称
	},
	"node2": {
		"type": "aliyun", //平台类型
		"region": "us-east-1", //地域名称
		"funcname": "node-us-east-1" //服务/函数名称
	}
	......
}

编写测试代码

test.js
这里只做了简单的测试验证,只验证节点信息配置文件node.json是否配置正确。之所以没有对代码运行验证,因为我的项目中提交到dev分支时已经运行过测试脚本。

const fs = require('fs');
fs.readFile('node.json', 'utf-8', function(err, data) {
	if (err) throw new Error("Could not load node.json");
	data = JSON.parse(data);
	for(var key in data){
		if (!data[key]['type'] || !data[key]['region'] || !data[key]['funcname']) throw new SyntaxError("节点配置测试错误. " + key);
	}
});

编写部署代码

deploy.js

const tencentcloud = require("tencentcloud-sdk-nodejs");
const FCClient  = require('@alicloud/fc2');
const fs = require('fs');

const QCloudCerd = tencentcloud.common.Credential;
let qcloudcerd = new QCloudCerd(process.env.qcloud_secretId, process.env.qcloud_secretKey);

const ScfClient = tencentcloud.scf.v20180416.Client;
const ScfModel = tencentcloud.scf.v20180416.Models;

fs.readFile('node.json', 'utf-8', function(err, data) {
	if (err) throw new Error("Error reading node.json.");
	data = JSON.parse(data);
	for(var key in data){
	  switch(data[key]['type']){
		case 'qcloud':
			console.log("节点 " + key + " 部署开始。");
			var scfclient = new ScfClient(qcloudcerd, data[key]['region']);
			let req = new ScfModel.UpdateFunctionCodeRequest();
			let parameter = {
				FunctionName: data[key]['funcname'],
				Handler: 'index.handler',
				ZipFile: fs.readFileSync('code.zip', 'base64')
			};
			req.from_json_string(JSON.stringify(parameter));
			scfclient.UpdateFunctionCode(req, function(err, response) {
				if (err) {
					console.log(err);
					return;
				}
				console.log("节点 " + key + " 部署完成。");
			});
			break;
		case 'aliyun':
			console.log("节点 " + key + " 部署开始。");
			var fcclient = new FCClient(process.env.aliyun_accountId, {
			  accessKeyID: process.env.aliyun_secretId,
			  accessKeySecret: process.env.aliyun_secretKey,
			  region: data[key]['region']
			});
			fcclient.updateFunction(data[key]['funcname'], data[key]['funcname'], {
				code: {
				  zipFile: fs.readFileSync('code.zip', 'base64')
				}
			});
			console.log("节点 " + key + " 部署完成。");
			break;
		default:
			console.log("未知操作!" + key);
			break;
	  }
	}
});

编写Jenkinsfile

pipeline {
  agent any
  stages {
    stage('检出') {
      steps {
        sh 'ci-init'
        checkout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]])
      }
    }
    stage('构建') {
      steps {
        echo '构建中...'
        sh 'npm install cos-nodejs-sdk-v5 --save'
        sh 'npm install tencentcloud-sdk-nodejs --save'
        sh 'npm install @alicloud/fc2 --save'
        sh 'rm -f code.zip'
        sh 'zip -r code.zip * -x "node_modules*"'
        echo '构建完成.'
      }
    }
    stage('测试') {
      steps {
        echo '单元测试中...'
        sh 'node test.js'
        echo '单元测试完成.'
      }
    }
    stage('部署') {
      steps {
        echo '部署中...'
        sh 'node deploy.js'
        echo '部署完成'
      }
    }
  }
}

新增持续集成

见图

设置环境变量

关于这些信息如何获取,请另行参照相关文档。

最后效果

参考

腾讯云-无服务器云函数-更新函数代码
阿里云-函数计算-更新函数代码

博客原文:https://tlingc.com/2019/06/deploying-code-to-aliyunfc-tencentcloudscf-with-coding-ci/

发布了16 篇原创文章 · 获赞 1 · 访问量 4693

猜你喜欢

转载自blog.csdn.net/TLingC/article/details/99098775
今日推荐