利用流水线实现版本一键发布

news2024/11/15 19:28:20

目录

      • 1. 背景
      • 2. 实现步骤
        • 3.1 前置条件
        • 3.2 更新版本号和拉出发布分支
        • 3.3 生成 diffCommit
        • 3.4 自动触发联动编译
        • 3.5 让通知更友好
      • 3. 总结

1. 背景

通常我们发布版本时会有这样几个步骤,更改版本号,拉出 release 分支,生成发布包。但是博主所在的项目组有点特殊,整个项目分为两个工程,Unity 工程和 Android 工程,需要 unity 工程打出 aar 包,Android 工程引用这个 aar,然后生成 apk。
所以我们发版的时候会有以下一些步骤:

  1. 在主干分支上更新 Android 工程的 version_code 和 version_name;
  2. 拉出 Android 的发布分支;
  3. 拉出 Unity 的发布分支;
  4. 生成 Unity 的 aar 包,并更新到对应的 Android 发布分支上;
  5. 打出 apk;
  6. 记录当前发布分支和上个发布分支的差异提交(方便测试同学针对性测试);

这么一通操作下来,大半天都过去了。如果能有个按钮,按一下自动帮助我们完成这些步骤就好了,我想到了使用流水线的方式来实现。

2. 实现步骤

目前我们的项目都是使用 gitlab 进行托管的,所以一键版本发布的功能也是基于 gitlab 流水线来实现的。
最终,我们实现了能够一键触发版本发布,先来看看最终的实现效果:
如下所示为触发版本发布的 python 脚本,我们只需要输入对应的参数,就能够一键触发了。
传递的参数中,ref 表示分支名,variables[***] 会写入到 gitlab 的环境变量当中。

def trigerReleaseVersion(trigger, version_code, version_name, base_unity_branch, base_android_branch,
                         release_branch, pre_branch):
    token = "***"
    webhookUrl = "https://***/trigger/pipeline"
    data = {
        "token": token,
        "ref": base_android_branch,
        "variables[BUILD_TAG]": "releaseVersionBuild",
        "variables[TRIGGER]": trigger,
        "variables[VERSION_CODE]": version_code,
        "variables[VERSION_NAME]": version_name,
        "variables[BASE_UNITY_BRANCH]": base_unity_branch,
        "variables[RELEASE_BRANCH]": release_branch,
        "variables[PRE_BRANCH]": pre_branch
    }
    response = requests.post(webhookUrl, data=data)
    print(response.status_code)
    return response.status_code

当然也可以通过一些网络接口工具去触发
在这里插入图片描述

3.1 前置条件

我们在工程的 yml 文件当中增加一个专门用于版本发布的任务,并设置只有当环境变量 BUILD_TAG 的值为 releaseVersionBuild 时才会被触发,触发之后会执行我们的 python 脚本。

releaseVersionBuild:
  stage: build
  rules:
    - if: '$BUILD_TAG == "releaseVersionBuild"'
      when: always
  allow_failure: true
  script:
    - python3 main.py "releaseVersion"
  tags:
    - unity-ci
3.2 更新版本号和拉出发布分支

这一步相对来说比较容易,对于 Android 工程来说,我们需要修改版本号,提交变更,拉出发布分支,这几个功能都可以使用 python 的 git 库来实现。
1.clone 仓库并切换到指定的分支:

repo = git.Repo.clone_from(repo_url, directory)
repo.git.checkout(base_android_branch)

2.更改版本号,并提交代码:

with open(f'{directory}/gradle.properties', 'r') as file:
    content = file.read()
    origin = content

content = re.sub(r'VERSION_CODE=\d+', f'VERSION_CODE={version_code}', content)
content = re.sub(r'VERSION_NAME=.+', f'VERSION_NAME={version_name}', content)

if(origin == content):
    print("not change")
    print("不需要push新版本")
