持续集成

mac2026-03-13  5

持续集成

百科

互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称CI)。

持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。与持续集成相关的,还有两个概念,分别是持续交付和持续部署。 持续交付(Continuous delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。持续部署(continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。持续部署的前提是能自动化完成测试、构建、部署等步骤。

使用gitlab持续集成

Pipeline、Stages、Jobs

可以用以下但张图来描述一下这三个概念

Pipeline +------------------+ +----------------+ | | trigger | | | Commit / MR +---------->+ Pipeline | | | | | +------------------+ +----------------+ Stages +--------------------------------------------------------+ | | | Pipeline | | | | +-----------+ +------------+ +------------+ | | | Stage 1 |---->| Stage 2 |----->| Stage 3 | | | +-----------+ +------------+ +------------+ | | | +--------------------------------------------------------+ Jobs +------------------------------------------+ | | | Stage 1 | | | | +---------+ +---------+ +---------+ | | | Job 1 | | Job 2 | | Job 3 | | | +---------+ +---------+ +---------+ | | | +------------------------------------------+

##使用 GitLab Runner Docker##

由谁来执行这些构建任务呢? 答案就是 GitLab Runner 了!

为了配置方便,我们可以使用Docker来部署GitlabRunner

步骤

环境准备

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

创建构建目录 /usr/local/docker/runner/environment

下载 jdk-8u152-linux-x64.tar.gz 、maven、docker-compose并复制到 /usr/local/docker/runner/environment

Dockerfile:使用Dockerfile脚本来构建出一个镜像(/usr/local/docker/runner/environment)

FROM gitlab/gitlab-runner:v11.0.2 MAINTAINER weird <hweird@yeah.net> # 修改软件源 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 # 安装 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-8u152-linux-x64.tar.gz /usr/local/java RUN tar -zxvf jdk-8u152-linux-x64.tar.gz && \ rm -fr jdk-8u152-linux-x64.tar.gz # 安装 Maven RUN mkdir -p /usr/local/maven WORKDIR /usr/local/maven COPY apache-maven-3.6.1-bin.tar.gz /usr/local/maven RUN tar -zxvf apache-maven-3.6.1-bin.tar.gz && \ rm -rf apache-maven-3.6.1-bin.tar.gz # 配置环境变量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_152 ENV MAVEN_HOME /usr/local/maven/apache-maven-3.5.3 ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin WORKDIR /

daemon.json:同时需要在/usr/local/docker/runner/environment 目录下创建 daemon.json,用于配置加速器和仓库地址

{ "registry-mirrors": ["https://ib2c2ony.mirror.aliyuncs.com"], "insecure-registries": [ "193.168.25.152:5000" ] }

docker-compose.yml:使用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 docker exec -it gitlab-runner gitlab-runner register # 输入 GitLab 地址 Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/): http://192.168.75.146:8080/ # 输入 GitLab Token Please enter the gitlab-ci token for this runner: 1Lxq_f1NRfCfeNbE5WRh # 输入 Runner 的说明 Please enter the gitlab-ci description for this runner: 可以为空 # 设置 Tag,可以用于指定在构建规定的 tag 时触发 ci Please enter the gitlab-ci tags for this runner (comma separated): deploy # 这里选择 true ,可以用于代码上传后直接执行 Whether to run untagged builds [true/false]: true # 这里选择 false,可以直接回车,默认为 false Whether to lock Runner to current project [true/false]: false # 选择 runner 执行器,这里我们选择的是 shell Please enter the executor: virtualbox, docker+machine, parallels, shell, ssh, docker-ssh+machine, kubernetes, docker, docker-ssh: shell

在任务执行完成之后会发现多出了一个gitlab/gitlab-runner镜像,且处于运行状态

然后需要到gitlab中找到想要持续集成的项目的 GitLab 地址和 GitLab token,注意选择 runner 执行器的时候,这里我们选择的是 shell。

在项目中持续集成

我们以案例itoken中的itoken-config为例

在项目中创建一个文件夹Docker和.gitlab-ci.yml,在文件夹中创建Dockerfile和docker-compose.yml

.gitlab-ci.yml

stages: - build - push - run - clean build: stage: build script: - /usr/local/maven/apache-maven-3.6.1/bin/mvn clean package - cp target/itoken-config-1.0.0-SNAPSHOT.jar docker - cd docker - docker build -t 192.168.25.152:5000/itoken-config . push: stage: push script: - docker push 192.168.25.152:5000/itoken-config run: stage: run script: - cd docker - docker-compose down - docker-compose up -d clean: stage: clean script: - docker rmi $(docker images -q -f dangling=true)

Dockerfikle:

FROM openjdk:8-jre MAINTAINER weird <hwerid@yeah.net> #ENV APP_VERSION 1.0.0-SNAPSHOT RUN mkdir /app COPY itoken-config-1.0.0-SNAPSHOT.jar /app/app.jar ENTRYPOINT [ "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar", "--spring.profiles.active=prod"] EXPOSE 8888

docker-compose.yml

version: '3.1' services: itoken-config: restart: always image: 192.168.25.152:5000/itoken-config container_name: itoken-config ports: - 8888:8888 networks: - config_networks networks: config_networks:

然后就会在虚拟机上构建出192.168.25.152:5000/itoken-config镜像

同理,在itoken-eureka项目中进行持续集成一是一样的操作,只是在Dockerfile中需要加入dockerize,使项目有序的进行,不会出现紊乱。

Dockerfile:

FROM openjdk:8-jre MAINTAINER weird <hweird@yeah.net> 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", "tcp://192.168.25.153:8888", "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar", "--spring.profiles.active=prod"] EXPOSE 8761
最新回复(0)