zoukankan      html  css  js  c++  java
  • Linux系统:第十五章:gitlab集成CI

    集成gitlab的CI首先需要安装好docker和gitlab,大家可以参考我上一章节:Linux系统:第十四章:安装Docker,下载安装配置gitlab以及jenkins,图文讲解CI流程。

    正文开始:
    gitlab-runner命令:

    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
    

    gitlabrunner注册gitlab

    docker run --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \
      --non-interactive \
      --executor "docker" \
      --docker-image alpine:latest \
      --url "http://xx.xxx.xxx.x:8012" \
      --registration-token "zh5GqHF_bqZx-5iDSqty" \
      --description "docker-runner" \
      --tag-list "docker,aws" \
      --run-untagged="true" \
      --locked="false" \
      --access-level="not_protected"
    

    需要修改的:registration-token和url 在gitlab中的以下部分复制:
    Menu->Admin->overview->runner
    在这里插入图片描述在这里插入图片描述.gitlab-ci.yml文件配置(可做参考)

    # 定义一些变量, 下面各阶段会使用
    variables:
      ssh_name: root #远程连接服务器的用户
      uat_server_ip: xx.xx.xx.xx #远程连接的服务器ip
      uat_ssh_password: /usr/local/pem/qt_dev_cert.pem #从密码文件读取文件内容作为密码去远程连接主机
      jar_name: community-fragrant-starter.jar #项目打包成jar
      java_path: /usr/java/jdk1.8.0_131/bin #jdk路径
      upload_path: /home/project/community #上传项目的目录
    #开始结束打印日志
    before_script:
      - echo '=================start=================='
    after_script:
      - echo '=================finish=================='
    # 定义执行的各个阶段及顺序,本次构建的阶段:build package deploy
    stages:
      - build
      - upload
      - deploy
    # 打包 Job,使用 maven 镜像打包项目
    job_build:
      stage: build
      image: maven:3.5.0-jdk-8
      script:
        - mvn package -Dmaven.test.skip=true
      cache:
        key: m2-repo
        paths:
          - .m2/repository
      artifacts:
        paths:
          - target/$jar_name
    # 上传生成的 jar 包到你的应用服务器。
    job_upload_prod:
      stage: upload
      image: ictu/sshpass
      script:
        - ls -l target/
        - sshpass -f $uat_ssh_password scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no target/$jar_name $ssh_name@$uat_server_ip:$upload_path/$jar_name
      only:
        - master
    #部署 Job
    job_deploy_prod:
      stage: deploy
      image: ictu/sshpass
      script:
        - echo "java start service"
        - sshpass -f $uat_ssh_password ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $ssh_name@$uat_server_ip "cd $upload_path;chmod 777 $jar_name;sudo systemctl stop fragrant.service; sudo systemctl start fragrant.service;sudo systemctl status fragrant.service;"
      only:
        - master
    

    .gitlab-ci.yml文件配置详细说明

    定义一些变量, 下面各阶段会使用

    variables:
      ssh_name: root #远程连接服务器的用户
      uat_server_ip: xx.xx.xx.xx #远程连接的服务器ip
      uat_ssh_password: /usr/local/pem/qt_dev_cert.pem #从密码文件读取文件内容作为密码去远程连接主机
      jar_name: community-fragrant-starter.jar #项目打包成jar
      java_path: /usr/java/jdk1.8.0_131/bin #jdk路径
      upload_path: /home/project/community #上传项目的目录
    

    开始结束打印日志

    before_script:
      - echo '=================start=================='
    after_script:
      - echo '=================finish=================='
    

    定义执行的各个阶段及顺序,本次构建的阶段:build package deploy

    stages:
      - build
      - upload
      - deploy
    

    打包 Job

    使用 maven 镜像打包项目

    -Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。

    打包 Job配置:

    job_build:
      stage: build
      image: maven:3.5.0-jdk-8
      script:
        - mvn package -Dmaven.test.skip=true
      cache:
        key: m2-repo
        paths:
          - .m2/repository
      artifacts:
        paths:
          - target/$jar_name
    

    标题上传生成的 jar 包到你的应用服务器

    这里使用 ictu/sshpass 这个镜像,是为了使用 sshpass 命令
    配置:UserKnownHostsFile=/dev/null和 StrictHostKeyChecking=no。
    作用:SSH登陆时会忽略known_hsots的访问。
    原因:ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告,避免你受到DNS Hijack之类的攻击。一台主机上有多个Linux系统,会经常切换,那么这些系统使用同一ip,登录过一次后就会把ssh信息记录在本地的~/.ssh/known_hsots文件中,切换该系统后再用ssh访问这台主机就会出现冲突警告,需要手动删除修改known_hsots里面的内容。
    only:- master:限制只有master的分支

    job_upload_prod:
      stage: upload
      image: ictu/sshpass
      script:
        - ls -l target/
        - sshpass -f $uat_ssh_password scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no target/$jar_name $ssh_name@$uat_server_ip:$upload_path/$jar_name
      only:
        - master
    

    部署 Job

    cd $upload_path;进入上传jar包的目录
    chmod 777 $jar_name;给jar包授权
    sudo systemctl stop fragrant.service;暂停服务
    sudo systemctl start fragrant.service;开启服务
    sudo systemctl status fragrant.service;查看服务状态

    fragrant.service是一个脚本,需要再/usr/lib/systemd/system目录下面创建一个fragrant.service脚本文件,创建好脚本文件之后还需要设置开机自启动,命令:systemctl enable fragrant.service

    fragrant.service脚本内容:

      [Unit]
      Description=service for description
      After=syslog.target network.target remote-fs.target nss-lookup.target
      [Service]
      Type=forking
      ExecStart=/home/project/community/fragrant-start.sh
      ExecStop=/home/project/community/fragrant-stop.sh
      PrivateTmp=true
      [Install]
      WantedBy=multi-user.target
    

    然后在上传项目的目录下创建二个开启和暂停的脚本
    fragrant-start.sh 脚本内容

    #!/bin/sh
    export JAVA_HOME=/usr/local/src/jdk1.8.0_301
    export PATH=$JAVA_HOME/bin:$PATH
    nohup java -jar /app/api/fragrant/community-fragrant-starter.jar > /app/log/fragrant/community-fragrant-starter.log &
    echo $! > /app/run/fragrant.pid
    

    fragrant-stop.sh 脚本内容

    #!/bin/sh
    PID=$(cat /app/run/fragrant.pid)
    kill -9 $PID
    

    部署 Job配置:

    job_deploy_prod:
      stage: deploy
      image: ictu/sshpass
      script:
        - echo "java start service"
        - sshpass -f $uat_ssh_password ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $ssh_name@$uat_server_ip "cd $upload_path;chmod 777 $jar_name;sudo systemctl stop fragrant.service; sudo systemctl start fragrant.service;sudo systemctl status fragrant.service;"
      only:
        - master
    
  • 相关阅读:
    给统计人讲python(3)模拟城市_数据分析
    非均匀时间序列按固定时间间隔求和
    随机训练样本的方法
    df.empty判断空df,timestamp推算n秒前的时间
    优雅地循环字典键值
    panel的dropna方法
    给统计人讲Python(4)_股票数据处理
    给统计人讲Python(2)_Pandas入门
    给统计人讲Python(1)_科学计算库-Numpy
    生成不重复随机数
  • 原文地址:https://www.cnblogs.com/javawxid/p/15644373.html
Copyright © 2011-2022 走看看