else:
    print("changed")
    with open(f'{directory}/gradle.properties', 'w') as file:
        file.write(content)

    repo.index.add(['gradle.properties'])
    repo.index.commit(f'更新版本号到{version_name}')
    repo.git.push('origin', base_android_branch)
    print("版本push成功")

3.拉出发布分支,并 push 到远端

repo.git.checkout('-b', release_branch, base_android_branch)
repo.git.push('origin', release_branch)

而对于 Unity 工程来说,我们并不需要修改版本号,所以可以直接使用 gitlab 的接口,触发创建发布分支

def createBranch(project_id, baseBranch, newBranch, privateToken):
    url = f"https://gitlab.***/api/v4/projects/{project_id}/repository/branches?branch={newBranch}&ref={baseBranch}"
    headers = {
        "PRIVATE-TOKEN": privateToken
    }
    response = requests.post(url, headers=headers)
    if response.status_code == 201:
        data = response.json()
        return (True,"")
    else:
        print(f"Error: {response.status_code}")
        print(response.json())
        return (False,response.text)
3.3 生成 diffCommit

获取两个分支之间的差异,虽然可以使用 git 指令,但如果本地操作,再将其保存为文档给到测试同学,而且每次更新都需要重新生成再给一份,想想都觉得麻烦。
所以我创建了一个飞书多维表格,专门用于记录不同分支之间的差异提交记录,而且 gitlab 接口也支持获取分支之间的差异提交,这样每次编译的时候,都获取一下差异提交,再更新到多维表格当中就可以了。

获取不同分支之间的差异提交:

def getCommitDiff(project_id, fromBranch, toBranch, private_token):
    url = f"https://gitlab.***/api/v4/projects/{project_id}/repository/compare"
    headers = {
        "PRIVATE-TOKEN": private_token
    }
    params = {
        "from": fromBranch,
        "to": toBranch
    }
    response = requests.get(url, headers=headers, params=params)
    if response.status_code == 200:
        data = response.json()
        commits = data['commits']
        return commits
    else:
        print(f"Error: {response.status_code}")
        print(response.json())
        return None

更新多维表格的记录可以参考飞书开放平台的文档:
https://open.feishu.cn/document/server-docs/docs/bitable-v1/notification

在这里插入图片描述
还有一个问题需要解决,就是当我们发版的时候指定了 preBranch ,也就是和当前分支的对比的发布分支。
本来是想着可以通过程序来计算前一个发布分支,比如当前的发布分支是 release/1.2,那么前一个发布分支就是 release/1.1,但是实际发现有的时候会有一些临时版本,例如 release/1.1.5 或者 release/1.1_temp 之类的特殊版本,所以还是需要人工手动指定。
人工指定完了之后,还需要有个地方记录,这样每次有了新的提交,都需要去获取前一个分支,然后重新进行对比。同样可以记录在多维表格当中。

在这里插入图片描述

3.4 自动触发联动编译

我们可以在 yml 文件里面创建一个任务,只要有任何变更就触发,这样代码提交的时候就会触发执行我们的 python 脚本,我们可以在脚本里面判断当前的分支,如果分支名是 release/*** ,那么就可以开始版本发布的编译流程。

defaultTask:
  stage: build
  rules:
    - changes:
        - '*'
      when: always
  resource_group: $CI_COMMIT_REF_NAME
  allow_failure: true
  script:
      - C:\\Application\\Python\\python.exe main.py "unityCompiler" #触发unity编译
  after_script:
    - C:\\Application\\Python\\python.exe main.py "triggerAndroid" #触发Android编译
  tags:
    - hmi3d-ci-windows

当 unity 编译完成之后,拿到了 aar 的版本号,此时可以触发 Android 流水线进行编译,并将aar 的版本号当作参数传递。其中 Android 发布分支和 unity 的发布分支的分支名是一样的。

def trigerAndroidProject(unityBranch, androidBranch, jobType, version, tag, user):
    token = "***"
    webhookUrl = "https://gitlab.***/trigger/pipeline"
    data = {
        "token": token,
        "ref": androidBranch,
        "variables[JOB_TYPE]": jobType,
        "variables[VERSION]": version, # aar的版本号
        "variables[BUILD_TAG]": tag,
        "variables[TRIGGER]": user,
        "variables[UNITY_COMMIT_MSG]": Utils.getLastCommitInfo(),
        "variables[UNITY_BRANCH]": unityBranch,
        "variables[ANDROID_BRANCH]": androidBranch,
        "variables[BUILD_TIME]": Utils.getCurrentDateTime()
    }
    response = requests.post(webhookUrl, data=data)
    print(response.status_code)
    return response.status_code

