持续集成
持续集成指的是,频繁地(一天多次)将代码集成到主干。它的好处主要有两个:
- 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
- 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
持续交付
持续交付(Continuous delivery)
指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)
中。比如,我们完成单元测试后,可以把代码部署到连接数据库的 Staging
环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。
持续部署
持续部署(continuous deployment)
是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。
持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。
持续部署的前提是能自动化完成测试、构建、部署等步骤。
GitLab 持续集成
从 GitLab 8.0
开始,GitLab CI
就已经集成在 GitLab
中,我们只要在项目中添加一个 .gitlab-ci.yml
文件,然后添加一个 Runner
,即可进行持续集成。 而且随着 GitLab
的升级,GitLab CI
变得越来越强大。
-
Pipeline
任何提交或者Merge Request
的合并都可以触发Pipeline
-
Stages
表示构建阶段,说白了就是上面提到的流程。我们可以在一次Pipeline
中定义多个Stages
-
Jobs
表示构建工作,表示某个Stage
里面执行的工作。我们可以在Stages
里面定义多个Jobs
GitLab-Runner 安装
1.创建环境
java
开发需要依赖jdk
,maven
,所以我们先准备好这2个压缩包。
还需要构建我们的镜像,所以需要Docker
的加速器,daemon.json
。
第一步 创建文件夹(此处显示最终结果) ,其实就是创建了environment
/usr/local/docker/runner/docker-compose.yml
/usr/local/docker/runner/environment
第二步 把jdk
,maven
,daemon.json
复制一份放入environment
/usr/local/docker/runner/environment/Dockerfile
/usr/local/docker/runner/environment/apache-maven-3.6.1-bin.tar.gz
/usr/local/docker/runner/environment/daemon.json
/usr/local/docker/runner/environment/jdk-8u152-linux-x64.tar.gz
第三步 构建Dockerfile
FROM gitlab/gitlab-runner:v11.0.2
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
# 拷贝本地daemon.json 到容器/etc/docker
COPY daemon.json /etc/docker/daemon.json
# 安装 docker-compose
WORKDIR /usr/local/bin
RUN wget https://raw.githubusercontent.com/topsale/resources/master/docker/docker-compose
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 -fr 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.6.1
ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
WORKDIR /
安装 docker-compose
可能比较慢所以自己上传docker-compose
maven
的conf/settings.xml
也需要使用自己的 或者自己添加<servers>
节点,不然jar
包下载不下来。
2.启动
在上级目录创建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
注意这里没有image
而是build
,就是会执行environment
的Dockerfile
注册Runner
注册 Runner
docker exec -it gitlab-runner gitlab-runner register
Running in system-mode.
## gitlab地址 在每隔项目的 CI/CD里
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.0.108:8080/
## 项目token 在地址下面
Please enter the gitlab-ci token for this runner:
LF5BAxgujUWx4GHJAxoX
## 描述可以不写
Please enter the gitlab-ci description for this runner:
[2c13c51abfde]:
## tags
Please enter the gitlab-ci tags for this runner (comma separated):
Registering runner... succeeded runner=LF5BAxgu
## 执行方式,shell
Please enter the executor: ssh, virtualbox, kubernetes, docker-ssh, parallels, docker+machine, docker-ssh+machine, docker, shell:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
此处的token 在项目 --> 设置 --> CI/CD --> Runner,先填写项目的 URL ,在填写token
,说明可以不用写,tags
可以不用写,使用shell
完成。每一个项目都要注册Runner
。
.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/my-shop-1.0.0-SNAPSHOT.jar docker
- cd docker
- docker build -t 192.168.0.108:5000/my-shop .
## 推送镜像到Registry平台
push:
stage: push
script:
- docker push 192.168.0.108:5000/my-shop
## 删除虚悬镜像
clean:
stage: clean
script:
- docker rmi $(docker images -q -f dangling=true)
通过docker exec -it gitlab-runner bin/shell
访问/home/gitlab-runner/builds/
访问项目
总结
利用DockerCompose
+jdk
+maven
来部署我们的项目已经很简单了,现在只要修改了代码并且提交代码或者合请求就可以自动帮我们打包,上传到Registry
平台,其他局域网的服务器,只要安装了Docker
就可以轻松pull
下来。