最近team内对k8s,docker比较感兴趣,想了解CI/CD相关的内容,我争取了该任务,做了些相关的工作,研究了大概一个礼拜,初步完成了从gitlab代码提交用docker自动发布版本的工作(还未涉及k8s),在此记录

一 涉及到的软件版本

版本

介绍

docker

19.03.8

不知道的不用往下看了

git

2.28.0 windows

分布式版本控制系统

gitlab

12.5.5

一个用于仓库管理系统的开源项目,使用Git作为代码管理工具

gitlab-runner

12.8.0

gitlab提供的持续集成工具

harbor

v2.1.0-rc2

一个用于存储和分发Docker镜像的企业级Registry服务器

服务器环境是centos7 

二 第一步:本地安装git

下载地址Git - Downloading Package

gitlab 自动提交 gitlab cicd 自动发布_gitlab 自动提交

gitlab 自动提交 gitlab cicd 自动发布_docker_02

会有很多步骤的选项,一路next安装。安装完毕,右键可以看到出现了git相关的指令

gitlab 自动提交 gitlab cicd 自动发布_ci/cd_03

三 第二步:在gitlab创建项目,并上传本地代码

我使用的是公司的gitlab仓库,是安装好的,因此不需要安装了。创建gitlab项目

git上传本地代码流程参考:

将本地项目上传到gitlab-CSDN博客

上传成功后如下

gitlab 自动提交 gitlab cicd 自动发布_docker_04

四 安装gitlab-runner,并注册。参照上一篇文章

【gitlab-runner】gitlab-runner安装注册到https的gitlab_为什么gitlab-runner要使用certificates-CSDN博客

五 编写yml文件命令

点击CI/CD configration,会创建yml命令文件,可以编写简单的语句测试下runner是否有效

gitlab 自动提交 gitlab cicd 自动发布_ci/cd_05

gitlab 自动提交 gitlab cicd 自动发布_gitlab 自动提交_06

#定义过程
stages:
  - build //可自定义
  - test
  
#定义job
init5:
  stage: build //定义job的执行阶段
  tags:  //重要,这个标签是指定本job使用哪个标签的runner来执行,可以为空,为空则没有标签的runner会执行
    - idat
  script: //shell脚本,这里到时会用来build java项目,并且用docker打包镜像
    - echo 'init ok' > /etc/gitlab-runner/b.log
    - pwd

testcase:
  stage: test
  tags:
    - idat
  script:
    - echo 'test ok' > /etc/gitlab-runner/c.log

修改之后保存yml,去查看CI/CD界面,可以看到新的pipeline创建了,点进去可以查看到job的执行信息

gitlab 自动提交 gitlab cicd 自动发布_ci/cd_07

gitlab 自动提交 gitlab cicd 自动发布_git_08

gitlab 自动提交 gitlab cicd 自动发布_gitlab 自动提交_09

然后在runner的机器/etc/gitlab-runner可以看到输出的log文件

gitlab 自动提交 gitlab cicd 自动发布_gitlab_10

如此则说明runner运行成功了!

六 打包项目,docker创建镜像并发布

在第五步runner创建成功后,会在runner服务器下载项目的代码,地址在/etc/gitlab-runner/builds/Q_zurexD/0/Hadoop/idap

gitlab 自动提交 gitlab cicd 自动发布_docker_11

我的项目是javaweb项目,可以用java的jar命令打包,因为jar命令只是对文件进行打包,没有编译,因此在提交代码的时候需要将WebContent/WEB-INF/下的class文件提交,打包时进去WebContent目录,使用下面的命令打成war包,打成war放到tomcat的webapp下面