这样就能够实现代码提交之后,自动触发 Unity 和 Android 两个工程联动编译。

3.5 让通知更友好

当编译完成之后,可以让飞书机器人发送消息进行提醒,这样就可以避免需要主动去流水线上查看是否编译结束,而且飞书机器人当中也可以携带各种参数,显示当前的编译信息。
在这里插入图片描述

3. 总结

这样我们就可以实现版本一键发布,并让通知更加友好,包打出来之后,测试同学可以直接在群里面看到消息,并开始测试,不需要互相通知。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2090134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于ThinkPHP 5 框架开启自动搜索控制器 无法访问的问题坑

假如当前有一个登陆接口功能 因为后续会有不同版本的 登陆接口 这时候 我们可以在控制器中 新建文件夹 做区分 方便管理即 新建了一个 api 模块 文件路径是 api/controller/V1/Login 正常情况下 controller 目录下 是 控制器文件 login.php 文件,由于我们有多个…

地下车库电车这样充电,必须改

文 | AUTO芯球 作者 | 响铃 我是真的害怕啊 你们看,我住的小区, 都是这样子啊 一个这样子的塑料盒,最多一个铝板盒子,就给车充电了 你看看 这样的塑料电槽 就这样裸露在外面了 有些摸一下 电线都在发烫 现在我们小区内这…

【NCom】:通用负压退火方法构建超高负载单原子催化剂库

摘要:由高密度单原子填充的催化剂系统对于提高催化活性和选择性至关重要,这可以最大限度地发挥异质单原子催化剂 (SAC) 的工业前景。然而,实现金属含量超过 10 wt% 的高负载 SAC 仍然具有挑战性。在这里,我们描述了一种通用的负压…

【UCB CS61C】Lecture 4 - C Memory Management Usage

