Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >gitlab实现CICD的实战过程

gitlab实现CICD的实战过程

作者头像
用户10002156
发布于 2024-01-03 07:01:41
发布于 2024-01-03 07:01:41
42300
代码可运行
举报
文章被收录于专栏:生活处处有BUG生活处处有BUG
运行总次数:0
代码可运行

背景

目前的现状,开发者在提交代码后还需要去构建镜像,上传镜像到镜像仓库,频繁的修改就需要频繁的构建。

  • • 用户每次写完代码要本地构建,需要本地有docker运行的环境,环境问题在日常开发中经常出现.
  • • 本地构建、推送到仓库后本地就残留了镜像文件,因为仓库会保存镜像,本地镜像就会浪费本地的存储空间.
  • • 代码需要通过代码检测平台的检测,比如社区的一些优秀解决方案 : SonarQube等
  • • push完代码后(或者push之前)代码需要有一些自动化测试

安装

前置条件

需要安装docker和docker-compose(docker安装和docker-compose社区有大量的文章,本文不做说明)

搜索并下载gitlab和gitlab-runner的镜像

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker pull gitlab/gitlab-ee:14.5.2-ee.0
docker pull gitlab/gitlab-runner

清除之前的测试数据(要小心你的环境下这个目录下没有生产或重要数据,是可以自由删除的)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo rm -rf ~/software/docker/gitlab/
mkdir ~/software/docker/gitlab/ && cd ~/software/docker/gitlab/

新建demo文件夹,并在demo文件夹下新建docker-compose.yml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo -e "version: '3.3'

services:
  gitlab:
    container_name: gitlab
    image: gitlab/gitlab-ee:14.5.2-ee.0
    restart: always
    hostname: 10.147.20.17
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://10.147.20.17'
        # Add any other gitlab.rb configuration here, each on its own line
    ports:
      - 80:80
      - 7443:443
    volumes:
      - ~/software/docker/gitlab/config:/etc/gitlab
      - ~/software/docker/gitlab/logs:/var/log/gitlab
      - ~/software/docker/gitlab/data:/var/opt/gitlab" > docker-compose.yml
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker-compose up -d

在另一台电脑,也可以是同一台电脑

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo rm -rf ~/software/docker/gitlab-runner/
mkdir ~/software/docker/gitlab-runner/ && cd ~/software/docker/gitlab-runner/

echo "version: '3.3'
services:
  gitlab-runner:
    container_name: gitlab-runner
    image: gitlab/gitlab-runner
    restart: unless-stopped
    privileged: true
    volumes:
      - ~/software/docker/gitlab-runner/data:/etc/gitlab-runner
      - /home/xj/tmp/1023/test:/home/xj/tmp/1023/test
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/bin/dockerr
    networks:
      - mynetwork
networks:
  mynetwork:
    external: true" > docker-compose.yml
      
  • • /var/run/docker.sock:/var/run/docker.sock 宿主机机的docker.sock映射到镜像里面
  • • /usr/bin/docker:/bin/docker 宿主机的docker可执行映射到镜像里面 后面build的时候会用到

在当前目录运行命令,这个container启动需要些时间,等待一会就好

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker-compose up -d

gitlab-ce初装以后,密码放在了一个临时文件中 /etc/gitlab/initial_root_password 这个文件将在首次执行reconfigure后24小时自动删除

cicd0安装成功

查看gitlab-ce的root账号的默认密码(copy保存好,待会要登录用)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker exec -it gitlab cat /etc/gitlab/initial_root_password

image-20231020191823670

登录你的IP,如:http://10.147.20.17 (这里换成你自己的ip)

image-20231021122709663

账号是root,密码是刚查看的密码

修改成中文

image-20231022214641045

保存之后,刷新一下即可显示中文界面

点击上边的加号,新建一个代码仓库

image-20231021123119798

开始你的第一个runner

注册runner

进入项目设置->CI/CD->Runner

image-20231022214847737

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(base) xj@xjpc:~/software/docker/gitlab-runner$ docker exec -it gitlab-runner gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=28 revision=853330f9 version=16.5.0
Running in system-mode.                            
                                                   
