添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • 容器中gitlab的安装及备份与恢复【1】
  • gitlab+gitlab-runner持续集成springboot项目【2】
  • gitlab+runner持续集成springboot项目之docker模式【3】
  • 程序下载地址

    本文所使用到的程序及安装软件下载地址:
    链接: https://pan.baidu.com/s/1HfT6_S_52fxXXBjXRp2Faw?pwd=hkey
    提取码:hkey
    目录:博客园文章共享目录>持续集成>gitlab+runner持续集成springboot项目 之 shell模式【2】

    1. 介绍

    1.1 什么是CI/CD

    软件开发的持续方法基于自动执行脚本,以最大程度地减少在开发应用程序时引入错误的机会。从开发新代码到部署新代码,他们几乎不需要人工干预,甚至根本不需要干预。

    它涉及到在每次小的迭代中就不断地构建、测试和部署代码更改,从而减少了基于已经存在bug或失败的先前版本开发新代码的机会。

    Continuous Integration(持续集成)

    假设一个应用程序,其代码存储在GitLab的Git仓库中。开发人员每天都要多次推送代码更改。对于每次向仓库的推送,你都可以创建一组脚本来自动构建和测试你的应用程序,从而减少了向应用程序引入错误的机会。这种做法称为持续集成,对于提交给应用程序(甚至是开发分支)的每项更改,它都会自动连续进行构建和测试,以确保所引入的更改通过你为应用程序建立的所有测试,准则和代码合规性标准。

    Continuous Delivery(持续交付)

    持续交付是超越持续集成的更进一步的操作。应用程序不仅会在推送到代码库的每次代码更改时进行构建和测试,而且,尽管部署是手动触发的,但作为一个附加步骤,它也可以连续部署。此方法可确保自动检查代码,但需要人工干预才能从策略上手动触发以必输此次变更。

    Continuous Deployment(持续部署)

    与持续交付类似,但不同之处在于,你无需将其手动部署,而是将其设置为自动部署。完全不需要人工干预即可部署你的应用程序。

    本文采用 gitlab 自身的 CI/CD 通过提交 springboot项目代码来实现自动打包并启动。

    gitlab搭建过程请参考: https://www.cnblogs.com/hukey/p/17148065.html

    1.2 Gitlab CI/CD是如何工作

    为了使用GitLab CI/CD,你需要一个托管在GitLab上的应用程序代码库,并且在根目录中的 .gitlab-ci.yml 文件中指定构建、测试和部署的脚本。

    在这个文件中,你可以定义要运行的脚本,定义包含的依赖项,选择要按顺序运行的命令和要并行运行的命令,定义要在何处部署应用程序,以及指定是否 要自动运行脚本或手动触发脚本。

    为了可视化处理过程,假设添加到配置文件中的所有脚本与在计算机的终端上运行的命令相同。

    一旦将.gitlab-ci.yml添加到仓库中,GitLab将检测到该文件,并使用名为GitLab Runner的工具运行你的脚本。该工具的操作与终端类似。这些脚本被分组到jobs,它们共同组成一个pipeline。

    一个最简单的.gitlab-ci.yml文件可能是这样的:

    before_script: 
      - apt-get install rubygems ruby-dev -y 
    run-test: 
      script: 
        - ruby --version 6
    

    before_script属性将在运行任何内容之前为你的应用安装依赖,一个名为run-test的job(作业)将打印当前系统的Ruby版本。二者共同构成了在每次推送到仓库的任何分支时都会被触发的pipeline(管道)。

    通过上面的介绍,运行 CI/CD 需要两个东西:

  • .gitlab-ci.yml文件,提交到源码仓库中
  • gitlab-runner工具,安装到部署服务器上
  • 1.3 主机环境

    3. 安装注册Gitlab-runner

    注意:通过以下yum方式安装的gitlab-runner 由于版本较低,在流水线 deploy工作时,可能无法显示日志信息,造成无法排查问题。

    3.1 yum安装runner【弃用】

    curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
    yum install gitlab-ci-multi-runner
    

    注意:yum方式安装的 runner是通过 gitlab-runner用户进行管理的,会发生一些权限的问题,请自行配置解决。

    3.2 二进制包安装runner(推荐)

    图文中已经非常清楚详细的介绍了最新版 runner 的安装步骤:

    mv gitlab-runner-linux-amd64  /usr/local/bin/gitlab-runner
    chmod +x /usr/local/bin/gitlab-runner
    mkdir -p/data/gitlab-runner
    #注意:我这里使用/data/gitlab-runner 作为工作目录,root用户作为 gitlab-runner执行的用户,使用root用户可以避免很多权限问题,同时危险系数也很高。
    gitlab-runner install --working-directory /data/gitlab-runner --user root
    #启动服务
    systemctl status gitlab-runner.service
    systemctl start  gitlab-runner.service
    

    3.2 注册Gitlab-runner

    3.2.1 查看gitlab注册信息

    3.2.2 注册

  • 运行 gitlab-runner register 命令进行注册
  • gitlab-runner register
    
  • 输入gitlab的 url地址,也就是上面截图第2部分
  • Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
    http://192.168.199.101
    
  • 输入注册的 token,截图第3部分
  • Please enter the gitlab-ci token for this runner:
    zaGx3-KVBSD4V1qT5CC1
    
  • 输入对这个Runner的表述(同时也是这个Runner的名字),可以在GitLab page上修改它
  • Please enter the gitlab-ci description for this runner:
    [localhost.localdomain]: test_runner
    
  • 输入Runner的tag,同样可以在gitlab page 上修改它
  • Please enter the gitlab-ci tags for this runner (comma separated):
    
  • 输入Runner的executor
  • Please enter the executor: virtualbox, docker, ssh, shell, docker+machine, docker-ssh+machine, kubernetes, docker-ssh, parallels:
    shell
    

    注册完成后,会出现如下提示:

    Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
    

    注册完成后,会生成 /etc/gitlab-runner/config.toml 文件,该文件是Runner的配置文件:

    内容如下:

    concurrent = 1
    check_interval = 0
    [[runners]]
      name = "test_runner"
      url = "http://192.168.199.101"
      token = "GnkK-BZrctBjURQFd4Ax"
      executor = "shell"
      [runners.cache]
    

    在 gitlab 上查看刚添加 gitlab-runner的信息

    至此,runner 就添加完成。

    执行 gitlab-runner list 可查看到保存在配置文件中的所有运行程序

    root@localhost(192.168.199.102)~>gitlab-runner list
    Listing configured runners                          ConfigFile=/etc/gitlab-runner/config.toml
    test_runner                                         Executor=shell Token=GnkK-BZrctBjURQFd4Ax URL=http://192.168.199.101
    

    3.2.3 runner常用命令

    gitlab-runner register  #默认交互模式下使用,非交互模式添加 --non-interactive
    gitlab-runner list      #此命令列出了保存在配置文件中的所有运行程序
    gitlab-runner verify    #此命令检查注册的runner是否可以连接,但不验证GitLab服务是否正在使用runner。 --delete 删除
    gitlab-runner unregister   #该命令使用GitLab取消已注册的runner。
    #使用令牌注销
    gitlab-runner unregister --url http://gitlab.example.com/ --token t0k3n
    #使用名称注销(同名删除第一个)
    gitlab-runner unregister --name test-runner
    #注销所有
    gitlab-runner unregister --all-runners
    

    4. 配置shell模式

    本次运行 SpringBoot 项目。

    4.1 安装jdk

    tar xf jdk-8u202-linux-x64.tar.gz
    cd jdk1.8.0_202/
    source install.sh jdk
    

    4.2 安装maven

    tar xf apache-maven-3.6.1-bin.tar.gz
    cd apache-maven-3.6.1
    source install.sh mvn
    

    4.3 创建项目

    创建一个空白项目

    4.4 克隆项目

  • 安装git
  • yum localinstall git-2.39.1-1.WANdisco.x86_64.rpm -y
    

    点击克隆,将新建的项目拉到服务器上。

    在192.168.199.102服务器上执行:

    root@localhost(192.168.199.102)~>git clone http://192.168.199.101/hukey/spring-demo.git
    Cloning into 'spring-demo'...
    Username for 'http://192.168.199.101': hukey
    Password for 'http://hukey@192.168.199.101':
    remote: Enumerating objects: 3, done.
    remote: Counting objects: 100% (3/3), done.
    remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
    Receiving objects: 100% (3/3), done.
    

    4.5 将代码上传到gitlab仓库

    unzip SpringBootDemo-master.zip
    cp -a SpringBootDemo-master/* spring-demo/
    cd spring-demo
    git add .
    git commit -m 'add files.'
    git push origin main
    Username for 'http://192.168.199.101': hukey
    Password for 'http://hukey@192.168.199.101':
    Enumerating objects: 29, done.
    Counting objects: 100% (29/29), done.
    Delta compression using up to 2 threads
    Compressing objects: 100% (17/17), done.
    Writing objects: 100% (27/27), 8.19 KiB | 838.00 KiB/s, done.
    Total 27 (delta 0), reused 0 (delta 0), pack-reused 0
    To http://192.168.199.101/hukey/spring-demo.git
       5ea8876..0d7e72f  main -> main
    

    4.6 添加配置文件

    .gitlab-ci.yaml 内容如下:

    stages:          # List of stages for jobs, and their order of execution
      - build
      - deploy
    build:       # This job runs in the build stage, which runs first.
      stage: build
      tags:
        - test
      script:
        - mvn -N io.takari:maven:0.7.7:wrapper
        - chmod +x mvnw
        - ./mvnw package
        - chmod +x target/*.jar
      artifacts:
        paths:
          - target/*.jar
    production:      # This job runs in the deploy stage.
      stage: deploy  # It only runs when *both* jobs in the test stage complete successfully.
      tags:
        - test
      script:
        - jps -v | awk '/spring-boot-demo/{print "kill -9",$1}' | sh -
        - nohup java -jar target/*.jar > log.file 2>&1 &
      only:
        - main
    

    4.7 构建CI/CD

    当做完第六步,点击 提交更改 时,gitlab 就已经开始触发 流水线 了,可以点击流水线查看:

    因为是第一次构建,会下载很多项目所需依赖包。

    4.8 mvnw构建

    本项目采用 mvnw 构建,是为了保证版本与本地开发环境一致。而在使用 mvnw 构建时,发现依赖包下载地址为:https://repo.maven.apache.org ,外网地址很慢很慢,因此需要修改如下文件:

    vim .m2/wrapper/dists/apache-maven-3.6.3-bin/3j391n2rd0vgi416u9ldio1h2h/apache-maven-3.6.3/conf/settings.xml <mirrors> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云谷歌仓库</name> <url>https://maven.aliyun.com/repository/google</url> </mirror> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云阿帕奇仓库</name> <url>https://maven.aliyun.com/repository/apache-snapshots</url> </mirror> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云spring仓库</name> <url>https://maven.aliyun.com/repository/spring</url> </mirror> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云spring插件仓库</name> <url>https://maven.aliyun.com/repository/spring-plugin</url> </mirror> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云grails-core</name> <url>https://maven.aliyun.com/repository/grails-core</url> </mirror> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云gradle-plugin</name> <url>https://maven.aliyun.com/repository/gradle-plugin</url> </mirror> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云mapr-public</name> <url>https://maven.aliyun.com/repository/mapr-public</url> </mirror> </mirrors>

    修改完成后,在gitlab流水线取消当前任务,然后点击编辑器 重新 提交更改 再次触发 流水线构建:

    注意:如果这里操作后,流水线作业提示:作业挂起中,等待进入队列

    #使用root用户重新启动 gitlab-runner
    gitlab-runner stop
    gitlab-runner start
    

    点击 build 查看日志:

    两步走都成功以后,登录到 192.168.199.102上,检测程序端口是否开启成功。

    lsof -i :8080
    COMMAND   PID          USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    java    19008 gitlab-runner    7u  IPv6  53046      0t0  TCP *:webcache (LISTEN)
    

    浏览器访问:

    到此,本地shell命令构建并启动成功。

    5. 实战:部署SpringBoot项目

    5.1 说明

    让研发写了一个SpringBoot的demo项目,按照生产环境的方式进行部署。

    gitlab 和 runner 的安装方式同上面一致。

    5.2 安装配置gitlab-runner

    mv gitlab-runner-linux-amd64  /usr/local/bin/gitlab-runner
    chmod +x /usr/local/bin/gitlab-runner
    mkdir -p/data/gitlab-runner
    #注意:我这里使用/data/gitlab-runner 作为工作目录,root用户作为 gitlab-runner执行的用户,使用root用户可以避免很多权限问题,同时危险系数也很高。
    gitlab-runner install --working-directory /data/gitlab-runner --user root
    #启动服务
    systemctl status gitlab-runner.service
    systemctl start  gitlab-runner.service
    

    5.3 CI/CD配置文件

    .gitlab-ci.yml 文件

    stages:          # List of stages for jobs, and their order of execution
      - build
      - deploy
    build:       # This job runs in the build stage, which runs first.
      stage: build
      tags:
        - shell
      script:
        - mvn clean package -Dmaven.test.skip=true
      artifacts:
        paths:
          - target
    production:      # This job runs in the deploy stage.
      stage: deploy  # It only runs when *both* jobs in the test stage complete successfully.
      tags:
        - shell
      script:
        - jps -v | awk '/system-monitoring/{print "kill -9",$1}' | sh -
        - mkdir -p /data/app
        - if [ -d /data/app/system-monitoring-1.0 ]; then mv /data/app/system-monitoring-1.0 /data/app/system-monitoring-1.0-$(date "+%F_%H-%M-%S"); fi
        - tar xf target/system-monitoring-1.0-release.tar.gz -C /data/app/
        - chmod -R 0775 /data/app/system-monitoring-1.0
        - cd /data/app/system-monitoring-1.0
        - nohup java -jar lib/system-monitoring-1.0.jar --spring.config.location=config/application.yml > log.file 2>&1 &
      only:
        - main
    

    这是我写的一个简单示例:

    分为两个步骤执行:

    build 部分打包生成jar包

    主要关注下 script 部分:

  • jps -v | awk '/system-monitoring/{print "kill -9",$1}' | sh - 首先关闭服务;
  • mv /data/app/system-monitoring-1.0 /data/app/system-monitoring-1.0-$(date "+%F_%H-%M-%S") 将原有服务进行更名备份
  • mkdir -p /data/app 确认目录是否创建,没有则创建
  • tar xf target/system-monitoring-1.0-release.tar.gz -C /data/app/ 将程序包解压到该目录
  • cd /data/app/system-monitoring-1.0 进入该目录下
  • nohup java -jar lib/system-monitoring-1.0.jar --spring.config.location=config/application.yml > log.file 2>&1 & 执行启动
  • 关键字说明

  • tags :gitlab-runner 注册时输入的标签,这里只有满足 tag=test 的runner才会执行
  • artifacts:会将path指定的文件或目录进行打包,并在该步骤build 完成后,可以通过gitlab页面进行直接下载操作
  • only:确认支持的分支,这里指定为main分支
  • https://blog.csdn.net/zyy247796143/article/details/123842374
    https://zhuanlan.zhihu.com/p/570074925

    --- EOF ---