美文网首页
GitLab-Docker-GitLabRunner之持续集成

GitLab-Docker-GitLabRunner之持续集成

作者: Demon先生 | 来源:发表于2020-05-16 10:34 被阅读0次

    1. 持续集成的基本概念

    持续集成指的是,频繁地(一天多次)将代码集成到主干。它的好处主要有两个:

    • 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
    • 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。

    Martin Fowler 说过,"持续集成并不能消除 Bug,而是让它们非常容易发现和改正。"

    image

    持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。

    本文其他整理参考资料
    gitlab:http://d7-li.gitee.io/demon/JavaDocuments/gitlab/
    docker:http://d7-li.gitee.io/demon/JavaDocuments/docs-docker/
    linux:http://d7-li.gitee.io/demon/JavaDocuments/linux/

    本文构建环境:
    Centos7、Docker1.13.1

    2. GitLab本地部署

    2.1. Docker安装GitLab

    第一步:创建docker-compose.yml文件,使用 Docker 来安装和运行 GitLab 中文版,这里使用10.5 版本,docker-compose.yml 配置如下:

    version: '3'
    services:
        web:
          image: 'twang2218/gitlab-ce-zh:10.5'
          restart: always
          hostname: '192.168.75.145'
          environment:
            TZ: 'Asia/Shanghai'
            GITLAB_OMNIBUS_CONFIG: |
              external_url 'http://192.168.75.145:8080'
              gitlab_rails['gitlab_shell_ssh_port'] = 2222
              unicorn['port'] = 8888
              nginx['listen_port'] = 8080
          ports:
            - '8080:8080'
            - '8443:443'
            - '2222:22'
          volumes:
            - /usr/local/docker/gitlab/config:/etc/gitlab
            - /usr/local/docker/gitlab/data:/var/opt/gitlab
            - /usr/local/docker/gitlab/logs:/var/log/gitlab
    

    第二步:启动docker-compose

    docker-compose up  #普通启动,退出后容器关闭
    docker-compose up -d   #守护式启动,退出后容器不关闭
    

    第三步:使用浏览器访问ip:8080,如下图所示表示成功:


    image.png
    • 设置管理员初始密码,这里的密码最好是 字母 + 数字 组合,并且 大于等于 8 位
    • 配置完成后登录,管理员账号是 root


      image

    2.2. gitlab持续集成概念

    从 GitLab 8.0 开始,GitLab CI 就已经集成在 GitLab 中,我们只要在项目中添加一个 .gitlab-ci.yml 文件,然后添加一个 Runner,即可进行持续集成。 而且随着 GitLab 的升级,GitLab CI 变得越来越强大。

    Pipeline

    一次 Pipeline 其实相当于一次构建任务,里面可以包含多个流程,如安装依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。

    任何提交或者 Merge Request 的合并都可以触发 Pipeline,如下图所示:

    +------------------+           +----------------+
    |                  |  trigger  |                |
    |   Commit / MR    +---------->+    Pipeline    |
    |                  |           |                |
    +------------------+           +----------------+
    
    

    Stages

    Stages 表示构建阶段,说白了就是上面提到的流程。我们可以在一次 Pipeline 中定义多个 Stages,这些 Stages 会有以下特点:

    • 所有 Stages 会按照顺序运行,即当一个 Stage 完成后,下一个 Stage 才会开始
    • 只有当所有 Stages 完成后,该构建任务 (Pipeline) 才会成功
    • 如果任何一个 Stage 失败,那么后面的 Stages 不会执行,该构建任务 (Pipeline) 失败

    因此,Stages 和 Pipeline 的关系就是:

    +--------------------------------------------------------+
    |                                                        |
    |  Pipeline                                              |
    |                                                        |
    |  +-----------+     +------------+      +------------+  |
    |  |  Stage 1  |---->|   Stage 2  |----->|   Stage 3  |  |
    |  +-----------+     +------------+      +------------+  |
    |                                                        |
    +--------------------------------------------------------+
    
    

    Jobs

    Jobs 表示构建工作,表示某个 Stage 里面执行的工作。我们可以在 Stages 里面定义多个 Jobs,这些 Jobs 会有以下特点:

    • 相同 Stage 中的 Jobs 会并行执行
    • 相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功
    • 如果任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 失败

    所以,Jobs 和 Stage 的关系图就是:

    +------------------------------------------+
    |                                          |
    |  Stage 1                                 |
    |                                          |
    |  +---------+  +---------+  +---------+   |
    |  |  Job 1  |  |  Job 2  |  |  Job 3  |   |
    |  +---------+  +---------+  +---------+   |
    |                                          |
    +------------------------------------------+
    

    3. GitLab Runner部署

    为了配置方便,使用 docker来部署 GitLab Runner

    环境准备

    • 创建工作目录 /usr/local/docker/runner
    • 创建构建目录 /usr/local/docker/runner/environment
    • 下载 jdk-8u241-linux-x64.tar.gz 并复制到 /usr/local/docker/runner/environment
    • 下载 apache-maven-3.5.3-bin.tar.gz 并复制到 /usr/local/docker/runner/environment
    • 下载 docker-compose 并复制到 /usr/local/docker/runner/environment

    创建daemon.json

    创建docker的daemon.json文件,用于配置docker的镜像源地址和镜像仓库地址:

    {
      "registry-mirrors": [
        "https://registry.docker-cn.com"
      ],
      "insecure-registries": [
        "192.168.25.132:5000"
      ]
    }
    

    创建Dockerfile

    /usr/local/docker/runner/environment 目录下创建 Dockerfile

    FROM gitlab/gitlab-runner:v11.0.2
    # 创建人
    MAINTAINER Demon<476028894@qq.com>  
    
    # 修改软件源
    RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse' > /etc/apt/sources.list && \
        echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse' >> /etc/apt/sources.list && \
        echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse' >> /etc/apt/sources.list && \
        echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> /etc/apt/sources.list && \
        apt-get update -y && \
        apt-get clean
    
    # 添加gitlab-runner用户权限为root权限
    RUN usermod -aG root gitlab-runner
    
    # 安装 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
    COPY docker-compose /usr/local/bin
    RUN chmod +x docker-compose
    
    # 安装 Java
    RUN mkdir -p /usr/local/java
    WORKDIR /usr/local/java
    COPY jdk-8u241-linux-x64.tar.gz /usr/local/java
    RUN tar -zxvf jdk-8u241-linux-x64.tar.gz && \
        rm -fr jdk-8u241-linux-x64.tar.gz
    
    # 安装 Maven
    RUN mkdir -p /usr/local/maven
    WORKDIR /usr/local/maven
    COPY apache-maven-3.5.3-bin.tar.gz /usr/local/maven
    RUN tar -zxvf apache-maven-3.5.3-bin.tar.gz && \
        rm -fr apache-maven-3.5.3-bin.tar.gz
    
    # 配置环境变量
    ENV JAVA_HOME /usr/local/java/jdk1.8.0_241
    ENV MAVEN_HOME /usr/local/maven/apache-maven-3.5.3
    ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
    
    WORKDIR /
    

    创建docker-compose.yml

    /usr/local/docker/runner 目录下创建 docker-compose.yml

    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
    

    启动容器注册 Runner

    /usr/local/docker/runner 目录下,执行命令启动gitlab-runner:

    docker-compose up -d
    

    4. 持续集成

    创建项目

    创建maven项目,上传至gitlab仓库进行托管,并在更目录创建一个.gitlab-ci.yml文件,此文件用户gitlab触发runner入口,参考内容如下:

    stages:
      - install_deps
      - test
      - build
      - deploy_test
      - deploy_production
    
    cache:
      key: ${CI_BUILD_REF_NAME}
      paths:
        - node_modules/
        - dist/
    
    # 安装依赖
    install_deps:
      stage: install_deps
      only:
        - develop
        - master
      script:
        - npm install
    
    # 运行测试用例
    test:
      stage: test
      only:
        - develop
        - master
      script:
        - npm run test
    
    # 编译
    build:
      stage: build
      only:
        - develop
        - master
      script:
        - npm run clean
        - npm run build:client
        - npm run build:server
    
    # 部署测试服务器
    deploy_test:
      stage: deploy_test
      only:
        - develop
      script:
        - pm2 delete app || true
        - pm2 start app.js --name app
    
    # 部署生产服务器
    deploy_production:
      stage: deploy_production
      only:
        - master
      script:
        - bash scripts/deploy/deploy.sh
    

    上面的配置把一次 Pipeline 分成五个阶段:

    • 安装依赖(install_deps)
    • 运行测试(test)
    • 编译(build)
    • 部署测试服务器(deploy_test)
    • 部署生产服务器(deploy_production)

    设置 Job.only 后,只有当 develop 分支和 master 分支有提交的时候才会触发相关的 Jobs。

    节点说明:

    • stages:定义构建阶段,这里只有一个阶段 deploy
    • deploy:构建阶段 deploy 的详细配置也就是任务配置
    • script:需要执行的 shell 脚本
    • only:这里的 master 指在提交到 master 时执行
    • tags:与注册 runner 时的 tag 匹配.

    补充:
    如果需要再docker中启动一个容器需要等待其他容器启动,需配置Dockerfile文件如下:

    FROM openjdk:8
    
    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
    
    RUN mkdir /app
    
    COPY itoken-eureka-$APP_VERSION.jar /app/app.jar
    ENTRYPOINT ["dockerize", "-timeout", "5m", "-wait", "http://192.168.25.132:8888", "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar", "--spring.profiles.active=prod"]
    
    EXPOSE 8761
    

    注册仓库到gitlab runner

    依次输入以下语句注册gitlab指定仓库使用此runner

    docker exec -it gitlab-runner gitlab-runner register
    
    # 输入 GitLab 地址
    Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
    http://192.168.25.132:8080/
    
    # 输入 GitLab Token
    Please enter the gitlab-ci token for this runner:
    MNAFeURfEcYfEsp2Pmzi
    
    # 输入 Runner 的说明
    Please enter the gitlab-ci description for this runner:
    可以为空
    
    # 设置 Tag,可以用于指定在构建规定的 tag 时触发 ci
    Please enter the gitlab-ci tags for this runner (comma separated):
    可以为空
    
    # 选择 runner 执行器,这里我们选择的是 shell
    Please enter the executor: virtualbox, docker+machine, parallels, shell, ssh, docker-ssh+machine, kubernetes, docker, docker-ssh:
    shell
    

    GitLab Token位置:


    image.png

    注册成功后,将会在gitlab中显示如下:


    image.png

    提交更新到gitlab

    提交更新到gitlab查看管道效果,界面如下表示持续部署成功:

    image.png

    相关文章

      网友评论

          本文标题:GitLab-Docker-GitLabRunner之持续集成

          本文链接:https://www.haomeiwen.com/subject/kchlohtx.html