Enter the GitLab instance URL (for example, https://gitlab.com/):
http://10.147.20.17/
Enter the registration token:
xKw1V6r38xd72xrdCqFm
Enter a description for the runner:
[1ed3682970c5]: 
Enter tags for the runner (comma-separated):
xjpc
Enter optional maintenance note for the runner:

WARNING: Support for registration tokens and runner parameters in the 'register' command has been deprecated in GitLab Runner 15.6 and will be replaced with support for authentication tokens. For more information, see https://docs.gitlab.com/ee/ci/runners/new_creation_workflow 
Registering runner... succeeded                     runner=xKw1V6r3
             
Enter an executor: ssh, virtualbox, docker+machine, instance, custom, docker-windows, parallels, shell, docker-autoscaler, kubernetes, docker:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
 
Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml" 

查看配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker exec -it gitlab-runner cat /etc/gitlab-runner/config.toml

把gitlab-runner加入到sudo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker exec -it gitlab-runner usermod -aG sudo gitlab-runner

检测

这个时候我们再回到gitlab页面上,就能看到刚才我们最新注册的runner(我之前注册过所以这边显示两个)

image-20231022215231911

至此我们的注册步骤已经结束了 当我们再向仓库push代码的时候 就会根据我们的仓库根目录的gitlba-ci.yml文件运行我们的CI,下面我将贴一下一个最简单的gitlba-ci.yml文件

CICD配置

进入仓库的CI/CD,点击编辑器,点击配置流水线,这里有个deom配置模板。

注意

配置中一定要选好执行的runner,就是要写好runner对应的tags,如上边截图的xjpc,简单的配置demo如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# This file is a template, and might need editing before it works on your project.
# To contribute improvements to CI/CD templates, please follow the Development guide at:
# https://docs.gitlab.com/ee/development/cicd/templates.html
# This specific template is located at:
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml

# This is a sample GitLab CI/CD configuration file that should run without any modifications.
# It demonstrates a basic 3 stage CI/CD pipeline. Instead of real tests or scripts,
# it uses echo commands to simulate the pipeline execution.
#
# A pipeline is composed of independent jobs that run scripts, grouped into stages.
# Stages run in sequential order, but jobs within stages run in parallel.
#
# For more information, see: https://docs.gitlab.com/ee/ci/yaml/index.html#stages

stages:          # List of stages for jobs, and their order of execution
  - build
  - test
  - deploy

unit-test-job:   # This job runs in the test stage.
  stage: test    # It only starts when the job in the build stage completes successfully.
  tags:
    - xjpc
  script:
    - echo "Running unit tests... This will take about 60 seconds."
    - echo "Code coverage is 90%"

查看执行情况

image-20231022215654312

点进去,可以查看执行的过程

image-20231022215735471

至此,大概的配置就完成了。

其他

demo:git clone

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker exec -it -u gitlab-runner gitlab-runner ssh-keygen
docker exec -it -u gitlab-runner gitlab-runner ssh-copy-id -i /home/gitlab-runner/.ssh/id_rsa.pub xj@172.16.101.222

gitlba-ci.yml配置(一般是在runner上编译和测试,而不是ssh到生产服务器去编译)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# This file is a template, and might need editing before it works on your project.
# To contribute improvements to CI/CD templates, please follow the Development guide at:
# https://docs.gitlab.com/ee/development/cicd/templates.html
# This specific template is located at:
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml

# This is a sample GitLab CI/CD configuration file that should run without any modifications.
# It demonstrates a basic 3 stage CI/CD pipeline. Instead of real tests or scripts,
# it uses echo commands to simulate the pipeline execution.
#
# A pipeline is composed of independent jobs that run scripts, grouped into stages.
# Stages run in sequential order, but jobs within stages run in parallel.
#
# For more information, see: https://docs.gitlab.com/ee/ci/yaml/index.html#stages

stages:          # List of stages for jobs, and their order of execution
  - build
  - test
  - deploy

unit-test-job:   # This job runs in the test stage.
  stage: test    # It only starts when the job in the build stage completes successfully.
  tags:
    - xjpc
  script:
    - echo $USER
    - ssh xj@172.16.101.222 "cd /home/xj/tmp/1023/test;git pull http://root:Xiaojin123.@10.147.20.17/root/test.git"

demo:rsync

因该文档选择的执行程序为 shell ,故采用 rsync 命令进行目录同步,如有多台机器新增配置即可。如对 gitlab-runner 进行注册时选择执行程序为 docker 等,该配置并不适用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
before_script:
    - date
stages:
    - build
    - test
    - deploy

deploy_in_web1:
    stage: deploy
    script:
        - git checkout master
        - git pull
        - rsync -rvz --no-owner --no-group --no-perms --progress --exclude=".*" --exclude="/vendor" --delete $CI_PROJECT_DIR/ /data/项目路径
    only:
        - master
    tags:
        - "web1"
        

#配置多台机器,新增配置即可
deploy_in_web2:
    stage: deploy
    script:
        - git checkout master
        - git pull
        - rsync -rvz --no-owner --no-group --no-perms --progress --exclude=".*" --exclude="/vendor" --delete $CI_PROJECT_DIR/ /data/项目路径
    only:
        - master
    tags:
        - "web2"

流水线配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
before_script:
  - echo '====== 准备构建中 ========='
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 单个job全部执行完之后执行
after_script:
  - echo "====== 构建结束 ========="

推荐CI/CD 配置

项目、系统、环境等不尽相同,推荐部署Laravel项目按照的devtestproduction三个环境构建项目,仓库分支保持developtestingmaster三个分支对应前面三个环境构建代码,每个环境的应用参数也不同,可以采用.env.dev.env.test.env.production保存参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
variables:
  RELEASES_STORAGE_DIR: '/var/www/$CI_COMMIT_REF_NAME/$CI_PROJECT_PATH/storage'
  CREATE_RELEASES_STORAGE_DIR: '[ -d $RELEASES_STORAGE_DIR ] || sudo mkdir -p $RELEASES_STORAGE_DIR'
  RELEASES_DIR: '/var/www/$CI_COMMIT_REF_NAME/$CI_PROJECT_PATH/releases'
  CREATE_RELEASE_DIR: '[ -d $RELEASES_DIR ] || sudo mkdir -p $RELEASES_DIR'
  NEW_RELEASES_DIR: '$RELEASES_DIR/$CI_COMMIT_SHORT_SHA'
  CREATE_NEW_RELEASES_DIR: '[ -d $NEW_RELEASES_DIR ] || sudo mkdir -p $NEW_RELEASES_DIR'
  BEFORE_CHMOD: 'sudo chown -R deployer:deployer $NEW_RELEASES_DIR'
  BEFORE_CHMOD_VENDOR: 'sudo chown -R deployer:deployer $NEW_RELEASES_DIR/vendor'
  AFTER_CHMOD: 'sudo chown -R apache:apache /var/www/$CI_COMMIT_REF_NAME && sudo chown -R apache:apache $RELEASES_STORAGE_DIR && sudo chmod -R 777 $RELEASES_STORAGE_DIR'
  CD_NEW_RELEASES_DIR: 'cd $NEW_RELEASES_DIR'
  CD_RELEASES_DIR: 'cd $RELEASES_DIR'
  #Linux删除除了某个文件之外的所有文件/目录
  CLEAN_RELEASES_DIR: 'ls |grep -v $CI_COMMIT_SHORT_SHA |xargs sudo rm -rf'
  RM_RELEASE_STORAGE_DIR: 'sudo rm -rf $NEW_RELEASES_DIR/storage'
  LN_RELEASE_STORAGE_DIR: 'sudo ln -nfs $RELEASES_STORAGE_DIR $NEW_RELEASES_DIR/storage'
  LN_RELEASE_DIR: 'sudo ln -nfs $NEW_RELEASES_DIR /var/www/$CI_COMMIT_REF_NAME/$CI_PROJECT_PATH/current'
  MV_REPO: 'sudo mv -fv /home/deployer/$CI_PROJECT_DIR/* $NEW_RELEASES_DIR'
  CP_DEV_ENV: 'cp /home/deployer/$CI_PROJECT_DIR/.env.dev $NEW_RELEASES_DIR/.env'
  CREATE_FRAMEWORK_CACHE: '[ -d $RELEASES_STORAGE_DIR/framework/cache ] || sudo mkdir -p $RELEASES_STORAGE_DIR/framework/cache'
  CREATE_FRAMEWORK_SESSIONS: '[ -d $RELEASES_STORAGE_DIR/framework/sessions ] || sudo mkdir -p $RELEASES_STORAGE_DIR/framework/sessions'
  CREATE_FRAMEWORK_TESTING: '[ -d $RELEASES_STORAGE_DIR/framework/testing ] || sudo mkdir -p $RELEASES_STORAGE_DIR/framework/testing'
  CREATE_FRAMEWORK_VIEWS: '[ -d $RELEASES_STORAGE_DIR/framework/views ] || sudo mkdir -p $RELEASES_STORAGE_DIR/framework/views'


before_script:
  - echo "Before script"
  - echo $CI_COMMIT_REF_NAME
  - echo $CI_PROJECT_PATH
  - echo $CI_COMMIT_SHORT_SHA
  - echo $CI_REPOSITORY_URL
  - echo $CI_PROJECT_DIR
  - 'eval $CREATE_RELEASES_STORAGE_DIR'  # will execute
  - 'eval $CREATE_RELEASE_DIR'  # will execute
  - 'eval $CREATE_NEW_RELEASES_DIR'  # will execute
  - 'eval $CD_NEW_RELEASES_DIR'


stages:
  - build
  - test
  - deploy-dev

building:
  stage: build
  script:
    - echo "Move repo..."
    - echo $NEW_RELEASES_DIR
    - 'eval $BEFORE_CHMOD'
    - 'eval $MV_REPO'
    - composer install
    - 'eval $BEFORE_CHMOD_VENDOR'

testing:
  stage: test
  script:
    - echo "testing..."
    # - php ./vendor/bin/phpunit

deploying_dev:
  stage: deploy-dev
  script:
    - echo "deploying dev..."
    - 'eval $CP_DEV_ENV'
    - php artisan key:generate
    - 'eval $CREATE_FRAMEWORK_CACHE'
    - 'eval $CREATE_FRAMEWORK_SESSIONS'
    - 'eval $CREATE_FRAMEWORK_TESTING'
    - 'eval $CREATE_FRAMEWORK_VIEWS'
    - php artisan cache:clear
    - php artisan config:clear
    - php artisan storage:link
    - php artisan migrate --force
    - php artisan passport:keys
    - echo "Restarting supervisor"
    - sudo supervisorctl restart all
    - echo "Linking storage directory"
    - 'eval $RM_RELEASE_STORAGE_DIR'
    - 'eval $LN_RELEASE_STORAGE_DIR'
    - echo 'Linking current directory'
    - 'eval $AFTER_CHMOD' 
    - 'eval $LN_RELEASE_DIR'
    - echo 'Removing earlier app'
    - 'eval $CD_RELEASES_DIR'
    - 'eval $CLEAN_RELEASES_DIR'
  only:
    - develop
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生活处处有BUG 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Gitlab-CICD最简单明了的入门教程
由于目前公司使用的gitlab,大部分项目使用的CICD是gitlab的CICD,少部分用的是jenkins,使用了gitlab-ci一段时间后感觉还不错,因此总结一下
全栈程序员站长
2022/09/07
6.6K0
Gitlab-CICD最简单明了的入门教程
持续集成gitlab-ci.yml配置文档基础
[TOC] 0x00 简述 Q:什么是.gitlab-ci.yaml?它有什么作用? 答:gitlab-ci全称是gitlab continuous integration的意思就是持续集成;gitl
全栈工程师修炼指南
2020/10/23
15.3K1
持续集成gitlab-ci.yml配置文档基础
图文详解k8s自动化持续集成之GitLab CI/CD
  如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
sunsky
2020/08/20
5K0
图文详解k8s自动化持续集成之GitLab CI/CD
【Git】GitLab CI/CD 的执行流程及实战
GitLab CI/CD 是一个简洁好用的的持续集成/持续交付的框架。通过为你的项目配置一个或者多个 GitLab Runner,然后撰写一个 .gitlab-ci.yml,你就可以很方便地利用 GitLab CI/CD 来为你的项目引入持续集成/交付的功能。
瑞新
2020/12/07
5.4K0
【Git】GitLab CI/CD 的执行流程及实战
使用 vagrant 从搭建 gitlab server 开始体验整个 gitlab CI/CD 过程
GitLab一个开源的git仓库管理平台,方便团队协作开发、管理。在GitLab上可以实现完整的CI(持续集成)、CD(持续发布)流程。而且还提供了免费使用的Plan,以及免费的可以独立部署的社区版本。
用户7685359
2020/08/22
1K0
GitLab CI/CD 自动化构建与发布实践
CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。这篇文章中,我将会介绍基于 GitLab CI/CD 的自动化构建与发布实践。如下图所示,整个流程将分为几个部分:
Se7en258
2021/11/30
5K1
GitLab CI/CD 自动化构建与发布实践
gitlab ci/cd 多项目流水线制品合并方案
首先需要在linux上安装 gitlab-runner 然后注册一个shell作为执行器的runner 该runner将应用于需要构建的项目
拿我格子衫来
2022/01/24
9200
gitlab ci/cd 多项目流水线制品合并方案
花椒前端基于 GitLab CI/CD 的自动化构建、发布实践
在公司搭建内部 GitLab 平台后,前端活动项目从 SVN 迁移到 GitLab。本文介绍如何基于 GitLab CI/CD 实现自动化构建及发布。
ConardLi
2019/07/04
3K0
复制的官方GitLab 文档
stage: Verify group: Continuous Integration info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments type: reference
拿我格子衫来
2022/01/24
2.5K0
Ubuntu18注册gitlab-runner并激活CI/CD
打开 gitlab 项目 -> 设置 -> CI / CD -> Runners 设置,获取令牌
用户8851537
2021/08/04
1.1K0
1.基于GitLab代码仓库的持续集成基础配置和使用
[TOC] 0x00 前言简述 CI/CD介绍 Q:我们常说的CI/CD是什么? CI 为 Continuous Integration 的缩写持续集成,可以理解为代码变动提交后,自动执行代码编译、代
全栈工程师修炼指南
2022/09/29
3.9K0
1.基于GitLab代码仓库的持续集成基础配置和使用
基于GitLab实现端到端DevOps流水线实践
创建issue --> 创建特性分支 --> 特性分支提交流水线 --> 合并分支流水线 --> 发布分支流水线
DevOps云学堂
2020/05/27
1.4K0
用Gitlab CICD Pipeline Template部署应用
Gitlab的CI/CD[1]是通过Gitlab runner执行器实现的,它作为执行器运行我们在.gitlab-ci.yml中定义的一些逻辑行为。前面三篇讲述的是Gitlab的安装、通过一个flask web框架服务进行代码兼容性检查、编译、部署的整个pipeline.
公众号: 云原生生态圈
2020/06/15
2.5K0
用Gitlab CICD Pipeline Template部署应用
Golang基于Gitlab CI/CD部署方案
持续集成 (Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
李海彬
2018/12/24
1.5K0
基于GitLab的CI执行
在之前编写过CI与Gitlab的整合应用,下来主要详细的介绍使用Gitlab工具的CI的可持续应用。搭建好Gitlab的环境好后,我们需要在Linux的环境安装Gitlab的插件gitlab-ci,安装命令为:
无涯WuYa
2022/01/18
5900
基于GitLab的CI执行
Golang基于Gitlab CI/CD部署方案
持续集成 (Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
李海彬
2018/09/29
3K0
Golang基于Gitlab CI/CD部署方案
Gitlab-CICD实践篇(下)
该实践方案主要介绍微服务项目使用gitlab自带的GitLab Continuous Integration (CI) & Continuous Delivery (CD)功能,在gitlab提供的runner里面进行打包、测试、发布。
陈不成i
2021/06/07
8430
依托于GitLab持续集成基础配置和使用
[TOC] 0x00 前言简述 Q:我们常说的CI/CD是什么? CI 为 Continuous Integration 的缩写持续集成,可以理解为代码变动提交后,自动执行代码编译、代码打包、代码测试
全栈工程师修炼指南
2020/10/23
2.2K0
依托于GitLab持续集成基础配置和使用
gitlab cicd配置
以前代码更新之后,我们需要手动将代码拉到测试服务器上,运行验收通过之后,再在生产环境重新弄一遍,一两个服务还算轻松,如果涉及到的服务很多的话,每一个服务都需要这样来几遍,这是一个很头疼了,为了解决这个问题,我们引入了比较简单易懂的自动化部署工具,这也是gitlab自带的CI工具gitlab-runner,该工具解决了多环境多服务手动部署繁琐问题,用自动化脚本代替人工部署,我们不需要手动去部署单个服务,可以机械化的执行我们的部署过程。那么一个项目如何配置gitlab CI来实现自动部署呢,主要分两步(前提条件时已经又gitlab-runner服务了):
全栈程序员站长
2022/06/28
7370
基础架构之Gitlab Runner
https://docs.gitlab.com/runner,这篇文章主要介绍安装及项目使用。
低代码布道者
2022/12/11
6920
基础架构之Gitlab Runner
相关推荐
Gitlab-CICD最简单明了的入门教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验