Gitlab结合阿里云ECS进行弹性伸缩构建

Gitlab结合阿里云ECS进行弹性伸缩构建

问题背景

Gitlab 默认支持亚马逊、微软云、谷歌云的弹性伸缩构建,如果想使用阿里云实现弹性伸缩构建,可以考虑使用官方提供的基于k8s的弹性伸缩构建,但是大部分情况下单独配置一个集群有些麻烦。

官方提供了一个Custom Runner,可以借助shell脚本实现自定义逻辑。那么我们就可以在脚本中利用阿里云的sdk动态创建ECS实例来实现弹性伸缩构建。经过简单的测试,利用现成的云盘镜像创建一个实例大概10秒左右,速度可以接受。

所以打算使用这个方案来实现弹性伸缩构建,即每次构建通过特定的镜像ID创建一个阿里云ECS实例,执行构建脚本以后再销毁掉。

脚本原理

脚本构成

整个Custom Runner 分为4个脚本

  • config_exec 用来设置构建目录、环境变量之类的

  • prepare_exec 用来准备脚本执行环境,我们用这个脚本创建ECS实例

    注意:这个脚本每个Job都会运行

  • run_exec 用来运行构建逻辑,我们用这个脚本执行.gitlab-ci.yml中的script,Gitlab调用脚本的方式如下

    bash 复制代码
    /path/to/run_exec.sh /path/to/tmp/script1 prepare_script
  • cleanup_exec 用来清理构建环境,我们用这个脚本释放ECS实例

生命周期

run_exec作为主要执行的脚本,其中有一些生命周期事件需要我们实现

  1. prepare_script 用于查看debug信息
  2. get_sources 用于拉取仓库代码,我们在这个生命周期拉取代码
  3. restore_cache 用于恢复缓存
  4. download_artifacts 用于下载制品
  5. step_* Gitlab自动生成
  6. build_script 用于执行job里面的script,我们在这个生命周期执行自定义的构建脚本
  7. step_* Gitlab自动生成
  8. after_script 用于执行job里面的after_script
  9. archive_cache 或者 archive_cache_on_failure 用于归档缓存
  10. upload_artifacts_on_success 或者 upload_artifacts_on_failure 用于上传制品
  11. cleanup_file_variables 用于删除文件类型的变量

其他

关于脚本的错误处理、返回值、一些具体的例子这里不展开了,可以直接去官方文档查看

脚本源码

代码已经发布到github:项目地址

配置项

Runner配置项

登录镜像需要的密钥、阿里云CLI所需的AK、缓存目录等配置,可以提取到env文件中单独设置

作业配置项

将镜像ID、缓存目录通过特定的环境变量指定,这样不同的项目可以通过配置改变缓存行为,比如Gradle需要缓存~/.gradle目录,nodejs需要缓存~/.npm目录

如何配置.gitlab-ci.yml

yml 复制代码
stages:
- build

build:
    stage: build
    environment:
    name: $CI_COMMIT_BRANCH
    variables:
        CACHE_DIRS: "/root/.npm/,其他目录"
        IMAGE_ID: "阿里云镜像ID"
        INSTANCE_TYPE: "阿里云实例规格(如:ecs.c6.2xlarge)"
        script:
            - |
            # 自定义的构建脚本,如:
            bash deploy/make_product.sh
            bash deploy/k8s_update.sh

优化项

通过缓存目录提高构建速度

可以使用ossfs2.0进行构建缓存的挂载,成本低廉

通过内网拉取代码提高构建速度

如果构建用的服务器和Gitlab在同一个网络,可以对整体构建速度有提升,并且节约网络流量费用

通过内网推送代码提高部署速度

如果构建用的服务器和制品库在同一个网络,可以显著提高部署速度,并且节约网络流量费用

作者:脆皮猪

授权:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐
IAR Systems4 天前
松下电工借助IAR CI/CD解决方案,实现品质与效率双重飞跃
ci/cd
Cherry的跨界思维4 天前
【AI测试全栈:质量】47、Vue+Prometheus+Grafana实战:打造全方位AI监控面板开发指南
vue.js·人工智能·ci/cd·grafana·prometheus·ai测试·ai全栈
古斯塔夫歼星炮5 天前
Dify + Jenkins 实现AI应用持续集成与自动化部署
ci/cd·jenkins·dify
codingWhat5 天前
手把手系列之——前端工程化
ci/cd·devops·前端工程化
测试渣5 天前
持续集成中的自动化测试框架优化实战指南
python·ci/cd·单元测试·自动化·pytest
我的xiaodoujiao6 天前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 51--CI/CD 4--推送本地代码到Git远程仓库
python·学习·测试工具·ci/cd·pytest
deephub7 天前
并行多智能体系统的协调测试实战:从轨迹捕获到CI/CD的六个步骤
人工智能·ci/cd·大语言模型·aiagent
你的论文学长7 天前
文本处理的 CI/CD:用 NLP 静态分析解决查重飘红与 Format Error
人工智能·ci/cd·自然语言处理·重构·论文·学习方法
Elastic 中国社区官方博客9 天前
Agentic CI/CD:使用 Kubernetes 部署门控,结合 Elastic MCP Server
大数据·人工智能·elasticsearch·搜索引擎·ci/cd·容器·kubernetes
莫比乌斯之梦10 天前
使用 Docker 运行 Jenkins:快速搭建高效 CI/CD 环境指南
ci/cd·docker·jenkins