赞
踩
项目部署的具体流程:
我们为什么要使用ci持续集成呢?
想必知道了上面项目部署的流程后,都有一定的感觉,就是每次我更新项目了,我都需要按上面的步骤走一次,很麻烦。但是上面的流程又是固定的,对,固定的,此时我们马上想到能否自动化帮我们解决呢?
CI持续集成就是为了解决上面的问题产生的,持续集成的意思:项目你只要编写好,提交好了,那么就会自动集成到服务器中,是的,不用你maven打包什么鬼了,全自动的完成。
由于本人计算机内存才8g,开多虚拟机会炸,因此,在同一台机器上安装等下需要的所有东西。
我们将使用docker-compose去安装gitlab服务器,下面的yml文件就是参考上面的官网文档写得。
version: '3.7' services: gitlab: image: 'twang2218/gitlab-ce-zh:11.1.1' container_name: "gitlab" restart: always # 赋予特定权限 privileged: true hostname: 'gitlab' environment: TZ: 'Asia/Shanghai' GITLAB_OMNIBUS_CONFIG: | # 设置为自己的ip external_url 'http://192.168.182.130' gitlab_rails['time_zone'] = 'Asia/Shanghai' gitlab_rails['smtp_enable'] = true gitlab_rails['gitlab_shell_ssh_port'] = 22 ports: - '80:80' - '443:443' - '22:22' volumes: - ./docker_gitlab/config:/etc/gitlab - ./docker_gitlab/data:/var/opt/gitlab - ./docker_gitlab/logs:/var/log/gitlab
需要修改sshd默认端口,因为从上面的yml文件我们可以看出,他也需要22端口号,当然你也可以修改上面的yml配置文件。
# 第一种方案,修改上面的yml文件,看清楚到底是改哪里的22 # 个人还是不建议这样子修改,我就一开始作死过,后面一堆bug # 喜欢折腾的,可以这样子操作 gitlab_rails['gitlab_shell_ssh_port'] = 8081 ports: - '80:80' - '443:443' - '8081:22' # 第二种方案,修改sshd的默认端口号 vi /etc/ssh/sshd_config 将Port 22 改成 Port 60322 # 重新启动一下sshd systemctl restart sshd # 此时,如果你用了其他软件去连接虚拟机的请注意: 之后你连接虚拟机,记得把端口号改成 60322,而不是用来的22,否则你一直都找不出原因的
运行docker-compose up -d(之后会有一系列的bug,请注意)
# 启动,并让它拉取gitlab
root@ubuntu:/home/docker_gitlab# docker-compose up -d
Pulling gitlab (twang2218/gitlab-ce-zh:11.1.1)...
11.1.1: Pulling from twang2218/gitlab-ce-zh
# 之后,查看gitlab的启动日志(重点)
docker-compose logs -f
# 因为gitlab启动是真的真的真的很慢,我们需要通过查看日志,保证真的启动成功了
# 否则,你此时在浏览器输入ip,一直都是无法访问的bug
# 实际上不是无法访问,是gitlab服务器都没有启动成功呢。
当你看见日志输出,总是重复输出这两句话的时候,说明gitlab服务器已经准备好了。
打开浏览器直接输入 ip 即可,用户名root,密码password,登录就好了。
默认你们是没有项目的,我的是之前学习创建好了。
runner是什么?就是相当于一个自动化流水线工程,会自动执行符合tag的作业(先理解一下,后面测试的时候,会明白的)。
先创建一个docker-runner目录,将需要的文件全部放于此地。
这是最后的目录结构,下面一步步来完成。坚持住,加油。
root@ubuntu:/home/docker-runner# ls
apache-maven-3.6.3.tar.gz config docker-compose docker-compose.yml Dockerfile jdk-8u271-linux-x64.tar.gz
version: '3.7'
services:
gitlab-runner:
build:
context: ./
dockerfile: Dockerfile
restart: always
container_name: gitlab-runner
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /etc/apt/:/etc/apt
在数据映射的时候,映射了两个,docker.sock 跟/etc/apt目录
本地虚拟机中的docker.sock 是本地docker运行时候的关键东西,你可以理解为一把锁,有这个锁,才能用本地docker运行,为什么要映射这个呢?因为我们在gitlab-runner容器里面也是要使用docker的。
本来gitlab服务器 跟 gitlab-runner应该在两个机子上的,因为我们没有资金换内存大的电脑,都在同一个虚拟机上操作。
我们需要gitlab-runner容器使用宿主机即本地虚拟机的docker,因此,必须把docker.sock 共享给runner容器中。
/etc/apt中有个很重要的sources.list文件,这个文件是存储我们阿里云镜像的内容,请看下面。这样子gitlab-runner容器中相当于我们已经换了阿里云的镜像,此后,再gitlab-runner容器中使用apt-get install 下载东西则不会很慢了。
root@ubuntu:/home/docker-runner# cat /etc/apt/sources.list
# deb-src http://security.ubuntu.com/ubuntu xenial-security main restricted
# deb-src http://security.ubuntu.com/ubuntu xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse restricted main universe
#deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable
# deb-src [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable
# deb-src http://security.ubuntu.com/ubuntu xenial-security multiverse
下面是Dockerfile的用法,如果你不懂dockerfile的用法,
请看:https://blog.csdn.net/xueyijin/article/details/111693506
相应的maven jdk 在评论区有百度网盘链接。
FROM gitlab/gitlab-runner WORKDIR /usr/local/bin COPY docker-compose docker-compose RUN chmod 777 docker-compose RUN mkdir -p /usr/local/java WORKDIR /usr/local/java COPY jdk-8u271-linux-x64.tar.gz /usr/local/java RUN tar -zxvf jdk-8u271-linux-x64.tar.gz RUN rm -rf jdk-8u271-linux-x64.tar.gz RUN mkdir -p /usr/local/maven WORKDIR /usr/local/maven COPY apache-maven-3.6.3.tar.gz /usr/local/maven RUN tar -zxvf apache-maven-3.6.3.tar.gz RUN rm -rf apache-maven-3.6.3.tar.gz ENV JAVA_HOME /usr/local/java/jdk1.8.0_271 ENV MAVEN_HOME /usr/local/maven/apache-maven-3.6.3 ENV PATH $PATH:/usr/local/bin:$JAVA_HOME/bin:$MAVEN_HOME/bin WORKDIR /
# 拉取gitlab-runner镜像 FROM gitlab/gitlab-runner # 确定docker-compsoe工作目录,将docker-compose文件复制到容器中 WORKDIR /usr/local/bin COPY docker-compose docker-compose RUN chmod 777 docker-compose # 确定java的工作目录,将jar8复制到容器中,且解压并删除软件包 RUN mkdir -p /usr/local/java WORKDIR /usr/local/java COPY jdk-8u271-linux-x64.tar.gz /usr/local/java RUN tar -zxvf jdk-8u271-linux-x64.tar.gz RUN rm -rf jdk-8u271-linux-x64.tar.gz # 确定maven的工作目录,将maven复制到容器中,且解压并删除软件包 # 需要maven是因为runner之后会帮我们把代码打包成war包,因此需要maven RUN mkdir -p /usr/local/maven WORKDIR /usr/local/maven COPY apache-maven-3.6.3.tar.gz /usr/local/maven RUN tar -zxvf apache-maven-3.6.3.tar.gz RUN rm -rf apache-maven-3.6.3.tar.gz # 设置环境变量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_271 ENV MAVEN_HOME /usr/local/maven/apache-maven-3.6.3 ENV PATH $PATH:/usr/local/bin:$JAVA_HOME/bin:$MAVEN_HOME/bin # 初始化 工作目录在根目录下 WORKDIR /
# 1. 先进入gitlab-runner容器中,并安装docker。
docker exec -it gitlab-runner bash
# 由于我们把/etc/apt/sources.list 文件共享来了
# 间接换了阿里云镜像,因此需要先 更新软件包
root@a9a311428c97:/# apt-get update
# 安装docker
root@a9a311428c97:/# apt-get install docker && apt-get install docker.io
# 2. 将docker.sock的文件设置为root用户组操作
sudo chown root:root /var/run/docker.sock
# 3. 将gitlab-runner容器运行时候的用户组改成 root用户组
# 这样子runner容器就可以肆无忌惮的使用宿主机的docker了
docker exec -it gitlab-runner usermod -aG root gitlab-runner
创建项目
点击ci/cd设置
点击runner设置(注册和查看你的项目)
发现里面是空的,因为我们还没有将runner注册到gitlab,因此下一步就是将runner注册到gitlab。
下面这图片很重要,有url跟令牌。
# runner注册命令 root@ubuntu:/home/docker_gitlab# docker exec -it gitlab-runner gitlab-runner register Runtime platform arch=amd64 os=linux pid=326 revision=943fc252 version=13.7.0 Running in system-mode. # 输入URL,就是上面说很重要的图片中的URL Enter the GitLab instance URL (for example, https://gitlab.com/): http://192.168.182.129/ # 输入令牌,也是上面图片中的token Enter the registration token: 1X-N_Zfr_ePxGoPG3Lzw # 就是描述一下这个runner Enter a description for the runner: [a9a311428c97]: first ci # 这个就是tag,标志,后面会详细说明 # deploy 只是一个标志 Enter tags for the runner (comma-separated): deploy # 注册成功 Registering runner... succeeded runner=1X-N_Zfr # 选择runner执行器,这里我们选择用shell,命令行方式 Enter an executor: custom, docker, docker-ssh, parallels, shell, kubernetes, ssh, virtualbox, docker+machine, docker-ssh+machine: shell Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
创建一个JavaWeb—maven工程,并确保可以运行成功。
并使用git,将代码推送到gitlab中
对idea操作git 不熟悉的,可以看这篇:https://blog.csdn.net/xueyijin/article/details/111462555
目前已经保证了gitlab跟idea是没有任何问题的,接下来就是要测试runner了
使用runner,我们需要额外一种配置文件来管理,那就是 .gitlab-ci.yml 文件。
在项目的根目录下,创建一个.gitlab-ci.yml文件,并编写如下内容:
stages:
- test
test:
stage: test
tags:
- deploy
script:
- echo first test ci
# 解释 # runner是什么?就是相当于一个自动化流水线工程,会自动执行符合tag的作业 # 这相当于service stages: # 随便起一个名字 - test test: # 确保这个跟上面的名字都相同 stage: test # 标志,还记得我们在注册runner的时候写的tags吗? # 如果我下面写的是run,那么runner将无视,无法操作此作业,因为不符合tag # 如果是deploy,就跟注册的runner写的tags一致,则表示runner可以接受这个作业 # 但是我们在注册完runner的时候,设置了此runner可以运行不带标签的的作业,因此不写也可以 tags: - deploy # runner之后会执行的作业脚本 # 因为我们在注册runner的时候, # 选择runner执行器,选择用shell,命令行方式 script: - echo first test ci
提交到gitlab中。
在gitlab中,我们看见已经提交过来的.gitlab-ci.yml文件
我们将看见下面,已经通过的流水线测试,我们再点击 已通过 进去查看一下。
出现上面的结果,说明了runner也成功了。
刚刚我们已经可以成功执行.gitlab-ci.yml中的echo first test ci 的脚本了,这个脚本是在gitlab-runner的容器中执行的,那么我们先进入gitlab-runner容器中查看具体情况。
# 查看gitlab-runner容器中的home目录 root@a9a311428c97:/# cd /home # 里面有个gitlab-runner 目录,继续往下追 root@a9a311428c97:/home# ls gitlab-runner root@a9a311428c97:/home# cd gitlab-runner/ root@a9a311428c97:/home/gitlab-runner# ls builds root@a9a311428c97:/home/gitlab-runner# cd builds/ # af381749其实就是我们在gitlab上看见runner的前面一堆数字是一样的 # 不信的同学,可以往上 看我的截图 root@a9a311428c97:/home/gitlab-runner/builds# ls af381749 root@a9a311428c97:/home/gitlab-runner/builds# cd af381749/ root@a9a311428c97:/home/gitlab-runner/builds/af381749# ls 0 root@a9a311428c97:/home/gitlab-runner/builds/af381749# cd 0 root@a9a311428c97:/home/gitlab-runner/builds/af381749/0# ls root root@a9a311428c97:/home/gitlab-runner/builds/af381749/0# cd root/ root@a9a311428c97:/home/gitlab-runner/builds/af381749/0/root# ls CI CI.tmp root@a9a311428c97:/home/gitlab-runner/builds/af381749/0/root# cd CI # 最终我们就找到这里了 # 如果我们想要maven打包,而我们在创建gitlab-runner容器的时候,已经给他安装了maven,jdk了 # 因此,我们执行脚本的时候,就可以使用maven打包了 root@a9a311428c97:/home/gitlab-runner/builds/af381749/0/root/CI# ls pom.xml src root@a9a311428c97:/home/gitlab-runner/builds/af381749/0/root/CI#
先查看项目结构
编写Dockerfile文件,docker-compose.yml文件,.gitlab-ci.yml文件
# Dockerfile文件是干什么的?是用来构建自定义的镜像
# 编写Dockerfiel文件
# 因为我们是web项目,肯定是需要tomcat服务器,因此需要构建镜像
# 并把项目copy到tomcat的webapps中
FROM daocloud.io/library/tomcat:9.0.36-jdk8
COPY CI.war /usr/local/tomcat/webapps
# docker-compose.yml是干什么的?是用来启动并且管理容器的方法。
version: '3.7'
services:
ci:
build:
# 因为我的dockerfile文件放在了docker目录下
context: docker
dockerfile: Dockerfile
restart: always
# 这里要用小写,因为容器的名字不能大小
container_name: ci
ports:
- 8080:8080
# .gitlab-ci.yml文件是让runner自动执行某些脚本命令。 # 编写.gitlab-ci.yml文件 stages: - test test: stage: test tags: - deploy script: - echo first test ci # 使用mvn 将项目打包,打包之后会生成target文件 - /usr/local/maven/apache-maven-3.6.3/bin/mvn package # 将里面的CI.war 复制到docker目录下,方便Dockerfile将工程复制到tomcat镜像的webapps中 - cp target/CI.war docker/CI.war # 需要先清除上一次的容器,重新创建一个。 - docker-compose down # 需要重新构建镜像,而不是用原来那个 - docker-compose up -d --build
直接git到gitlab中。打开流水线ci/cd看见有个正在运行中的作业,点进去看到,它正在打包项目,下载有关的jar包。
3.我们首先使用docker ps查看。
```powershell
# 发现已经启动了
root@ubuntu:/home/ssm# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b629d71569e ci_ci "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp ci
a9a311428c97 docker-runner_gitlab-runner "/usr/bin/dumb-init …" 4 hours ago Up 4 hours gitlab-runner
f880982fe3aa twang2218/gitlab-ce-zh:11.1.1 "/assets/wrapper" 4 hours ago Up 4 hours (healthy) 0.0.0.0:22->22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp gitlab
```
直接的浏览器中输入ip:8080,可以正确得到结果.
此时,我在idea上修改index页面,然后再次提交到gitlab上,就做这两个操作,其他什么都不做。
直接点击刷新,页面自动更新。
root@ubuntu:/home/ssm# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ci_ci latest bb3aecafc54c 31 seconds ago 530MB <none> <none> 0aa721cb7320 5 minutes ago 530MB <none> <none> f8d996f75a58 16 minutes ago 530MB docker-runner_gitlab-runner latest 7467f765da3c 4 hours ago 1.06GB gitlab/gitlab-runner latest 5709b0c004e5 7 days ago 511MB daocloud.io/library/tomcat 9.0.36-jdk8 b79665757bae 6 months ago 530MB twang2218/gitlab-ce-zh 11.1.1 e1282cde70e8 2 years ago 1.61GB # 使用docker images -qf dangling=true 可以列出为none的id # 先不加参数 -q root@ubuntu:/home/ssm# docker images -f dangling=true REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 0aa721cb7320 8 minutes ago 530MB <none> <none> f8d996f75a58 20 minutes ago 530MB # 参数 -q为 只列出id root@ubuntu:/home/ssm# docker images -qf dangling=true 0aa721cb7320 f8d996f75a58 # 修改.gitlab-ci.yml文件 stages: - test test: stage: test tags: - deploy script: - echo first test ci - /usr/local/maven/apache-maven-3.6.3/bin/mvn package - cp target/CI.war docker/CI.war - docker-compose down - docker-compose up -d --build - docker rmi $(docker images -qf dangling=true)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。