目录 C 的内存布局(Memory Layout)栈(Stack)静态数据(Static Data)代码(Code) 寻址(Addressing)地址(Address)字节序(Endi…

电脑缺少dll文件怎么解决?Dll文件修复工具使用教程(方法合集)

众所周知,dll文件是计算器中的一类文件。占据了Windows操作系统的重要地位,主要作用就是可以让多个程序在运行时加以使用。dll文件包含了数字、文本、界面的等内容。 电脑缺少dll文件怎么解决?如果你启动某个程序时,发现电脑提示缺…

如何共享EC2 AMI给其他AWS账户

在本篇文章中,我们将详细介绍如何通过Amazon Web Services (AWS) 的Elastic Compute Cloud (EC2) 平台,将自定义AMI(Amazon Machine Image)共享给其他AWS账户。接下来,我们九河云将一步步引导您完成整个过程&#xff0…

数据驱动,智领办公!陀螺匠·企业助手 v1.7公测版发布

在数字化转型浪潮中,企业对办公自动化系统的需求愈加强烈,追求高效、灵活、智能的办公管理解决方案成为行业共识,我们深知,只有不断创新和完善,才能满足企业日益增长的需求。此次,我们带来陀螺匠企业助手 v…

【GeoScenePro】知识图谱

视频教程: ArcGIS/GeoScene知识图谱入门篇_哔哩哔哩_bilibili 所需软件: GeoScene Pro桌面端产品 Geoscene Enterprise四大组件(GeoScene_Server、GeoScene_DataStore、GeoScene_Portal、GeoScene_Web_Adaptor) 安装 【GeoScenePortal】安装和部署-CSDN博客

2024年下半年软考备考前的注意细节点

一、备考教材信息——选择官方正版(电子、纸质都可以) 中项 书名:《系统集成项目管理工程师教程》(第三版) 出版社:清华大学出版社 书籍类型:全国计算机技术与软件专业技术资格(…

centos安装docker并配置加速器

docker安装与卸载: 1、检查当前是否安装docker yum list installed | grep docker2、卸载docker 根据yum list installed | grep docker查询出来的内容,逐个进行删除 yum remove docker.x86 64 -y3、启动与关闭docker 4、删除/etc/docker文件夹 如果…

少走弯路,ESP32 读取Micro SD(TF)播放mp3的坑路历程。

这个坑采的非常冤枉和巨大,非常大的冤枉路,只能一声叹息 说一下我是如何踩坑的,原本是打算用esp32 读取SD卡播放mp3,在esp32 读取自己打的SD卡已经踩了无数坑了,详情见: 少走弯路,ESP32 使用Micro SD(TF)…

Java学习第五天

数组 数组适合做一批同类型数据的存储。 静态初始化数组: 注意:数组变量名中存储的是数组在内存中的地址,数组是引用类型。 数组的访问 动态初始化数组: 数组的遍历: 注意左边和右边的区别,一个是改变数组…

日元升值,日股遇冷:出口商的烦恼

最近,日元汇率的走强让不少日本企业感到头疼。日元升值就像一把双刃剑,既能带来好处,也能带来坏处。 为什么日元升值会让日本企业头疼? 出口受阻: 当日元升值时,日本商品在国际市场上的价格就会变得相对较…

Access OpenAI (json) API from R

题意:“从 R 访问 OpenAI (JSON) API” 问题背景: I want to access the OpenAI API with the following curl command from R: “我想从 R 中使用以下 curl 命令访问 OpenAI API:” curl https://api.openai.com/v1/engines/davinci/comp…

centos换源安装升级gcc

使用devtools升级安装的时候,由于此库已经停止更新 了,因此需要切换阿里源 SCLDevtoolset 安装与使用笔记-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1889181 1 yum 安装 yum install centos-release-scl c…

一文说清JMeter如何用于用于性能测试(超长请耐心看完)

JMeter是纯Java语言开发。开源、免费是其重要的特点。 起初就是用于性能测试,主要Web端的性能。 后来扩展到接口测试、回归测试等功能测试领域。 拥有界面,支持多语种。界面还比较完善,适合初学者掌握和使用。 JMeter无需安装,…

Django中的第一个自动化测试编写

跟着Django官网中的投票应用学习,其中有官方说明的一个bug:如果 Question 是在一天之内发布的,那么这个Question 应该显示“published_recently”,返回值为True ,然而现在如果问题发布时间为30天之后(未来时间),也会返…

Prometheus+Grafana监控数据可视化

上一篇文章讲了prometheus的简单使用,这一篇就先跳过中间略显枯燥的内容,来到监控数据可视化。 一方面,可视化的界面看着更带劲,另一方面,也更方便我们直观的查看监控数据,方便后面的学习。 Grafana安装与…

如何使用 TortoiseGit(小乌龟)进行项目源代码的检出、添加与提交、代码推送与拉取

😀前言 本文详细介绍如何使用 TortoiseGit(小乌龟)进行项目源代码的检出、文件的添加与提交、代码的推送与拉取, 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀&#…

准备并执行库存盘点

库存盘点 企业需要定期盘点其库存的原因有很多。 许多国家的法律要求公司对其物料库存进行库存盘点。库存盘点会检查公司财务报表中所显示的流动资产的物料库存。 由于内部原因,建立正确可用的库存数量是非常重要的。这也是“物料需求计划”的目标,例…