Docker(三) docker通过gitlab部署CICD

一、 部署gitlab

1.1 拉取gitlab镜像

# gitlab-ce为稳定版本,后面不填写版本则默认pull最新latest版本
# 注意需要配置镜像加速器,不然会非常慢
docker pull gitlab/gitlab-ce

1.2 运行gitlab镜像

docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /opt/gitlab/config:/etc/gitlab -v /opt/gitlab/log:/var/log/gitlab -v /opt/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce

# -d:后台运行
# -p:将容器内部端口向外映射
# --name:命名容器名称
# -v:将容器内数据文件夹或者日志、配置等文件夹挂载到宿主机指定目录

1.3 配置

# gitlab.rb文件内容默认全是注释
vim /opt/gitlab/config/gitlab.rb
# 配置内容如下:

# 配置http协议所使用的访问地址,不加端口号默认为80
external_url 'http://192.168.6.21'

# 配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = '192.168.6.21'
gitlab_rails['gitlab_shell_ssh_port'] = 222 # 此端口是run时22端口映射的222端口
# 重启gitlab容器
docker restart gitlab

1.4 若发生502报错

docker exec -it gitlab bash # 进入容器内部
gitlab-ctl restart sidekiq
gitlab-ctl hup unicorn

二、 CI

GitLab-CI/CD是GitLab的一套内置的工具,主要实现了对程序开发的持续化集成、连续发布、自动化部署等功能。

以下引用官方文档进行介绍:

持续集成的工作原理是将小的代码块推送到Git存储库中托管的应用程序代码库中,并且每次推送时,都要运行脚本管道来构建,测试和验证代码更改,然后再将其合并到主分支中。

持续交付和部署包括进一步的CI,可在每次推送到存储库默认分支时将应用程序部署到生产环境。

这些方法使您可以在开发周期的早期发现错误和错误,从而确保部署到生产环境的所有代码均符合为应用程序建立的代码标准。

CI(continuous intergration)持续集成
持续集成:编写代码时,完成了一个功能后,立即提交代码到Git仓库中,将项目重新的构建并且测试。

1.快速发现错误。
2.防止代码偏离主分支。

2.1 Runner 搭建

Runner是CI/CD中必不可少一个组件,它是我们持续化集成的实际操作者,当我们通过GitLab Service端发起操作时,实际都是分配到各个Runner服务器进行执行,Runner可以在任意服务器中部署然后再Service端中进行注册。

#1.为了方便操作,请先进入到root权限
sudo su

#2.下载安装包文件
curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

#3.添加权限
chmod +x /usr/local/bin/gitlab-runner

#4.新建一个操作用户
useradd --comment 'gitlab-runner' --create-home gitlab-runner --shell /bin/bash

#5.安装
#注意: --working-directory 是runner实际执行目录,所有从service端发起的请求命令,都会到该目录下进行执行。
gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner

#6.启动
gitlab-runner start
  • 常用命令

    gitlab-runner stop 停止服务
    gitlab-runner start 启动服务
    gitlab-runner restart 重启服务
    
    gitlab-runner list #查看各个 Runner 的状态
    gitlab-runner verify    #此命令检查注册的runner是否可以连接,但不验证GitLab服务是否正在使用runner。 --delete 删除
    gitlab-runner register  #默认交互模式下使用,非交互模式添加 --non-interactive
    
    gitlab-runner unregister   #该命令使用GitLab取消已注册的runner。
    	#使用令牌注销
    	gitlab-runner unregister --url http://gitlab.example.com/ --token t0k3n
    
    	#使用名称注销(同名删除第一个)
    	gitlab-runner unregister --name test-runner
    
    	#注销所有
    	gitlab-runner unregister --all-runners
    

因为gitlab-runner可能会用到maven,docker,git,所以需要提前安装好这些东西

yum install java-1.8.0-openjdk* -y
yum install git
# 安装docker略
usermod -aG docker gitlab-runner  # 保证可以使用docker
sudo -u gitlab-runner -H docker info # 验证是否有效
# 安装docker-compose  略
# 安装maven
yum -y install maven 
mvn -v  #查看maven版本

# 配置aliyun镜像
vim /etc/maven/settings.xml
# mirrors节点下添加(注意不能有tab键)
    <mirrors>
        <mirror>
            <id>alimaven</id>
            <mirrorOf>central</mirrorOf>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
        </mirror>

        <mirror>
            <id>repo1</id>
            <mirrorOf>central</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://repo1.maven.org/maven2/</url>
        </mirror>

        <mirror>
            <id>repo2</id>
            <mirrorOf>central</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://repo2.maven.org/maven2/</url>
        </mirror>
    </mirrors>

2.2 注册Runner

gitlab-runner register

会要求输入gitlab的url和Token.
查找过程如下:
进入仓库->settings->CI/CD,找到Runner Settings这一项,点击Expend,即可在Setup a specific Runner manually这项中找到。

2.3 样例测试

2.3.1 新建maven-tomcat项目

下方为pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cicd.test</groupId>
    <artifactId>cicd_test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>cicd-test</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.3.2 创建.gitlab-ci.yml

stages:
  - test

test_job:
  stage: test
  script:
    - echo hello hi
    - mvn clean
    - mvn package
    - cp target/cicd-test.war docker/cicd-test.war
    - docker-compose down
    - docker-compose up -d --build
    - docker rmi $(docker images -qf "dangling=true")
  tags:
    - cicd-test
  only:
    - master

2.3.3 编写Dockerfile文件

在根目录下新建docker文件夹,在docker文件夹下创建Dockerfile

FROM daocloud.io/library/tomcat:8.5.15-jre8
COPY cicd-test.war /usr/local/tomcat/webapps

2.3.4 编写docker-compose.yml文件

在根目录下创建

version: "3.1"
services:
  testci:
    build: docker
    restart: always
    container_name: testci
    ports:
     - 8080:8080

三、 CD

CD(持续交付,持续部署)

持续交付:将代码交给专业的测试团队去测试

持续部署:将测试通过的代码,发布到生产环境

3.* 利用jenkins

转到(https://blog.skyemperor.top/archives/jenkins%E9%85%8D%E5%90%88gitee%E9%83%A8%E7%BD%B2cicd)


hhhhh