谊品生鲜如何从零开始快速打造CI/CD流水线

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.
云栖号资讯:【 点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!

在当前DevOps的趋势下,持续集成(CI)和持续部署(CD)使得项目构建和发布更加的快捷频繁可靠,那么如何快速搭建CI/CD流水线就至关重要,本次分享如何使用Ansible、Docker、GitLab Runner快速打造CI/CD工作流。

GitLab内置的CI/CD工具GitLab Runner

公司使用GitLab来管理代码,GitLab在生态环境上提供gitlab-runner来实现CI/CD。

安装搭建:下载rpm包安装,使用gitlab-runner命令注册到GitLab上,并使用Docker执行器。gitlab-runner start启动gitlab-runner服务。

使用:在项目根目录下,创建文件.gitlab-ci.yml,导入z_qz/cicd/templates/Maven.gitlab-ci.yml:

1

z_qz/cicd项目文件结构:

2

Demo项目以Maven打包为例。

Demo有两个流水线:build和deploy,并引入需要的操作步骤文件:

3

在before-script.yml里声明了一些函数:

function maven_build() {
echo "maven build"
mvn clean package -U -Dmaven.test.skip=true
}
function gradle_build() {
echo "gradle build"
}
function download_docker_files() {
echo "download Dockerfile"
echo "download entrypoint.sh"
}
function docker_build() {
echo "[start] get docker args"
docker build --build-arg JAR_PATH=${JAR_PATH} --build-arg JAR_FILE=${JAR_FILE} --no-cache -t ${DOCKER_IMAGE} .
docker push ${DOCKER_IMAGE}
echo "[end] done"
}
function download_ansible_roles() {
echo "download site.yml"
echo "download ansible roles.tgz"
}
function notice() {
# 通知
msg="${message:-'太懒了,什么都没留下'}"
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=企业微信机器人' \
  -H 'Content-Type: application/json' \
  -d "{
    \"msgtype\": \"text\",
    \"text\": {
      \"content\": \"${msg}\"
    }
  }"
}
before_script:
- *function

在maven_build.yml文件里实现Maven和Docker打包,并上传Docker镜像到Harbor上:

6

打包阶段: 当环境变量YPSX_STAGE == BUILD才会触发build流水线,并且根据variables传递过来的JDK_VERSION来启动Maven容器,进行maven package,docker build操作。

在deploy.yml文件里实现部署应用到目标机器上:

image: ansible:2.9.7
stage: deploy
tags:
deploy
only:
variables:
- $YPSX_STAGE == "DEPLOY"
script:
- notice # 通知: 谁发布环境下的应用
- download_ansible_roles
- echo "$SSH_PRIVATE_KEY" >> ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ansible-playbook -i /etc/ansible/${ENV}_hosts -e hosts=${APP_NAME} -e DOCKER_IMAGE=${DOCKER_IMAGE} -e APP_NAME=${APP_NAME} \
-e JAR_FILE=${JAR_FILE} -e SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE} -t java site.yaml

SSH_PRIVATE_KEY变量参数在项目组里配置(可作用于组下面所有项目):

组-> settings->CI/CD -> Variables

一些安全系数要求高的参数,可以在这边设置,像Harbor账户密码。
Docker&Harbor(私有Hub)
在maven package生成JAR文件,然后Docker将jar文件打包成应用镜像,上传到Harbor。

在Dockerfile里用了ARG,从docker build --build-arg里获取参数进行JAR文件路径和JAR文件替换,docker build找到JAR文件路径,拷贝JAR到镜像,制作应用镜像。

这边使用Harbor,使用docker-compose命令,就能安装启动,非常方便,以及提供镜像清理。

8

Ansible自动化运维工具

Ansible通过SSH管理目标机器,机器信息(inventory)使用该格式/etc/ansible/{env}_hosts管理各个环境机器。

使用ansible roles管理发布过程:

9

check检查Agent和Logspout容器是否存在(docker_container_info new in ansible 2.8):

10

install_agent和install_logspout是应用安装前的初始化:

11

12

install_app安装升级APP,优雅关闭,检查服务状态,销毁应用容器,启动应用容器,检查应用是否启动成功:

13

发布系统

前端使用antd-pro。

后端使用Golang Gin开发审批流程和批次发布等。

通过调用GitLab API创建Pipeline触发流水线。


--header "Content-Type: application/json" \

--data '{ "ref": "test", "variables": [{"key": "YPSX_STAGE", "value":"BUILD"}, {"key": "JDK_VERSION", "value": "11"}] }' \

"https://gitlab.example.com/api/v4/projects/99/pipeline"

在Variables里传递:

14

还可以指定build流水线的镜像,这边传递JDK_VERSION=11。

镜像将使用Maven:3.6.3-jdk-11。

在没有Web管理系统前,我们可以骚气地操作,git tag dev_xxx针对当前的tag代码,打包、发布到dev环境:

15

Q&A

Q:有对照过Jenkins,Drone等其他CI/CD工具吗,出于什么考虑最后选择gitlab-runner,未来有考虑过Kubernetes这方面的集成吗?

A:gitlab-runner,Jenkins,Drone都属于配置即操作的工具,因为使用GitLab来管理代码,gitlab-runner又很好贴近GitLab,维护成本也不高,类似Jenkins的Node,安装注册,就能拿来用。 正在引入Kubernetes中。

Q:从镜像到部署到Kubernetes,是通过什么实现的,kubectl还是镜像更新触发?在这个过程中能不能调整一些deployment的配置,比如resource.cpu.request或者Ingress的一些配置?

