万隆的笔记 万隆的笔记
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
  • CI/CD概述
  • 持续集成操作流程
  • GitLab 持续集成
  • GitLab Runner
    • 概述
    • 安装 GitLab Runner
    • 注册 Runner
    • .gitlab-ci.yml
    • 集成效果
    • 项目Dockerfile
  • CI_CD
2021-11-21
目录

GitLab Runner

# GitLab Runner

在了解完GitLab持续集成的相关概念后,接着就要去了解怎么做了。

# 概述

GitLab Runner 负责执行先前描述的构建任务。GitLab Runner 可以安装在不同的机器上,与GitLab CI是分开的,在构建任务运行期间并不会影响到 GitLab 的性能。

为什么不直接让GitLab CI来允许构建任务?因为一般来说,构建任务都会占用很多的系统资源 (譬如编译代码),而 GitLab CI 又是 GitLab 的一部分,如果由 GitLab CI 来运行构建任务的话,在执行构建任务的时候,GitLab 的性能会大幅下降。此外,GitLab CI 最大的作用是管理各个项目的构建状态,因此,运行构建任务这种浪费资源的事情就交给 GitLab Runner 来做。

# 安装 GitLab Runner

所以一般情况下,会专门有一台专门用于部署的服务器。这里列出Ubuntu以及Ubuntu Docker安装GitLab Runner的方式:

# Ubuntu安装脚本

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash
sudo apt-get update
sudo apt-get install gitlab-ci-multi-runner

# Docker安装脚本

我们也可是使用 Docker 来部署 GitLab Runner。

环境说明和准备:

  • OS:Ubuntu 20.04.1 LTS

  • 创建工作目录 /usr/local/docker/runner

  • 创建构建目录 /usr/local/docker/runner/environment,并完成以下准备工作

    • 下载对应的 JDK 安装包并复制到environment目录

    • 下载对应的 Maven 安装包并复制到environment目录

    • 下载对应的 docker-compose 二进制执行文件并复制到environment目录

      以上三步,也可以使用软件包的安装方式,但是不建议,因为下载需要时间、况且这种基本上很少会改变。(PS:离线安装需要注意版本问题)

    • 创建 daemon.json,用于配置加速器和仓库地址

      {
        "registry-mirrors": [
          "https://registry.docker-cn.com"
        ],
        "insecure-registries": [
          "ip:port"
        ]
      }
      
    • 创建 init.sh,用于初始化脚本,如果不需要进行一些权限配置,可忽略改步骤

      #!/bin/bash
      
      # 权限配置
      gpasswd -a gitlab-runner root
      gpasswd -a gitlab-runner docker
      chown root:root /var/run/docker.sock
      chmod +775 /var/run/docker.sock
      
      # mvn配置
      mkdir -p /home/gitlab-runner/.m2/repository
      chown -R gitlab-runner /home/gitlab-runner/.m2/repository
      chown -R gitlab-runner /usr/local/maven
      
      newgrp root
      newgrp docker
      
    • 创建Dockerfile,仅供参考,例如gitlab-runner的版本、软件源的配置、JDK版本等等请根据自己实际情况修改。

      注意此处有个坑,容器的里面的ubuntu版本与宿主机版本可能不一致,像我的宿主机环境Ubuntu版本为20.04.3 LTS、代号focal,而gitlab-runner容器里面是trusty,(进入容器交互,输入lsb_release -cs查看),导致我在修改软件源之后的操作都会出现问题。

      FROM gitlab/gitlab-runner:v10.6.0
      
      # 修改软件源
      RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse' > /etc/apt/sources.list && \
          echo 'deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse' >> /etc/apt/sources.list && \ 
          echo 'deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse' >> /etc/apt/sources.list && \
          echo 'deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse' >> /etc/apt/sources.list && \
          echo 'deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse' >> /etc/apt/sources.list && \
          apt-get update -y && \
          apt-get clean
      
      # 安装 Docker
      RUN apt-get -y install apt-transport-https ca-certificates curl software-properties-common && \
          curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - && \
          add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" && \
          apt-get update -y && \
          apt-get install -y docker-ce
      COPY daemon.json /etc/docker/daemon.json
      
      # 安装 Docker Compose
      WORKDIR /usr/local/bin
      # RUN curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
      COPY docker-compose /usr/local/bin
      RUN chmod +551 docker-compose
      
      # 初始化脚本,例如进行一些权限配置,容器启动后手动执行
      COPY init.sh /usr/local/bin
      RUN chmod +x init.sh
      
      # 安装 Java
      RUN mkdir -p /usr/local/java
      WORKDIR /usr/local/java
      COPY openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz /usr/local/java
      RUN tar -zxvf openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz && \
          rm -fr openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz
      
      # 安装 Maven
      RUN mkdir -p /usr/local/maven
      WORKDIR /usr/local/maven
      COPY apache-maven-3.6.3-bin.tar.gz /usr/local/maven
      RUN tar -zxvf apache-maven-3.6.3-bin.tar.gz && \
          rm -fr apache-maven-3.6.3-bin.tar.gz
      COPY settings.xml /usr/local/maven/apache-maven-3.6.3/conf/settings.xml
      
      # 配置环境变量
      ENV JAVA_HOME /usr/local/java/java-se-8u41-ri
      ENV MAVEN_HOME /usr/local/maven/apache-maven-3.6.3
      ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
      
      WORKDIR /
      

# docker-compose.yml

在 /usr/local/docker/runner 目录下创建 docker-compose.yml,其中数据卷我将Maven的仓库持久化了,大家根据自己的setting.xml文件做改动即可。

