docker DI
1.1 安装gitlab
1.1.1 docker-compose.yml文件
version: '3.1'
services:
gitlab:
image: 'twang2218/gitlab-ce-zh:11.1.4'
container_name: "gitlab"
restart: always
privileged: true
hostname: 'gitlab'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://172.16.195.134'
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:
- /usr/local/gitlab/compose01/config:/etc/gitlab
- /usr/local/gitlab/compose01/data:/var/opt/gitlab
- /usr/local/gitlab/compose01/logs:/var/log/gitlab
1.1.2 由于 gitlab 有22 端口的占用,与 ssh 冲突了,所以需要改ssh的 端口
[root@centOS compose01]# vi /etc/ssh/sshd_config
# 修改服务器 ssh端口
Port 60022
# 重启ssh服务
[root@centOS compose01]# systemctl restart sshd
1.1.3 由于 新添加 的 60022 端口不是linux 默认添加的,所以需要从防火墙开放这个端口
# 修改防火墙配置
iptables -I INPUT -p tcp --dport 60022 -j ACCEPT
# 保存到 iptables 文件中
service iptables save
# 如果 /etc/sysconfig/下没有iptables 文件,需要安装一下
yum install iptables-services
# 设置开机自启
systemctl enable iptables
# 启动防火墙
systemctl start iptables
1.1.4 在浏览器中输入 ip
1.1.5 配置
首先设置新的密码
我们这设置的是root123456
默认的用户名是root
登录成功 !!!
1.2 搭建gitlab-runner
1.2.1 什么是gitlab-runner
1.2.2 如何获取gitlab-runner
镜像
如果我们之前配置的docker远程镜像仓库不包含gitlab-runner
镜像,可以通过配置其他的镜像仓库来得到这个镜像。
1.2.3 修改/etc/docker/ 目录下的 daemon.json 文件(可选操作,我没有配置)
# 需要创建 /etc/docker/daemon.json,并添加如下内容
{
# 设置私服的地址
"registry-mirrors":["https://registry.docker-cn.com"],
# 设置公司内部私服的ip和端口号
"insecure-registries":["ip:port"]
}
1.2.4 重启docker服务
# 重新加载配置文件
systemctl daemon-reload
# 重启docker
systemctl restart docker
1.2.5 创建gitlab-runner通过目录
mkdir /usr/local/gitlab/gitlab_runner
mkdir /usr/local/gitlab/gitlab_runner/config
mkdir /usr/local/gitlab/gitlab_runner/config/gitlab_runner
mkdir /usr/local/gitlab/gitlab_runner/environment
# 创建单位文件结构为 如果没有tree命令,可以使用yum -y install tree 命令安装
[root@centOS gitlab]# tree gitlab_runner/
gitlab_runner/
├── config
│ └── gitlab_runner
├── docker-compose.yml
└── environment
├── apache-maven-3.6.3-bin.tar.gz
├── Dockerfile
└── jdk-8u221-linux-x64.tar.gz
1.2.6 创建docker-compose.yml文件
version: '3.1'
services:
gitlab-runner:
restart: always
build: environment
container_name: gitlab-runner
privileged: true
volumes:
- ./config/gitlab_runner:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
- /bin/docker:/bin/docker
1.2.7 传送环境文件
# 下载好 linux 版本的 jdk和maven,传送到environment目录下
1.2.8 创建dockerfile文件
# 在environment目录下创建dockerfile文件
vi Dockerfile
# 填写以下值
version: '3.1'
FROM gitlab/gitlab-runner
# 指定作者
# MAINTAINER Lusifer <topsale@vip.qq.com>
# 安装 Docker Compose
WORKDIR /usr/local/bin
RUN wget https://raw.githubusercontent.com/topsale/resources/master/docker/docker-compose
RUN chmod +x docker-composes
# 安装 Java
RUN mkdir -p /usr/local/java
WORKDIR /usr/local/java
COPY jdk-8u221-linux-x64.tar.gz /usr/local/java
RUN tar -zxvf jdk-8u221-linux-x64.tar.gz && \
rm -fr jdk-8u221-linux-x64.tar.gz
# 安装 Maven
RUN mkdir -p /usr/local/maven
WORKDIR /usr/local/maven
# RUN wget https://raw.githubusercontent.com/topsale/resources/master/maven/apache-maven-3.6.3-bin.tar.gz
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/jdk1.8.0_221
ENV MAVEN_HOME /usr/local/maven/apache-maven-3.6.3
ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
WORKDIR /
1.2.9 在宿主机重启docker后执行授予权限的命令
# 为了指定宿主机docker一个执行权限
[root@centOS gitlab_runner]# sudo chown root:root /var/run/docker.sock
1.2.10 在 /usr/local/gitlab/gitlab_runner 目录下执行 docker-compose up -d --build ,构想镜像和启动容器
1.2.11 给刚刚运行的容器添加一个权限
docker exec -it gitlab-runner usermod -aG root gitlab-runner
1.2.12 在 gitlab 上创建一个项目
1.2.13 注册runner信息到gitlab
1.2.14 进入创建的项目,在设置目录下点击ci/di
1.2.15 展开Runner项
1.2.15.1 获取到在服务器中需要的参数
上图中的 第2项和第3项 是要用到的url和令牌
1.2.15.2 配置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://172.16.195.134/
# 输入 GitLab Token 上图中的第三项
Please enter the gitlab-ci token for this runner:
rEoYGJSNMwJ5Xt_mSSvy
# 然后runner会让我们填一些描述置类的
# 输入 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
1.2.16 查看日志
# 使用命令查看docker-compose命令,会发现日志报错误
docker-compose logs -f
gitlab-runner | ERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory builds=0
gitlab-runner | ERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory builds=0
gitlab-runner | ERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory builds=0
# 但是不用怕,这是因为还没有把gitlab 和 gitlab-runner 关联起来,当下面的步骤完成后,就会正常了
gitlab-runner | Configuration loaded builds=0
1.2.17 配置完成后,刷新gitlab 下 项目的runner 界面,会刷线出来一些新的东西,如
1.2.18 点击旁边的编辑,勾选运行没有标签的作业这一项,然后直接保存修改,这样,gitlab-runner就和gitlab 关联好了,并且和项目绑定在一起。
1.3 测试gitlab-runner
1.3.1 创建一个 maven 项目
-
打开idea -> 点击new product -> 选择maven项目 -> 不用选archetype,直接点next -> 填写一些项目相关的信息 -> 点完成
-
pom.xml文件添加 打包方式
<packaging>war</packaging>
-
添加 web.xml文件 :
-
配置启动项和tomcat
- 第一步: 配置启动项
- 点击+,选择tomcat server
- 右侧 server下 配置 application server,选择本地的tomcat安装包
- 点击 deployment,把项目的war包放到tomcat目录下
-
启动项目
-
点击启动,如果在mac下没有配置tomcat的启动权限,会报错
Cannot run program "/Applications/SoftWore/server/tomcat01/apache-tomcat-8.5.57/bin/catalina.sh ...
-
解决办法,到bin 目录下,给.sh 文件配置 启动权限
➜ bin chmod 777 *.sh
-
-
给项目配置gitlab地址
-
点击idea上面vcs,选择import into ver… -> create git repo… -> 选择项目文件夹
-
创建上传忽略文件 :
-
添加忽略文件的格式
# Created by .ignore support plugin (hsz.mobi) .idea target *.im
-
配置远程仓库地址
-
提交代码到远程仓库
-
首次提交到gitlab的时候有可能出现推送错误,是因为我们我们提交前没有先从远程仓库pull代码,当我们推送的时候就报错了
-
解决的方式,先创建一个分支,把当前代码提交到新建的分支里,提交成功后,把新建的分支与原分支合并
# 创建新的分支 testci git:(develop) git branch develop2 # 推送到新分支 testci git:(develop) git push -u origin develop2 # 切换分支 testci git:(develop) git checkout master git fetch origin git checkout -b dev origin/dev git checkout master git merge --no-off dev git push origin master
-
-
编写gitlab-ci.yml文件
-
在项目与pom.xml文件同一路径下,创建一个
.gitlab-ci.yml
文件 -
编写内容为
# 要保证 stages 参数与 下面 stage 上层 以及 stage 对应的值相同 即 三个A 要相同 #stages: # - A #A: # stage: A stages: - test test: stage: test script: - echo my first test ci # 作用是打印处这段话
-
使用git 提交&推送到gitlab上
-
从gitlab页面点击左侧的ci/cd,选择流水线,会发现出现了一个
-
点击 已通过 按钮
-
点击 下面流水线 下的 test 可以看到一个黑窗口,并且窗口中有打印刚才在
.gitlab-ci.yml
中配置的 参数
-
出现了以上的代码,说明这个文件可以正常运行,下面就需要在
.gitlag-ci.yml
文件中配置 docker相关信息,用来达到自动化部署的目的 -
上面流水线的作业中打印的 my first test ci 是怎么打印的呢 ?
# 查看容器 [root@centOS ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e75210ca74ba gitlab_runner_gitlab-runner "/usr/bin/dumb-init …" 6 hours ago Up 6 hours gitlab-runner c38a72730a24 twang2218/gitlab-ce-zh:11.1.4 "/assets/wrapper" 22 hours ago Up 21 hours (healthy) 0.0.0.0:22->22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp gitlab # 进入容器内部 [root@centOS ~]# docker exec -it e7 bash root@e75210ca74ba:/# cd /home/ root@e75210ca74ba:/home# ll total 0 drwxr-xr-x. 3 gitlab-runner gitlab-runner 51 Aug 30 07:47 gitlab-runner/ # 进入 容器内的gitlab-runner root@e75210ca74ba:/home# cd gitlab-runner/ root@e75210ca74ba:/home/gitlab-runner# ll total 8 drwxrwxr-x. 3 gitlab-runner gitlab-runner 22 Aug 30 07:47 builds/ root@e75210ca74ba:/home/gitlab-runner# cd builds/ root@e75210ca74ba:/home/gitlab-runner/builds# ll total 0 drwxrwxr-x. 3 gitlab-runner gitlab-runner 15 Aug 30 07:47 b13c47e0/ # 进入build后可以看到一个 字符串,这个是之前配置ci/di的时候成功后,在Runner下看的可用的runner root@e75210ca74ba:/home/gitlab-runner/builds# cd b13c47e0/ root@e75210ca74ba:/home/gitlab-runner/builds/b13c47e0# ll total 0 drwxrwxr-x. 3 gitlab-runner gitlab-runner 18 Aug 30 07:47 0/ # 进入 0/root/ 可以看到我们的项目 testci root@e75210ca74ba:/home/gitlab-runner/builds/b13c47e0# cd 0/ root@e75210ca74ba:/home/gitlab-runner/builds/b13c47e0/0# ll total 0 drwxrwxr-x. 4 gitlab-runner gitlab-runner 38 Aug 30 07:47 root/ root@e75210ca74ba:/home/gitlab-runner/builds/b13c47e0/0# cd root/ root@e75210ca74ba:/home/gitlab-runner/builds/b13c47e0/0/root# ll total 0 drwxrwxr-x. 4 gitlab-runner gitlab-runner 84 Aug 30 07:47 testci/ drwxrwxr-x. 3 gitlab-runner gitlab-runner 26 Aug 30 07:47 testci.tmp/ root@e75210ca74ba:/home/gitlab-runner/builds/b13c47e0/0/root# cd testci root@e75210ca74ba:/home/gitlab-runner/builds/b13c47e0/0/root/testci# ll # 实际上,那个 .gitlab-ci.yml的命令是在这个地方执行的,但是由谁执行的呢 ? 虽然在这个位置可以使用mvn -v 命令,但是实际上在这个位置 mvn 命令是无效的,这个位置执行 mvn -v 的是 gitlab,所以,如果想要在这个位置使用mvn,需要使用全路径,此时 mvn 的安装路径是在 /usr/local/maven/apache-maven-3.6.3/bin,所以我们需要在gitlab-ci.yml中的配置文件里添加mvn 命令的时候,使用的就是全路径命令了。其他容器内的命令也是相同的道理。 total 12 drwxrwxr-x. 4 gitlab-runner gitlab-runner 84 Aug 30 07:47 ./ drwxrwxr-x. 4 gitlab-runner gitlab-runner 38 Aug 30 07:47 ../ drwxrwxr-x. 6 gitlab-runner gitlab-runner 113 Aug 30 07:47 .git/ -rw-rw-r--. 1 gitlab-runner gitlab-runner 66 Aug 30 07:47 .gitignore -rw-rw-r--. 1 gitlab-runner gitlab-runner 78 Aug 30 07:47 .gitlab-ci.yml -rw-rw-r--. 1 gitlab-runner gitlab-runner 451 Aug 30 07:47 pom.xml drwxrwxr-x. 3 gitlab-runner gitlab-runner 18 Aug 30 07:47 src/
-
-
1.4 使用gitlab-runner持续集成
1.4.1 创建docker文件夹
在pom.xml文件同级目录下创建docker 文件夹,用来存放dockerfile文件和.war文件
1.4.2 配置dockerfile文件
FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY testci.war /usr/local/tomcat/webapps
1.4.3 配置docker-compose.yml文件
与docker文件夹同级
version: "3.1"
services:
testci:
# 使用 同一个层级下 docker 文件夹下的 文件进项构建项目
build: docker
restart: always
# 配置容器名
container_name: testci
# 配置映射端口
ports:
- 8080:8080
1.4.4 配置.gitlab-ci.yml文件
stages:
- test
test:
stage: test
script:
- echo my first test ci
# 首先对项目进项打包
- /usr/local/maven/apache-maven-3.6.3/bin/mvn package
# 把target目录下打包好的war文件复制到 docker目录下
- cp target/testci-1.0-SNAPSHOT.wara docker/testci.war
# 关掉之前启动的docker-compose 容器 (这一步是最开始配置runner的时候配置runner可以调用宿主机的docker权限)
- docker-compose down
# 重新构建docker-compose 容器并启动
- docker-compose -up -d --build
# 删除由于重新构建镜像导致出现镜像名是 null 的镜像
- docker rmi $(docker images -qf dangling=true)
1.4.6 推送到gitlab上,从ci/di -> 作业下看到报错误
$ cp target/testci-1.0-SNAPSHOT.war docker/testci.war
$ docker-compose down
bash: line 77: docker-compose: command not found
ERROR: Job failed: exit status 1
报这个错的原因是在搭建 gitlab-runner 环境的时候,environment文件夹下的Dockerfile文件中没有配置 docker-compose ,在容器内找不到docker-compose 命令,所以报错,
在gitlab-runner 的 environment 中的 Dockerfile文件中添加 下面
# 安装 Docker Compose
WORKDIR /usr/local/bin
RUN wget https://raw.githubusercontent.com/topsale/resources/master/docker/docker-compose
RUN chmod +x docker-compose
进入容器内部,可以发现
# 进入容器
[root@centOS environment]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
677925b104a0 testci_testci "catalina.sh run" 4 minutes ago Up 4 minutes 0.0.0.0:8080->8080/tcp testci
ee754f5779f8 gitlab_runner_gitlab-runner "/usr/bin/dumb-init …" 37 minutes ago Up 10 minutes gitlab-runner
# 进入 /usr/local/bin
root@ee754f5779f8:/usr/local/bin# pwd
/usr/local/bin
# 已经安装了 compose 命令
root@ee754f5779f8:/usr/local/bin# ls
docker-compose
解决完这个问题,再次运行,发现运行成功
- 在浏览器中输入 172.16.195.134:8080/testci/index.html