jar -cvf /root/javaweb/apache-tomcat-8.5.42/webapps/idat.war ./*

接下去用docker打包镜像并发布

首先把java需要的环境jdk,tomcat放到指定目录/root/javaweb,结合上面的的war包,tomcat下面是有war包的

gitlab 自动提交 gitlab cicd 自动发布_gitlab 自动提交_12

编写Dockerfile

#创建操作系统环境
FROM centos
#自定义描述
MAINTAINER 682556
#创建容器目录
RUN mkdir -p /opt
#将本地java环境打入容器
ADD java-1.8.0-openjdk-1.8.0.232.b09-0.el8_0.x86_64 /opt/jdk
#将本地tomcat(含war包)环境打入容器
ADD apache-tomcat-8.5.42 /opt/tomcat
#设置java,tomcat环境
ENV JAVA_HOME /opt/jdk

ENV CATALINA_HOME /opt/tomcat

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
#绑定端口。这里端口自定义,且需要在tomcat server.xml文件中也改成相同端口,切记
EXPOSE 8099
#释放目录,这步不一定要用。我在做的时候,在执行/opt/tomcat/bin/catalina.sh命令时,显示权限不够,因此在这释放目录
RUN chmod -R 777 /opt
#启动tomcat
CMD ["/opt/tomcat/bin/catalina.sh","run"]

docker打包镜像

docker build -t idat2 .

docker启动镜像

docker run -d -p 8099:8099 --name idat2 idat2:latest

访问页面

gitlab 自动提交 gitlab cicd 自动发布_gitlab_13

整个第六步需要结合gitlab-runner自动发布,那么将上面的步骤写入yml,就可以实现自动发布

stages:
  - build
  - image
  - run
  
buildwar:
  stage: build
  tags:
    - idat
  only
    - master
  script:
    - echo 'build start' 
    - pwd
    - cd WebContent
	- rm -f /root/javaweb/apache-tomcat-8.5.42/webapps/idat.war
    - jar -cvf /root/javaweb/apache-tomcat-8.5.42/webapps/idat.war ./*
    - echo 'build end'

buildimage:
  stage: image
  tags:
    - idat
  script:
    - echo 'image start' 
	- cd /root/javaweb
	- docker build -t idat2 .
	
runapp:
  stage: run
  tags:
    - idat
  script:
    - docker run -d -p 8099:8099 --name idat2 idat2:latest

自动发布完成!

七 镜像导入私有仓库

官方的registry仓库没有权限控制,可以使用Harbor仓库

Harbor的安装比较简单,下载地址https://github.com/goharbor/harbor/releases

下载后直接解压,修改/root/harbor/harbor.yml文件

gitlab 自动提交 gitlab cicd 自动发布_docker_14

gitlab 自动提交 gitlab cicd 自动发布_gitlab_15

要启动harbor还需要docker-compose的支持,按照下面命令安装

curl -L https://github.com/docker/compose/releases/download/1.27.0/run.sh > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version

安装完成之后,启动harbor,要等几分钟

./install.sh

gitlab 自动提交 gitlab cicd 自动发布_git_16

访问harbor,使用admin/Harbor12345登录

gitlab 自动提交 gitlab cicd 自动发布_ci/cd_17

gitlab 自动提交 gitlab cicd 自动发布_ci/cd_18

镜像导入harbor命令

docker login -u admin -p Harbor12345 10.38.150.64:8090

docker tag idat2:latest 10.38.150.64:8090/library/idat2:latest

docker push 10.38.150.64:8090/library/idat2:latest

docker login harbor时可能报错

gitlab 自动提交 gitlab cicd 自动发布_ci/cd_19

添加网站信任,修改"insecure-registries"属性,将harbor地址添加进去

vi /etc/docker/daemon.json




{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://dockerhub.azk8s.cn", "https://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com/", "https://registry.docker-cn.com"],
  "storage-driver": "overlay2",
  "storage-opts": ["overlay2.override_kernel_check=true"],
  "insecure-registries": ["127.0.0.1/8","10.38.150.64:8090"],
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/var/lib/docker"
}

重启docker服务,重新登录harbor成功

systemctl restart docker

查看harbor,idat2的项目已经上传