version: '3.1'
services:
  gitlab-runner:
    build: environment
    restart: always
    container_name: gitlab-runner
    privileged: true
    volumes:
      - /usr/local/docker/runner/config:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/local/docker/runner/m2:/home/gitlab-runner/.m2/repository

最后在当前目录下,执行docker-compose up -d命令,执行成功后,GitLab Runner 就安装完成了,可以参考以下命令执行:

$ docker-compose up -d
....
Creating gitlab-runner ... done

# 容器启动成功后,如果配置了初始化脚本,可以执行以下命令执行脚本
$ docker exec -it gitlab-runner init.sh
Adding user gitlab-runner to group root

安装的其他配置补充:在某些场景下为保证能够正常集成,我们可能还需要一些其它配置,建议将这些步骤写入到init.sh中:

  • 账户权限问题:安装完 GitLab Runner 后,系统会增加一个 gitlab-runner 账户,每次集成的操作 GitLab Runner 都是用这个 账户操作的。我们将它加进 root 组:

    ## 账户权限配置
    gpasswd -a gitlab-runner root
    newgrp root
    
  • 操作目录权限问题,gitlab-runner 账号可能没有操作某些文件的权限情况下:

    ## 配置操作目录的权限
    chmod 775 xxx
    

# 注册 Runner

参考以下步骤,为每个项目注册Runner。

PS:每个项目的注册令牌,见项目->设置->CI/CD->Runners 设置->展开。

# 执行注册命令
$ docker exec -it gitlab-runner gitlab-runner register
Running in system-mode.                            
# 输入 GitLab CI 地址                                                    
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.0.111:8080/
# 输入 GitLab CI Token
Please enter the gitlab-ci token for this runner:
rUTY3xFPYPdSCxY7uTqs
# 输入 Runner 的说明,可以为空,建议给个合理的描述,便于区分
Please enter the gitlab-ci description for this runner:
[ecbcddf05373]: 
# 代码上传后会触发构建,这里true
# Whether to run untagged builds [true/false]:
# [false]: true
# 设置 Tag,可以用于指定在构建规定的 tag 时触发 ci
Please enter the gitlab-ci tags for this runner (comma separated):
# 这里选择 false
Whether to lock the Runner to current project [true/false]:
[true]: false
Registering runner... succeeded                     runner=rUTY3xFP
# 选择 Runner 执行器,这里选择的是 shell
Please enter the executor: docker+machine, kubernetes, docker, parallels, shell, virtualbox, docker-ssh, ssh, docker-ssh+machine:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 

绑定成功后,可以在项目的CI/CD设置中看到绑定的Runner:

gitlab-runner.png

其他指令:

# 删除注册信息
$ docker exec -it gitlab-runner gitlab-ci-multi-runner unregister --name "名称"
# 查看注册列表
$ docker exec -it gitlab-runner gitlab-ci-multi-runner list

# .gitlab-ci.yml

在目标项目工程下编写 .gitlab-ci.yml 配置文件。该文件是提供给 GitLab Runner 执行 GitLab CI 的配置文件,让我们定义 Pipeline、Stages、Jobs。

下面是一个参考示例,将阶段划分为:构建、测试、部署,可以根据实际情况调整,注意每个阶段 gitlab-runner 都会清理一些上一个阶段生成的“无用的文件”:

stages:
  - build
  - test
  - deploy_test
  - deploy_prod

# 编译
build:
  stage: build
  # 指在提交到 develop、master 时执行
  only:
    - develop
    - master
  script:
    - mvn clean package
    
# 运行测试用例
test:
  stage: test
  only:
    - develop
    - master
  script:
    - mvn test

# 部署测试服务器
deploy_test:
  stage: deploy_test
  only:
    - develop
  script:
    - bash scripts/deploy/deploy-test.sh

# 部署生产服务器
deploy_production:
  stage: deploy_production
  only:
    - master
  script:
    - bash scripts/deploy/deploy-prod.sh

其他示例:

stages:
  - build
  - push
  - deploy
  - clean

build:
  stage: build
  script:
    - /usr/local/maven/apache-maven-3.6.3/bin/mvn clean package
    - cp target/itoken-config-1.0.0-SNAPSHOT.jar docker
    - cd docker
    - Docker build -t 192.168.0.111:9090/itoken/itoken-config .

push:
  stage: push
  script:
    - Docker login 192.168.0.111:9090 -u admin -p Harbor12345
    - Docker push 192.168.0.111:9090/itoken/itoken-config

deploy:
  stage: deploy
  script:
    - cd docker
    - Docker-compose down
    - Docker-compose up -d

clean:
  stage: clean
  script:
    - if [[ $(docker images -q -f dangling=true) != '' ]]; then docker rmi $(docker images -q -f dangling=true); fi;

# 集成效果

gitlab-runner-2.png

# 项目Dockerfile

假如使用Docker来构建镜像、容器方式运行,下面提供一个项目用的Dockerfile参考:

PS:dockerize 这个插件通过 github 下载可能会比较慢,建议通过别的方式去处理,这里不做展开描述。

FROM openjdk:8u302-jre

ENV APP_VERSION 1.0.0-SNAPSHOT
ENV DOCKERIZE_VERSION v0.6.1

RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && \
    tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz  && \
    rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz

WORKDIR /app

COPY itoken-eureka-$APP_VERSION.jar /app/app.jar

ENTRYPOINT ["dockerize", "-timeout", "5m", "-wait", "tcp://192.168.0.112:8888", "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar", "--spring.profiles.active=dev"]

EXPOSE 8761
#CI/CD
上次更新: 5/31/2023, 1:14:42 AM
最近更新
01
2025
01-15
02
Elasticsearch面试题
07-17
03
Elasticsearch进阶
07-16
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式