zoukankan      html  css  js  c++  java
  • gitlab-cicd

    安装gitlab

    安装包方式安装

    修改配置后的初始化
    gitlab-ctl reconfigure
    启动
    sudo gitlab-ctl start
    停止
    sudo gitlab-ctl stop
    重启
    sudo gitlab-ctl restart
    开机启动
    systemctl enable gitlab-runsvdir.service
    禁止开机自启动
    systemctl disable gitlab-runsvdir.service
    

    docker方式部署gitlab-ce

    sudo docker run --detach 
     --hostname 10.0.0.6 
     --publish 443:443 --publish 80:80 --publish 222:22 
     --name gitlab 
     --restart always 
     --volume /srv/gitlab/config:/etc/gitlab 
     --volume /srv/gitlab/logs:/var/log/gitlab 
     --volume /srv/gitlab/data:/var/opt/gitlab 
    gitlab/gitlab-ce:latest
    

    修改默认的管理员密码

    默认用户名密码:
    root
    除非您在安装过程中提供了自定义密码,否则将随机生成一个密码并在/etc/gitlab/initial_root_password. 使用此密码和用户名root登录
    docker exec -it gitlab  bash
    gitlab-rails console
    user = User.where(id: 1).first
    user.password = '12345678'
    user.password_confirmation = '12345678'
    user.save!
    用户名:admin@example.com
    密码:12345678
    

    doceker方式部署docker-runner

    sudo docker run -d --name gitlab-runner --restart always 
      -v /srv/gitlab-runner/config:/etc/gitlab-runner 
      -v /var/run/docker.sock:/var/run/docker.sock 
      gitlab/gitlab-runner:latest
    

    docker-runner注册到gitlab

    docker run --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register 
      --non-interactive 
      --executor "docker" 
      --docker-image python:latest 
      --url "http://10.0.0.6/" 
      --registration-token "Sui6mVh96k2HXzJAhcGW" 
      --tag-list "docker" 
      --run-untagged="true" 
      --locked="false" 
      --access-level="not_protected" 
    

    注册命令解释

    docker run --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register 
      --non-interactive 
      --executor "docker"  执行方式 docker (dockershellk8s)
      --docker-image alpine:latest  指定docker使用的基础镜像
      --url "http://10.0.0.6/"  gitlab的url地址
      --registration-token "Sui6mVh96k2HXzJAhcGW"  token值
      --tag-list "test-cicd2,docker-cicd2"  标签
      --run-untagged="true"  是否运行没有标签的任务
      --locked="false"  是否为锁定状态
      --access-level="not_protected"  运行级别
    

    gitlab-runner的执行器

    shell
    docker
    K8S
    

    完整版如下图:

    对支持的执行器功能进行了对比

    ✗ 为不支持

    ✓ 为支持

    Executor SSH Shell VirtualBox Parallels Docker Kubernetes Custom
    Clean build environment for every build conditional (4)
    Reuse previous clone if it exists conditional (4)
    Runner file system access protected (5) conditional
    Migrate runner machine partial partial
    Zero-configuration support for concurrent builds ✗ (1) conditional (4)
    Complicated build environments ✗ (2) ✓ (3) ✓ (3)
    Debugging build problems easy easy hard hard medium medium medium

    命令解释(help为主 man手册有待补充)

    gitlab-runner的命令解释

    gitlab-runner
         exec                  在本地执行构建
         list                  此命令列出了保存在配置文件中的所有运行程序
         run                   运行多程序服务
         register              默认交互模式下使用,非交互模式添加--non-interactive
         install               下载服务
         uninstall             卸载服务
         start                 启动服务
         stop                  停止服务
         restart              重新启动服务
         status                获取服务的状态
         run-single            单程起跑
         unregister            使用令牌注销
         gitlab-runner  unregister --ur http://10.0.0.6/ --token xxxx
         gitlab-runner  unregister --name test-runner 使用名称注销
          gitlab-runner  unregister --all-runners 注销所有
         verify                此命令检查注册的runner是否可以连接,但不验证gitlab服务是否正在使用runner。 --delete 删除
         artifacts-downloader  下载并提取构建工件
         artifacts-uploader    创建和上传构建工件 
         cache-archiver        创建和上载缓存工件
         cache-extractor       下载并提取缓存工件(内部)
         cache-init            已更改缓存路径的权限(内部)
         health-check          检查特定地址的运行状况
         read-logs            从kubernetes执行器使用的文件读取作业日志
         help, h              
    
    gitlab-runner  install --user=gitlab-runner --working-directory=/home/gitlab-runner
    #--user 指定将用于执行构建的用户
    #--working-directory 指定将使用shell executor 运行构建时所有数据都将存储在其中的根目录
    gitlab-runner uninstall #该命令停止运行并从服务中卸载gitlab runner
    gitlab-runer start #该命令启动gitlab-runner服务
    gitlab-runer stop #停止gitlab-runner服务
    gitlab-runer restart #重启gitlab-runner服务
    gitlab-runer status #此命令显示gitlab-runner服务。当服务正在运行时,退出代码为0;当服务未运行时,退出代码未非零。
    

    gitlab-ctl的命令解释

    omnibus-ctl: command (subcommand)
    check-config
      检查gitlab.rb中是否有在指定版本中删除的任何配置
    deploy-page
      打开部署页面
    diff-config
      将用户配置与软件包可用配置进行比较
    prometheus-upgrade
      将Prometheus数据升级至受支持的最新版本
    remove-accounts
     删除此包使用的*所有*用户和组
    reset-grafana
      通过删除数据目录将Grafana实例重置为其初始状态
    set-grafana-password
      重置Grafana的管理员密码
    upgrade
      在包升级后运行迁移
    General Commands:
      cleanse
        删除*所有*gitlab数据,从头开始。
      help
        Print this help message.
      reconfigure
        重新配置应用程序。
      show-config
        显示重新配置将生成的配置。
      uninstall
        终止所有进程并卸载进程管理器(数据将被保留)。
    Service Management Commands:
      graceful-kill
        尝试优雅的停止,然后关闭整个进程组。
      hup
        发送服务一个HUP。
      int
        向服务发送一个INT。
      kill
       发送服务一个杀手锏。
      once
        如果服务关闭,请启动服务。如果它们停止,请不要重新启动它们。
      restart
        如果服务正在运行,请停止服务,然后重新启动它们。
      service-list
        列出所有服务(启用的服务显示为*)
      start
        Start services if they are down, and restart them if they stop.
      status
        显示所有服务的状态。
      stop
        停止服务,不要重新启动它们。
      tail
        查看所有已启用服务的服务日志。
      term
        发送服务一个期限。
      usr1
        将服务发送到USR1。
      usr2
        将服务发送到USR2。
    Backup Commands:
      backup-etc
        备份GitLab配置[接受目录路径]
    Let's Encrypt Commands:
      renew-le-certs
        续订现有证书让我们加密证书
    Database Commands:
      pg-password-md5
        以PostgreSQL格式生成用户密码的MD5哈希
      pg-upgrade
        将PostgreSQL数据库升级至受支持的最新版本
      revert-pg-upgrade
       运行此操作以还原到数据库的早期版本
      set-replication-password
        设置数据库复制密码
    Container Registry Commands:
      registry-garbage-collect
    
    

    gitlab-backup

    Usage: gitlab-backup COMMAND [OPTIONS]
    
    OPTIONS:
    
      -h, --help    Display this help message and exits. Use `COMMAND --help`
                    for more information on a command.
    
    COMMANDS:
      create       创建新备份。
      restore      从备份中恢复
    
    

    gitlab-psql

    psql is the PostgreSQL interactive terminal.
    
    Usage:
      psql [OPTION]... [DBNAME [USERNAME]]
    
    General options:
      -c, --command=COMMAND    仅运行单个命令(SQL或内部)并退出
      -d, --dbname=DBNAME      要连接到的数据库名称(默认值:“gitlab psql”)
      -f, --file=FILENAME      从文件中执行命令,然后退出
      -l, --list               列出可用的数据库,然后退出
      -v, --set=, --variable=NAME=VALUE
                              将psql变量名设置为VALUE
                               (e.g., -v ON_ERROR_STOP=1)
      -V, --version            输出版本信息,然后退出
      -X, --no-psqlrc          不读取启动文件(~/.psqlrc)
    -1(“一”),--单笔交易
                               作为单个事务执行(如果非交互式)
      -?, --help[=options]     show this help, then exit
          --help=commands      列出反斜杠命令,然后退出
          --help=variables     列出特殊变量,然后退出
    
    Input and output options:
      -a, --echo-all           从脚本回显所有输入
      -b, --echo-errors        回显失败的命令
      -e, --echo-queries       发送到服务器的回显命令
      -E, --echo-hidden        显示内部命令生成的查询
      -L, --log-file=FILENAME  将会话日志发送到文件
      -n, --no-readline        禁用增强的命令行编辑(readline)
      -o, --output=FILENAME    将查询结果发送到文件(或|管道)
      -q, --quiet              安静运行(无消息,仅查询输出)
      -s, --single-step       单步模式(确认每个查询)
      -S, --single-line        单行模式(行尾终止SQL命令)
    
    Output format options:
      -A, --no-align           未对齐表输出模式
      -F, --field-separator=STRING
                               未对齐输出的字段分隔符(默认值:“|”)
      -H, --html               HTML表格输出模式
      -P, --pset=VAR[=ARG]     将打印选项VAR设置为ARG(请参阅pset命令)
      -R, --record-separator=STRING
                               未对齐输出的记录分隔符(默认值:换行符)
      -t, --tuples-only        仅打印行
      -T, --table-attr=TEXT    设置HTML表格标记属性(例如,宽度、边框)
      -x, --expanded           打开扩展表输出
      -z, --field-separator-zero
                               将未对齐输出的字段分隔符设置为零字节
      -0, --record-separator-zero
                               将未对齐输出的记录分隔符设置为零字节
    
    Connection options:
      -h, --host=HOSTNAME      数据库服务器主机或套接字目录(默认值:“本地套接字”)
      -p, --port=PORT          数据库服务器端口(默认值:“5432”)
      -U, --username=USERNAME  数据库用户名(默认值:“gitlab psql”)
      -w, --no-password        从不提示输入密码
      -W, --password          强制密码提示(应自动发生)
    
    For more information, type "?" (for internal commands) or "help" (for SQL
    commands) from within psql, or consult the psql section in the PostgreSQL
    documentation.
    
    Report bugs to <pgsql-bugs@postgresql.org>.
    
    

    gitlab-rails

    The most common rails commands are:
     generate     生成新代码(简写别名:“g”)
     console      启动Rails控制台(快捷别名:“c”)
     server       启动Rails服务器(快捷别名:“s”)
     test         运行系统测试以外的测试(简写别名:“t”)
     test:system  运行系统测试
     dbconsole    为config/database.yml中指定的数据库启动控制台
                  (short-cut alias: "db")
    
     new          创建一个新的Rails应用程序。”rails new my_应用程序“创建一个
    “/my_应用程序”中名为MyApp的新应用程序
    
    
    
    

    gitlab-rake

    rake [-f rakefile] {options} targets...
    
    Options are ...
            --backtrace=[OUT]            启用完全回溯。OUT可以是stderr(默认值)或stdout。
            --comments                   仅显示已评论的任务
            --job-stats [LEVEL]          显示作业统计信息。级别=历史记录显示完整的作业列表
            --rules                     跟踪规则解决方案。
            --suppress-backtrace PATTERN 抑制与regexp模式匹配的回溯线。如果--trace打开,则忽略。
        -A, --all                        显示所有任务,即使是未注释的任务(与-T或-D组合使用)
        -B, --build-all                  构建所有先决条件,包括最新的先决条件。
        -D, --describe [PATTERN]         描述任务(匹配可选模式),然后退出。
        -e, --execute CODE               执行一些Ruby代码并退出。
        -E, --execute-continue CODE      执行一些Ruby代码,然后继续正常的任务处理。
        -f, --rakefile [FILENAME]        使用FILENAME作为要搜索的rakefile。
        -G, --no-system, --nosystem     使用标准项目Rakefile搜索路径,忽略系统范围的Rakefile。
        -g, --system                     使用系统范围(全局)rakefile(通常为“~/.rake/*.rake”)。
        -I, --libdir LIBDIR              在所需模块的搜索路径中包括LIBDIR。
        -j, --jobs [NUMBER]              指定并行执行的最大任务数(默认值为CPU核心数+4)
        -m, --multitask                 将所有任务视为多任务。 
        -n, --dry-run                    在不执行操作的情况下进行试运行。
        -N, --no-search, --nosearch      不要在父目录中搜索Rakefile。
        -P, --prereqs                    显示任务和依赖项,然后退出。
        -p, --execute-print CODE         执行一些Ruby代码,打印结果,然后退出。
        -q, --quiet                     不要将消息记录到标准输出
        -r, --require MODULE             在执行rakefile之前需要模块。
        -R, --rakelibdir RAKELIBDIR,     自动导入RAKELIBDIR中的任何.rake文件(默认值为“rakelib”)
            --rakelib
        -s, --silent                    比如--quiet,但也会抑制“目录中”公告。
        -t, --trace=[OUT]               启用调用/执行跟踪,启用完全回溯跟踪。OUT可以是stderr(默认值)或stdout。
        -T, --tasks [PATTERN]            显示带有描述的任务(匹配可选模式),然后退出-AT组合显示不包含任何说明的所有任务。
        -v, --verbose                    将消息记录到标准输出。
        -V, --version                    Display the program version.
        -W, --where [PATTERN]            描述任务(匹配可选模式),然后退出。
        -X, --no-deprecation-warnings   禁用弃用警告
    

    gitlab的config

    文件名gitlab.rb
    实在太长详细另一文件<gitlab配置文件-gitlab.rb详解>
    

    gitlab-runner的config

    文件名config.toml
    官方解释链接<https://docs.gitlab.com/runner/configuration/advanced-configuration.html>
    
    配置默认在/etc/gitlab-runner/config.toml,配置文件更改时不需要重启服务,每隔三秒gitlab runner会检查配置修改并重新加载。
    
    [全局配置]
    concurrent 限制可以同时运行的作业数量
    log_level 日志级别
    log_format 日志格式
    check_interval 检查作业的间隔长度,默认为3秒
    sentry_dsn 启用Sentry错误跟踪
    listen_address http服务监听地址
    [session_server]
    listen_address 会话服务器的内部URL
    advertise_address 访问会话服务器URL
    session_timeout 作业完成后会话可以保持活动状态的秒数,默认值为1800秒
    
    [runners]
    name 描述
    url GitLab 实例 URL
    token runner的的特殊令牌(不是注册令牌)
    tls-ca-file 使用 HTTPS 时验证对等方的证书的文件
    tls-cert-file 使用 HTTPS 时与对等方进行身份验证的证书的文件
    tls-key-file 使用 HTTPS 时要与对等方进行身份验证的私钥的文件
    limit 限制同时处理作业数量,0(默认)表示不限制
    executor  选择应如何构建项目
    shell 生成脚本的 shell 的名称,默认值取决于平台。
    builds_dir 构建存储在所选执行程序上下文中的目录的绝对路径。例如,本地、Docker 或 SSH
    cache_dir 构建缓存存储在所选执行程序上下文中的目录的绝对路径。例如,本地、Docker 或 SSH。如果使用dockerexecutor,则需要在其volumes参数中包含该目录
    environment 追加或覆盖环境变量。
    request_concurrency 限制来自 GitLab 的新作业的并发请求数,默认为1
    output_limit 最大构建日志大小,默认值为4096(4MB)
    pre_clone_script 在克隆 Git 存储库之前执行的命令
    pre_build_script 在克隆 Git 存储库之后但在执行构建之前执行的命令
    post_build_script 在执行构建之后执行的命令
    clone_url 覆盖 GitLab 实例的 URL
    debug_trace_disabled	禁用CI_DEBUG_TRACE特性。当设置为true时,即使用户将CI_DEBUG_TRACE设置为true,调试日志(跟踪)也将保持禁用状态
    referees 额外的工作,将结果作为工作工件传递给 GitLab
    
    [executors]
    shell 默认执行器
    docker docker容器
    docker-windows Windows的docker容器
    docker-ssh docker容器 使用ssh连接
    ssh 远程ssh
    parallels Parallels VM,使用 SSH 连接
    virtualbox  VirtualBox VM,但使用 SSH 连接
    docker+machine 类似docker,但使用自动缩放的 Docker 机器
    docker+ssh+machine 类似docker-ssh,但使用自动缩放的 Docker 机器
    kubernetes Kubernetes pods
    
    [runners.docker]
    allowed_images  可以在.gitlab-ci.yml文件中指定的镜像的通配符列表;如果不存在,则允许所有镜像(相当于["/:*"])
    allowed_services 可以在.gitlab-ci.yml文件中指定的服务的通配符列表;如果不存在,则允许所有镜像(相当于["/:*"])
    cache_dir 缓存目录,此路径可以是绝对路径,也可以是路径
    cap_add 向容器添加额外的 Linux 功能
    cap_drop 从容器中删除其他 Linux 功能
    cpuset_cpus 对照组的CpusetCpus
    cpu_shares 用于设置相对 CPU 使用率的 CPU 份额数,默认为1024
    cpus  CPU数量(在 Docker 1.13 或更高版本中可用)
    devices 与容器共享其他主机设备
    disable_cache  执行器有两个级别的缓存:全局缓存和基于 Docker 卷的本地缓存,此配置标志仅作用于禁用自动创建(未映射到主机目录)缓存卷的本地配置标志
    disable_entrypoint_overwrite  禁用镜像覆盖entrypoint
    dns 供容器使用的 DNS 服务器列表
    dns_search DNS 搜索域列表
    extra_hosts 应该在容器环境中定义的主机
    gpus    Docker容器的GPU设备使用与dockercli相同的格式查看Docker 文档中的详细信息
    helper_image (高级)用于克隆存储库和上传工件的默认帮助程序镜像
    helper_image_flavor 设置辅助镜像风格(alpine或ubuntu)默认为alpine.
    host 自定义 Docker 端点默认为DOCKER_HOST环境或unix:///var/run/docker.sock.
    hostname  Docker 容器的自定义主机名
    image 用于运行作业的镜像
    links 应与运行作业的容器链接的容器
    memory 内存限制
    memory_swap 总内存限制
    memory_reservation  内存软限制
    network_mode  将容器添加到自定义网络
    oom_kill_disable 如果发生内存不足 (OOM) 错误,不终止容器中的进程	
    oom_score_adjust  OOM分数调整
    privileged 使容器以特权模式运行
    pull_policy 镜像拉取策略:never,if-not-present或always(默认)查看拉取策略文档中的详细信息您还可以添加多个拉取策略
    runtime Docker 容器的运行时
    security_opt 安全选项(–security-opt in docker run)获取:分隔键/值的列表
    shm_size 镜像的共享内存大小(以字节为单位)
    sysctls sysctl选项
    tls_cert_path存储 ca.pem、cert.pem 或 key.pem 的目录,用于与 Docker 建立安全的 TLS 连接。在 boot2docker 中很有用。
    tls_verify启用或禁用对 Docker 守护程序连接的 TLS 验证,默认禁用
    userns_mode启用用户命名空间重新映射选项时,容器和 Docker 服务的用户命名空间模式,在 Docker 1.10 或更高版本中可用
    volumes安装挂载卷与 Docker-v标志的语法相同
    volumes_from从另一个容器继承挂载卷,访问级别默认为读写,但可以手动设置为ro(只读)或rw(读写)
    volume_driver用于容器的挂载卷驱动程序
    wait_for_services_timeout等待 Docker 服务的时间设置0为禁用默认为30
    

    gitlab-ci的理论

    gitlab-ci的工作流程

    gitlab的ci流程的组成部分:
    code:开发人员推送的代码
    .gitlab-ci.yml 指定构建、测试和部署的脚本。
    GitLab Runner 运行.gitlab-ci.yml脚本
    
    gitlab-ci的工作流程:
    ①开发人员推送代码到指定分支
    ②触发gitlab-pipeline,自动检测运行.gitlab-ci.yml文件
    ③gitlab runner运行脚本,根据脚本内容进行build test deploy
    

    gitlab-ci的工作原理

    ①将代码托管到git存储库
    ②在项目根目录创建ci文件 .gitlab-ci.yml,在文件中指定构建,测试和部署脚本。
    ③gitlab将检测到他并使用名为gitlab-runner的工具运行脚本
    ④脚本被分组为作业,他们共同组成一个pipeline
    

    gitalb-ci的工作流程图

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-If6k5d1p-1629288433710)(C:Usersshiya.liuAppDataRoamingTypora	ypora-user-imagesimage-20210818171625082.png)]

    gitlab-runner简介

    1、gitlab-runner是一个开源项目,用于运行作业并将结果返回给gitlab
    2、与gitlab-ci结合使用,gitlab-ci是gitlab随附的用于协调作业的开源持续集成服务。
    3、gitlab-runner是使用go语言写的,可以在Linux macos Windows操作系统上进行运行
    4、容器部署需要使用最新docker版本。gitlab-runner需要最少的docker v1.13版本
    5、gitlab-runner版本应和gitlab版本进行同步(避免版本不一致导致差异化)
    6、可以根据需要配置任意数量的runner
    PS:ditlab-runner类似于Jenkins的agent,执行CI持续集成、构建的脚本任务。
    

    gitlab-runner的特点

    作业运行控制:同时执行多个作业
    作业运行环境:
    ①在本地、使用docker容器、使用docker容器并通过SSH执行作业
    ②使用docker容器在不用的云和虚拟化管理程序上自动缩放
    ③连接到远程SSH服务器
    支持bash、Windows batch和Windows powershell
    允许自定义作业运行环境
    自动重新加载配置,无需重启
    易于安装,可作为Linux,macos和Windows的服务
    

    gitlab-runner类型与状态

    类型:
    shared 共享类型,运行整个平台项目的作业(gitlab)
    group 项目组类型,运行特定group下的所有项目的作业(group)
    specific 项目类型,运行指定的项目作业(project)
    
    状态:
    locked 锁定状态,无法运行项目作业
    pause的 暂停状态,暂时不会接受新的作业
    

    job的运行流程

    (根据job的输出日志进行分析)

    Running with gitlab-runner 14.1.0 (8925d9a0) on c088e5ef43f3 RXcgCdUx #选择的gitlab-runner准备运行pipeline
    Preparing the "shell" executor #准备“shell”执行器
    Using Shell executor... #正在使用Shell执行器
    Preparing environment #准备环境
    Running on ea06ddae5852... #正在ea06ddae5852(container id)上运行
    Getting source from Git repository #从Git存储库获取源代码
    Fetching changes with git depth set to 50... #正在获取git深度设置为50的更改
    Reinitialized existing Git repository in /home/gitlab-runner/builds/RXcgCdUx/0/root/shell/.git/ #在/home/gitlab runner/builds/rxgcdux/0/root/shell/.Git中重新初始化现有Git存储库/
    Checking out 5b8e0163 as main... #查找对比
    Skipping object checkout, Git LFS is not installed. #正在跳过对象签出未安装Git LFS。
    Skipping Git submodules setup #正在跳过Git子模块安装程序
    Executing "step_script" stage of the job script #执行作业脚本的“步骤脚本”阶段
    $ ls
    python-demo.py
    test
    $ ls
    python-demo.py
    test
    $ sleep 10
    $ echo "mvn clean"
    mvn clean
    $ sleep 3
    $ touch /home/gitlab-runner/builds/RXcgCdUx/0/root/shell/test.txt
    $ pwd
    /home/gitlab-runner/builds/RXcgCdUx/0/root/shell
    $ sleep 30
    Job succeeded
    

    (gitlab两大要素:gitlab-runner;.gitlab-ci.yml)

    .gitlab-ci.yml的编写语法

    pipeline语法1

    job:
    在每个项目中,使用名为.gitlab-ci.yml的问价配置gitlab ci cd 的pipeline。在文件中可以定义一个或多个job。每个job必须具有唯一的名称(不能使用关键字),每个job都是独立执行的。作业定义了在约束条件下进行的相关操作,每个job至少包含一个script。
    例如:
    
    job1:
        script: "execute-script-for-job1"
    job2:
        script: "execute-script-for-job2"
    
    这里在pipeline中定义了两个作业,每个作业运行不同的命令,命令可以是shell脚本。
    
    script:
    用于运行命令
    
    before_script:
    用于定义一个命令,该命令在每个作业之前运行,必须是一个数组。指定的是script与主脚本中指定的任何脚本串联在一起,并在单个shell中一起执行;
    类似于before_script&&script 这样在一个shell中执行,如果before_script失败则script不会执行。
    
    befor_script失败导致整个作业失败,其他作业将不再执行。作业失败不会影响after_script运行。
    after_script与before_script&&script不是在一个shell中执行,所以他们的失败不会影响到after_script的执行。
    
    after_script:
    用于定义将每个作业(包括失败的作业)之后运行的命令。
    这必须是一个数组。
    指定的脚本在新的shell中执行,与任何before_script或script脚本分开。、
    after_script失败不会导致作业失败。
    
    举例:
    build:
      stage: build
      tags:
        - shell
      only:
        - main
      before_script:
        - echo "这是before_script脚本,表示要和script进行串行执行命令了"
      script:
        - echo "mvn clean"
        - echo "mvn install"
      after_script:
        - echo "这是after_script脚本,表示before_script&&script脚本执行顺序已经过了,但是并不代表他们是否执行成功,这个job即将执行完成"
    
    stages:
    用于定义作业可以使用的阶段,并且是全局定于的
    同一阶段的作业并行运行,不同界阶段按顺序运行。
    阶段的名字可以随意起名
    
    .pre和.post
    .pre始终是整个管道的第一个运行阶段,.post始终是整个管道的最后一个运行阶段。用户定义的阶段都在两者之间运行。.pre和.post的顺序无法更改。如果pipeline仅包含.pre和.post阶段的作业,则不会创建pipeline。
    
    stage:
    是按照job定义的,并且依赖于全局定义的stages。它允许将作业分为不同的阶段,并且同一个stage作业可以并行执行(取决特定条件)
    
    举例:
    
    stages:
      - build
      - deploy
    
    编译:
      stage: build #使用stages定义的阶段,进行执行。
    ...
    ...
        
    variabls
    定义变量,pipeline变量、job变量。job变量优先级最大。
    举例:
    variabls:
      DOMAIN: example.com
    

    pipeline语法2

    pipeline语法2
    
    tags:
    用于允许运行该项目的所有runner列表中选择特定的runner,在runner注册期间,可以指定runner的标签
    
    allow_failure:
    允许失败
    allow_faulure允许作业失败,默认值是false。启用后,如果job失败,该job将在用户界面显示橙色警告,到那是,pipeline的逻辑流程将认为job执行通过,并且不会阻塞。假设所有其他job均为成功,则该job的阶段以及他的pipeline将显示相同的橙色警告。但是,关联的提交将被标记为“通过”,而不会发出警告。不会影响下个job的执行。
    
    
    when:
    on_success 前面阶段中的所有job都成功时才执行job,是默认值
    on_failure 当前面阶段出现失败时执行
    always 总是执行job
    manual 手动执行job
    delayed 延迟执行job
    
    
    retry:
    重试
    配置在失败的情况下重试job的次数
    当job失败并配置了retry,将再次处理该作业,直到达到retry关键字指定的次数
    如果retry设置为2,并且job在第二次运行成功(第一次重试),则不会再次重试,retry值必须是一个整数,等于或大于0,但小于等于2(最多两次重试,总共运行3次)。
    
    
    
    retry也可以设置精确匹配错误
    默认情况下,在失败情况下重试job。max:最大重试次数 when:重试失败的错误类型。
    
    always :在发生任何故障时重试(默认).
    unknown_failure :当失败原因未知时。
    script_failure :脚本失败时重试。
    api_failure :API失败重试。
    stuck_or_timeout_failure :作业卡住或超时时。
    runner_system_failure :运行系统发生故障。
    missing_dependency_failure: 如果依赖丢失。
    runner_unsupported :Runner不受支持。
    stale_schedule :无法执行延迟的作业。
    job_execution_timeout :脚本超出了为作业设置的最大执行时间。
    archived_failure :作业已存档且无法运行。
    unmet_prerequisites :作业未能完成先决条件任务。
    scheduler_failure :调度程序未能将作业分配给运行scheduler_failure。
    data_integrity_failure :检测到结构完整性问题。
    
    timeout:
    job级别的超时可以超过项目级别的超时,但不能超过runner特定的超时。
    三个超时:job的超时、项目的超时、runner的超时
    
    示例1:
    runner超时时间设置为24小时,项目的CICD超时设置为2小时,该工作将在2小时后超时;
    示例2:
    runner不设置超时时间,项目的CICD超时设置为2小时,该工作将在24小时后超时
    示例3:
    runner超时设置为30分钟,项目的CICD超时设置为2小时,该工作在30分钟后将超时
    timeout的应用场景:
    防止某个项目占用runner时间过长,防止runner被长时间占用
    
    parallel:
    并行作业
    配置要并行运行的作业实例数,此值必须大于等于2并且小于等于50
    这将创建N个并行运行的同一作业实例,他们从job_name_1到job_name_N依次命名。
    举例:
    codescan:
        tags:
          - training
        stage: codescan
        script:
            - echo "run codesacn"
            - sleep 3;
        when: on_success
        parallel: 5
    
    
    before_script: #全局设定执行job前的输出(优先级小于job内定义的before_script)
      - echo "before-script!!" #输出内容
    
    variables:  #定义的全局变量
      DOMAIN: example.com #变量内容的key:value
      
    stages:  #定义job要执行的内容 配合stage进行选定,定义了执行顺序
      - build
      - test
      - codescan
      - deploy
    
    build: #注意 这里的build是job的名字 stages中的要真正执行的内容
      before_script: #job内定义的要执行前输出的内容
        - echo "before-script in job"
      stage: build #选定执行的内容
      script:
        - echo "mvn clean "
        - echo "mvn install"
        - echo "$DOMAIN"
      after_script: #执行完成后输出的内容
        - echo "after script in buildjob"
    
    unittest: #job名字
      stage: test #选择的执行内容
      script:
        - ech "run test"
      when: delayed #设置延时30秒的job
      start_in: '30' 
      allow_failure: true #开启允许job运行失败
      
    
    deploy: #job名
      stage: deploy  #选择要执行的内容
      script:
        - echo "hello deploy"
        - sleep 2;
      when: manual #设定手动执行
      
    codescan: #job名
      stage: codescan  #绑定stages中设置的阶段名
      script:
        - echo "codescan"
        - sleep 5;
      when: on_success #当前面都执行成功再执行这个job
     
    after_script: #全局定义job执行完成后输出的语句,如果job中没定义则会执行全局的after_script
      - echo "after-script"
      - ech
      
    
    

    pipeline语法3

    pipeline语法3
    only:
    定义那些分支和标签的git项目将会被job执行(用分支策略来限制job的构建,写在那个步骤,那个步骤就不会执行)
    except:
    定义那些分支和标签的git项目将不会被执行(用分支策略来限制job的构建)
    
    rules:
    构建规则
    rules允许按顺序评估单个规则,直到匹配并为工作动态提供属性
    rules不能和only/except进行组合使用
    可用规则:
    if(如果条件匹配)
    changes(指定文件发生变化)
    exists(指定文件存在)
    
    
    rules-if条件匹配
    如果DOMAIN的值匹配,则需要手动执行
    不匹配on_success
    条件判断从上到下,匹配即停止
    多条件匹配可以使用&& ||
    举例:
    codescan:
        tags:
          - training
        stage: codescan
        script:
            - echo "run codesacn"
            - sleep 3;
        rules:
            - if: '$DOMAIN == "example.com"'
              when: manual
            - if: '$DOMAIN == "aexample.com"'
              when: delayed
              start_in: '5'
            - when: on_success
            
    rules-changes 文件变化
    接受文件路径数组
    如果提交中文件发生的变化则为true
    
    rules-exists
    文件存在
    接受文件路径数组
    当仓库中存在指定的文件时操作
    
    workflow:
    控制pipeline的运行
    顶级workflow关键字适用于整个pipeline,并将确定是否运行pipeline
    when 可以设置为always或never,如果未提供,则默认值为always
    
    

    pipeline语法4

    pipeline语法4
    cache:缓存
    存储编译项目所需的运行时依赖想项,指定项目工作空间中需要在job之间缓存的文件或目录
    全局cache定义在job之外,针对所有job生效。job中cache优先于全局中的cache。
    cache:paths
    在job build中定义缓存,将会缓存target目录下的所有.jar文件
    当在全局定义了cache:paths会被job中定义的cache所覆盖。
    问题:
    由于缓存是在job之间共享的,如果不同的job使用不同的路径就出现了缓存覆盖的问题
    如何让不同的job缓存不同的cache呢?
    解决:设置不同的cache:key
    cache:key-缓存标记
    为缓存做个标记,可以配置job,分支为key来实现分支、作业特定的缓存。
    为不同job定义了不同的cache:key时,会为每个job分配一个独立的cache。
    cache:key变量可以使用任何预定义变量,默认default
    从gitlab9.0开始,默认情况下所有内容都在pipeline和作业之间共享。
    
    按照发分支设置缓存
    cache:
      key: ${CI_COMMIT_REF_SLUG}
    
    cache:key:files 文件变化自动创建缓存
    files:文件发生变化自动重新生成缓存(files最多指定两个文件),提交的时候检查指定的文件。根据指定的文件生成密钥计算SHA校验,如果文件未改变,值就为default
    
    cache:policy 缓存策略
    默认:在执行开始下载时下载文件,并在结束时重新上传文件
    policy:pull跳过下载步骤,policy:push,跳过上传步骤
    
    
    artifacts:
    制品
    用于指定在作业成功或者失败时应附加到作业的文件或目录的列表。作业完成后,工件将被发送到gitlab,并在gitlab ui中提供下载
    
    artifacts:expose_as关键字可用于在合并请求UI中公开作业工件,每个合并请求最多可以公开10个作业工件
    
    artifacts:name 制品名称
    通过name指令定义所创建的工件存档的名称。可以为每个档案使用唯一的名称。
    artifacts:name默认名称是artifacts,下载artifacts改为artifacts.zip
    
    artifacts:when 制品创建条件
    用于在作业失败时或者成功后再上传工件
    on_success仅在作业成功时上传工件,默认值
    on_faulure仅在作业失败时上传工件
    always 上传工件,无论作业状态如何
    
    artifacts:expire_in 制品保留时间
    制品的有效期,从上传和存储到gitlab的时间开始计算。如果未定义过期时间,则默认30天
    expire_in的值以秒为单位的经过时间,除非提供了单位。
    
    artifacts:reports:junit 单元测试报告
    单元测试报告功能默认关闭(因为消耗资源严重)
    收集junit单元测试报告,收集的junit报告将组为工件上传到gitlab,并将自动显示在合并请求中。
    开启artifacts:reports:junit单元测试报告功能步骤:
    $gitlab-rails console
    $Feature.enable(:junit_pipeline_view)
    => true
    
    artifacts:reports:cobertura-覆盖率
    需要做maven集成cobertura插件
    在maven中配置完成后执行mvn cobertura:cobertura 运行测试并产生Cobertura覆盖率
    
    dependencies获取制品
    定义要获取工件的作业列表,只能从当前结点之前执行的节点定义作业,定义一个空数组将跳过下载该作业的任何工件不会考虑先前作业的状态,因此,如果他是失败或者未运行的手动作业,则不会发生错误。如果设置为依赖项的作业的工件已过期或者删除,那么依赖项作业将失败。
    

    pipeline语法5

    pipeline语法5
    needs:(parallel是并行运行job,needs是并行运行阶段)
    阶段并行
    可无序执行作业,不需要按照阶段顺序运行某些作业,可以让多个阶段同时运行。如果needs设置为指向因only/execpt规则而未实例化的作业,或者不存在,则创建pipeline时会出现yaml错误。
    
    include:
    local引入本地配置,引入同一存储库中的文件,使用相对于根目录的完整路径进行引用,与配置文件在同一分支上使用。
    可以允许引入外部yaml文件,文件具有扩展名.yml
    使用合并功能可以自定义和覆盖包含本地定义的CI/CD配置
    引入同一存储库中的文件,使用相对于根目录的完整路径进行引用,与配置文件在同一分支上使用。
    file:
    引入其他项目的文件
    template:https://gitlab.com/gitlab-org/gitlab/tree/master/lib/gitlab/ci/templates
    只能使用官方提供的模板
    remote:引入远程配置
    用于通过HTTP/HTTPS包含来自其他位置的文件,并使用完整URL进行引用,远程文件必须可以通过简单的GET请求公开访问,因为不支持远程URL中的身份验证框架。
    
    extends:
    继承作业配置
    举例:
    stages:
        - test
    variables:
        RSPEC: 'test'
    .test:
        script: echo "mvn test"
        stage: test
        only:
            refs:
                - branches
    
    testjob:
        extends: .test
        script: echo "mvn clean test"
        only:
            variables:
                - $RSPEC
    
    
    trigger:
    当gitlab从trigger定义创建的作业启动时,将创建一个下游管道。允许创建多项目和子管道。将trigger与when: manual一起使用会导致错误。
    
    多项目管道:跨多个项目设置流水线,以便一个项目中的管道可以触发另一个项目中的管道。
    
    父子管道:在同一个项目中管道可以触发一组同时运行的子管道,子管道仍然按照阶段顺序执行其每个作业,但是可以自由地继续执行各个阶段,而不必等待父管道中无关的作业完成。
    
    image:
    默认在注册runner的时候需要填写一个基础的镜像,只要使用执行为docker类型的runner所有的操作都会在容器中运行。如果全局指定了image则所有作业使用此image创建容器并在其中运行。全局未指定image,再次查看job中是否有指定,如果job中有指定则按照指定镜像创建容器运行,没有则使用注册runner时指定的镜像。
    
    services
    工作期间运行的另一个docker镜像,并link到image关键字定义的docker镜像,这样就可以再构建期间访问服务镜像。
    服务镜像可以运行任何应用程序,但是最常见的用例是运行数据库容器,例如MySQL。于每次按照项目时都安装MySQL相比,使用现有镜像并将其作为附加容器运行更容易,更便捷。
    
    services:
      - name: msyql:latest
        alias: mysql-1
        
    environment
    工作期间运行的另一个docker镜像,并link到image关键字定义的docker镜像,这样就可以再构建期间访问服务镜像。
    
    inherit
    使用或禁用全局定义的环境变量(variables)或默认值(default)
    使用true和false决定是否使用,默认是true
    

    总结->.gitlab-ci.yml文件中共有27个关键词

    job #要运行的任务
    script #指定脚本内容
    before_script #执行job前运行脚本 分为全局和局部
    after_script #执行job后运行脚本 分为全局和局部
    stages  #全局定义作业可用阶段
    .pre&.post #.pre始终是第一个运行的阶段;.post始终是最后以一个运行的阶段
    stage #配合stages进行引用,按照job进行定义的
    variables #定义变量
    tags #用于指定runner的标签
    allow_failure #允许失败 不影响下一个job的运行
    when (manualon_successon_failurealwaysdelayed) #设置触发运行的方式(手动、当前面job成功、当前面job失败、总是执行、延时执行)
    retry(maxwhen)  #重试 
    timeout #设置允许超时时间
    parallel #并行作业
    only&except #定义运行策略跳过某个执行或者进行某个执行
    rules(rules:if
    ules:changes
    ules:exists
    ules:allow_faulureworkflow:rules) 定义构建规则
    cache(cache:pathscache:keycache:policy) #设置缓存
    artifacts(artifacts:pathsartifacts:expose_asartifacts:nameartifacts:whenartifacts:exp ire_inartifacts:reportsartifacts:reports:cobertura)  #用于指定在作业成功或者失败时应附加到作业的文件或目录的列表。
    dependencies  #定义特定的job运行规则
    needs #阶段并行 (parallel是并行运行job,needs是并行运行阶段)
    include(localfile	emplate
    emote) #引入配置
    extends #集成配置
    trigger   #当gitlab从trigger定义创建的作业启动时,将创建一个下游管道。
    image  #定义job执行时使用的镜像
    services  #工作期间运行的另一个docker镜像,并link到image关键字定义的docker镜像。
    environment  #定义此作业完成部署的环境名称
    inherit  #使用或禁用全局定义的环境变量
    

    设置gitlab-runner运行job时不每次都拉取镜像

    [[runners]]
      name = "26fe27c2cc92"
      url = "http://10.0.0.6/"
      token = "okWxn2xa6cdAbyR8oLCM"
      executor = "docker"
      [runners.custom_build_dir]
      [runners.cache]
        [runners.cache.s3]
        [runners.cache.gcs]
        [runners.cache.azure]
      [runners.docker]
        pull_policy = "if-not-present" #此配置是设置先检查本地是否有此镜像,没有再去拉取。
        tls_verify = false
        image = "python:latest"
        privileged = false
        disable_entrypoint_overwrite = false
        oom_kill_disable = false
        disable_cache = false
        volumes = ["/cache"]
        shm_size = 0
    

    自定义CI配置文件路径

    默认情况下,在项目的根目录中查找,.gitlab-ci.yml文件,如果需要,可以指定备用路径和文件名,包括项目外部的位置。
    .gitlab-ci.yml
    .my-custom-flie.yml
    my/path/.gitlab-ci.yml
    my/path/.my-custom-file.yml
    http://example.com/generate/ci/config.yml
    .gitlab-ci.yml@mygroup/another-project
    my/path/.myu-custom-file.yml@mygroup/anothner-project
    将配置文件托管在单独的项目中,可以更严格地控制配置文件,创建一个公共项目来承载配置文件,仅向被允许编辑文件的用户授予对项目的写权限。其他用户和项目将能够访问配置文件而无需对其进行编辑。
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nab8BUAj-1629288433718)(C:Usersshiya.liuAppDataRoamingTypora ypora-user-imagesimage-20210816162616153.png)]

    问题记录

    Q:gitlab-runner和gitlab是什么关系?
    
    A:gitlab-runner是跑gitlab上的pipelines的
    
    Q.gitlab-ci.yml的作用是什么?
    
    A:控制job的运行逻辑顺序,定义pipeline,定义job的工作方式、具体细节等。
    
    Q:gitlab的cicd 与gitlab(只存储代码)+Jenkins cicd的方式目的是一样的嘛?两者区别是什么?
    
    A: 只能说目的是一样的,查阅了一些devops的博客、书籍,其实这是两个不同的工具而已, 目的都是更好的服务公司业务的便捷。
    
    Q:燧原公司内部是选择gitlab-cicd做ci工具的,但是燧原公司也有Jenkins,Jenkins在燧原公司的ci流程中是作为什么角色呢?这两个结合使用嘛?
    
    A:是在做迁移,之前是Jenkins(应该是遇到了瓶颈),后转为gitlab-ci。如果是这样的,那么gitlab-ci为什么比Jenkins更适合燧原的业务?(需要慢慢了解)
    
    Q:在gitlab-runner中结合docker进行目标机器的deploy是怎么选择指定机器的?
    
    A:应该是根据gitlab-runner的所在机器,类似于gitlab-runner是agent,gitlab-ci是server。
    
    Q:在gitlab-ci中是不是常常结合docker进行一个交付部署,在不适用docker的场景下gitlab-ci还适用嘛?
    
    支持shell(Jenkins就是基于shell的方式进行的cicd);具体支持的执行器见上面<gitlab-runner的执行器>
    
    Q:在gitlab-ci中 使用的基础镜像是aplin:latest 可以更改吗?
    
    A:可以的,关键字image执行gitlab-runner执行时运行的镜像。
    
    共分为三部分 ①注册gitlab-runner时指定的镜像:runner的镜像;
    
    ②在.gitlab-ci.yml中分为全局变量:定义在job外的image关键词为全局变量:job中没有定义时使用此镜像;
    
    ③在job中image关键词指定了镜像,则执行job内的镜像;
    
    Q:默认的提交代码后触发pipeline的方式是什么?
    A:修改文件后会触发pipeline的执行也可以设置计划任务来进行手动点击执行
    
    Q:执行docker的解释器时 是怎么执行的,比如我执行echo.sh脚本,pipeline会自动把脚本拷贝到镜像中吗?脚本的执行位置是container还是宿主机?
    A:不是拷贝到镜像中,而是拉取项目代码。关于脚本执行的位置,是需要看docker-runner的执行器类型的。如果是shell执行器 则是在gitlab-runner上运行
    如果是docker类型的执行器,则会在gitblab-ci上启动新的容器来完成阶段性任务,完成后退出。
    
    Q:指定机器运行 是靠指定gitlab-runner来实现的吗?
    A:gitlab-ci 在.gitlab-ci.yml中指定要在那个gitlab-runner上运行。前提是需要在目标机器上运行并注册了gitlab-runner
    
    

    Q:stage中设置并行执行 是真正的并行吗 我通过观察pipeline运行来看,是串行执行的。

    A:进行并行运行需要修改配置文件

    vim /srv/gitlab-runner/config/config.toml

    concurrent = 10

    不需要重启就可生效

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lac0xLwG-1629288433722)(C:Usersshiya.liuAppDataRoamingTypora	ypora-user-imagesimage-20210812152746026.png)]

    Q:.gitlab-ci.yml中怎么设置stages进行并行运行,怎么设置 跳过某个stage进行下面的job

    A:设置并行运行就是将一个stages中设置的阶段,在多个job中进行指定stage 进行运行。

    stages:
      - build
      - deploy
    
    编译:
      stage: build
      tags:
        - shell
      only:
        - main
      before_script:
        - echo "这是before_script脚本,表示要和script进行串行执行命令了"
      script:
        - echo "mvn clean"
        - echo "mvn install"
      after_script:
        - echo "这是after_script脚本,表示before_script&&script脚本执行完成了,这个job即将执行完成"
        
    部署:
      stage: build
      tags:
        - docker
      only:
        - main
      script:
        - echo "hello deploy"
    
    

    补充 CI概念以及CI常规流程

    CI:持续集成简称CI ,指的是频繁的将代码集成到主干,持续集成的目的就是让产品可以快速迭代同时能保证高质量。核心是必须通过自动化测试,只要有一个测试用例失败,就不能集成。
    
    从代码提交到生产有几个步骤:
    
    1、提交
    
    流程的第一步,是开发者向代码仓库提交代码,所有后面的步骤都始于本地代码的一次提交
    
    2、测试
    
    代码仓库对提交操作配置了钩子,只要提交代码或者合并主干,就会跑自动化测试
    
    3、构建
    
    通过第一轮测试,代码就可以合并主干,算是可以交付了
    
    交付后,就先进行构建,再进入第二轮测试。所谓构建,指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源。
    
    4、部署
    
    通过了第二轮测试,当前代码就是一个可以直接部署的版本。将这个版本的所有文件打包存档,发到生产服务器。
    
    5、回滚
    
    一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简答的做法就是修改一下符号连接,指向上一个版本的目录。
    
    
    CD:持续交付和持续部署称为CD
    

    gitlab-ci的工具链集成

    模板库规划
    SonarQube代码扫描
    Artifactory制品库(gitlab中也有制品库)
    阿里云镜像仓库/harbor等
    jmeter接口测试简介
    gitlab集成自动化测试
    minion对象存储
    邮件通知pipeline结果
    未完待续
    
    因为你不会,所以你才会---大司马
  • 相关阅读:
    flask框架+上传文件接口实战【软件测试培训】【多测师_王sir】
    读取Excel中的视频文件地址+requests库下载后存入本地文件夹【软件测试培训】【多测师_王sir】
    UI和接口自动化中的设计模式:单例模式【软件测试培训】【多测师_王sir】
    Python+BeautifulReport生成完美的接口自动化测试报告【多测师_王sir】
    Linux命令中查找以.log结尾文件中不包含某个特定字符串这行的内容【多测师_王sir】
    查询多条数据
    django登录装饰接口封装
    django使用redis作为session缓存
    tinymce配置
    django重写authcenticate方法兼容用户、邮箱、密码认证登录
  • 原文地址:https://www.cnblogs.com/liushiya/p/15158617.html
Copyright © 2011-2022 走看看