A:这边,现在没有使用Kubernetes(二季度将引入Kubernetes),只将应用Docker镜像,发布到目标机器上,如果引入Kubernetes,将开发调用Kubernetes的API server接口,传递yaml配置文件。

Q:对于项目是如何进行部署检测的?对tag进行监听吗?

A:在项目根目录下添加配置文件.gitlab-ci.yml,有only和except数组,支持branch,tag,环境变量,MR,文件变动(像README.md)。

Q:相比Jenkins如何?

A:轻量些,GitLab就是Server端,gitlab-runner就是节点。不需要配置git clone。

Q:产品代码迭代提交中,如何区别正常的合并代码、以及构建请求呢

A:构建请求时,是让开发选择要发布的分支,进行打包发布。

Q:gitlab-ci.yml放在根目录下, 是否会增加维护成本。这些文件的改动是业务研发修改,还是专人维护呢?

A:.gitlab-ci.yml四行代码,就这四行固定,加到项目脚手架里,没有维护成本,通过include cicd项目,运维在cicd项目里进行维护打包和发布操作代码,对业务代码,零影响。

Q:请问自动化测试准备怎么加入呢?

A:发布成功后,调用自动化测试平台API。

Q:针对GitLab Runner是要驱动整个产品的研发去触发CI/CD吧,对于不懂Docker及Kubernetes yaml语法的同事,怎么让他们接受新的发布体系及使用呢?

A:.gitlab-ci.yml的语法是运维写好的,开发只要在页面上点击发布,发布系统触发。

Q:请问有没有高并发拉取镜像的问题?有没有遇到过在高并发下GitLab性能下降的问题?

A:Harbor(机器配置偏低)遇到过高并发拉取问题,在一次大量迁移的时候,没有按批次操作,平常开发发布,Harbor完全可以胜任,高并发下对GitLab影响不大,GitLab主要还是触发gitlab-runner去运行打包和发布,gitlab-runner机器配置稍微高些,因为除了Java的Maven和Gradle,我这边还将Node打包也集成在这个项目里。

Q:详细介绍一下灰度发布是怎么做的吧,例如两次发版数据库结构不一致,是如何做发布和回滚的,流量怎么分发到新旧版的?

A:发布前,升级数据库结构版本,先执行数据库结构变更(凌晨);
回滚:将数据库结构回滚,应用retry上一次发布记录;流量通过网关配置。

Q:公司目前就20来个开发,适合自己搞这套吗?

A:如果你们还在手动发布的话,建议你们使用gitlab-runner,可以使用git tag方式,发布,我们也是一步一步走过来的,先前没有发布系统,开发使用打tag方式发布,这个没有约束看开发个人,后面开发了套发布系统,在上面做了工作流管理。

Q:发布系统权限怎么控制的?

A:分应用开发和应用Onwer,RBAC。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址: https://yqh.aliyun.com/live

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
18天前
|
JavaScript 前端开发 持续交付
Prettier 高级应用:集成 CI/CD 流水线与插件开发
【10月更文挑战第18天】Prettier 是一款流行的代码格式化工具,它能够自动将代码格式化成一致的风格,从而提高代码的可读性和维护性。对于希望进一步发挥 Prettier 潜力的高级用户而言,将 Prettier 集成到持续集成(CI)和持续部署(CD)流程中,确保每次提交的代码都符合团队标准,是非常重要的。此外,通过开发自定义插件来支持更多语言或扩展 Prettier 的功能也是值得探索的方向。本文将详细介绍这两方面的内容。
36 2
|
19天前
|
jenkins 测试技术 持续交付
Docker最佳实践:构建高效的CI/CD流水线
【10月更文挑战第17天】在现代软件开发实践中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)已成为提高开发效率和软件质量的重要手段。Docker作为一种容器技术,为构建一致且隔离的开发环境提供了强有力的支撑。本文将探讨如何利用Docker来优化CI/CD流程,包括构建环境的标准化、镜像管理以及与CI/CD工具(如Jenkins、GitLab CI)的集成。
37 5
|
1月前
|
运维 jenkins 持续交付
自动化运维之路:构建高效CI/CD流水线
在软件开发的快节奏中,持续集成和持续部署(CI/CD)流水线是提升效率、保障质量的关键。本文将引导你理解CI/CD流水线的重要性,并手把手教你如何搭建一个高效的自动化运维系统。通过实际代码示例,我们将一步步实现从代码提交到自动测试、部署的全流程自动化,确保软件交付过程既快速又可靠。
|
2月前
|
Kubernetes 持续交付 Go
创建一个基于Go程序的持续集成/持续部署(CI/CD)流水线
创建一个基于Go程序的持续集成/持续部署(CI/CD)流水线
|
3月前
|
弹性计算 运维 Serverless
项目管理和持续集成系统搭建问题之云效流水线支持阿里云产品的企业用户如何解决
项目管理和持续集成系统搭建问题之云效流水线支持阿里云产品的企业用户如何解决
78 1
项目管理和持续集成系统搭建问题之云效流水线支持阿里云产品的企业用户如何解决
|
3月前
|
敏捷开发 Java 测试技术
阿里云云效产品使用合集之如何下载流水线构建过程中生成的jar
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3月前
|
敏捷开发 测试技术 持续交付
阿里云云效产品使用合集之如何限制在本地的构建主机创建的流水线的并发数
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3月前
|
敏捷开发 Java 测试技术
阿里云云效产品使用合集之怎么设置流水线中的全局参数
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3月前
|
运维 Java Devops
阿里云云效操作报错合集之在流水线增加单元测试报错,是什么导致的
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
3月前
|
缓存 运维 前端开发
阿里云云效操作报错合集之如何解决在使用流水线构建net8应用时遇到无法构建的报错
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
下一篇
无影云桌面