docker+gitlab+gitlabCI+harbor+rancher+nexus

构建docker镜像自动化部署

1、安装maven、安装docker

maven、docker网上安装教程很多,这里不演示

坑1:配置daemon
{
 "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"],
 "insecure-registries": ["后面的harbor地址:端口"]
}

2、安装nexus私有库(推送自己的包到maven,如果不需要可以不安装)

2.1、neuxs安装教程不演示

2.2、maven配置

找到maven安装目录conf/settings.xml

项目中pom也要配置,注意id一致(如果你是微服务,这个服务有api、sdk、server,server作为启动端,那么你需要把打包文件挂到最外层,如下面第二张图配置)

<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
  <servers>
        <server>
            <id>a-releases</id>
            <username>admin</username>
            <password>mima!</password>
        </server>
        <server>
            <id>a-snapshots</id>
            <username>admin</username>
            <password>mima!</password>
        </server>
        <server>
            <id>nexus-central</id>
            <username>admin</username>
            <password>mima!</password>
        </server>
    </servers>
    <mirrors>        
        <mirror>
            <id>nexus-central</id>
            <name>Nexus Central</name>
            <url>http://ip:port/repository/maven-public/</url>
            <mirrorOf>*,!getui-nexus</mirrorOf>
        </mirror>
    </mirrors>     

    <profiles>
      <profile>    
        <id>bbc</id>
        <repositories>
          <repository>
          <id>central</id>
          <name>Nexus</name>
          <url>http://ip:port/repository/maven-public/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
          </repository>
        </repositories>
      </profile>
    </profiles>
    <activeProfiles>
      <activeProfile>a</activeProfile>
    </activeProfiles>  

    <pluginGroups>
      <pluginGroup>com.spotify</pluginGroup>
    </pluginGroups>
    <localRepository>/home/test/maven-registory</localRepository>
</settings>
<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <outputDirectory>
                        ../target/
                    </outputDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>



<distributionManagement>
        <repository>
            <id>a-releases</id>
            <name>release</name>
            <url>http://ip:port/repository/maven-releases/</url>
        </repository>
        <snapshotRepository>
            <id>a-snapshots</id>
            <name>snapshots</name>
            <url>http://ip:port/repository/maven-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

3、安装gitlab+gitlab-runner(注册过程TAG和ci文件一致)

参照基于Docker GitLab 搭建 GitLab runner 搭建 GitLab CI/CD - 简书

坑2:基于ci配置,build阶段基于maven:3.3-jdk-8,image阶段镜像是docker in docker模式(需要runner开启一个配置,可以查看官网)结果:runner配置文件改 privileged = true

Docker executor | GitLab

 

build阶段需要每次拉取maven打包,如果不想每次都打所有包,需要把gitlab-runner内部maven挂载到宿主机,如果想使用自己的settings.xml配置,则需要把maven环境映射宿主机,如下:

注意!!! 如果使用了settings,映射时请注意<localRepository>标签内容

1.进入gitlab-runner目录,gitlab-runner/config/conf.toml

2.修改使用的runners,volums映射宿主机maven,仓库和配置

volumes = ["/cache", "/home/test/maven-registory:/home/test/maven-repository:rw", "/home/test/testauto/apache-maven-3.3.9/conf/settings.xml:/usr/share/maven/conf/settings.xml"]

docker in docker模式缺点,宿主机的maven仓库需要提前放好包,不然后续还会拉取远程;

!经过改进,build阶段使用shell模式,image阶段使用docker模式,详情见最后第6步

4、安装harbor

  wget -P /home/horbor https://github.com/goharbor/harbor/releases/download/v2.1.0/harbor-offline-installer-v2.1.0.tgz


  cd /home/harbor

  tar -zxvf ./harbor-offline-installer-v2.1.0.tgz

  cp ./harbor.yml.tmpl ./harbor.yml

  vim ./harbor.yml #配置http或者https,建议https 因为上线要用;配置密码

  ./prepare
  ./install.sh

  #密码在common/config/db/env

5、安装rancher

网上很多文章,没有什么坑,这里不演示

6、gitlab-ci.yml与dockerFile配置(网上教程都是pom.xml配置,ci和docker能引用,我这里不行,所以使用脚本读取配置)

${}是在gitlab变量里面配置的

第一种:build与image阶段都是gitlab-runner,docker模式
# 定义CI执行的阶段,这里可以自己根据情况定义多少个阶段
stages:
  - compile
  - build
  - run


# 定义全局变量
variables:
  IMAGE: "bbc-captcha"
  PROJECT_VERSION: "1.0"
  # 这里定义了Maven的jar包存放地址,与我们构建maven私服的时候设置的存放地址一致
  MAVEN_REPO: "/.m2"
  # 这里定义了打包成功后的Docker镜像名称,每一次提交代码后构建成功的镜像名称都是唯一的
  IMAGE_FULL_NAME: ${ALIYUN_URL}/${ALIYUN_NAMESPACE}/${ALIYUN_REGISTRY}:${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHA}
  DOCKER_TLS_CERTDIR: ''

build:
  # 当前阶段的执行镜像,这是我们自己构建的镜像
  image: maven:3.3-jdk-8
  # 属于上面定义的哪一个阶段
  stage: compile
  # 是否允许失败,允许的话如果当前阶段运行失败还会继续执行下一个阶段
  allow_failure: false
  # 运行脚本
  script:
    - export PROJECT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
    - echo "PROJECT_VERSION name is $PROJECT_VERSION"
    - echo "开始maven clean package $PROJECT_VERSION"
    - mvn -Dmaven.repo.local=$MAVEN_REPO clean package -Dmaven.test.skip=true
    - echo "$PROJECT_VERSION" >> $PROJECT_VERSION.version
  # 因为是Maven编译,所以会有Jar包产物,这里定义产物的过期时间
  artifacts:
    name: $IMAGE
    expire_in: 7 days
    paths:
      - target/*.jar
      - ./*.version

  # 设置在dev的runner上面执行
  tags:
    - java

build image:
  image: docker:18.09.7
  services:
    - docker:18.09.7-dind
  stage: build
  script:
    # 这里的变量会自动获取你当前推送代码的gitlab用户和密码以及仓库地址
    - FILENAME=$(ls target/*.jar | head -n 1)
    - PROJECT=${FILENAME%.jar}
    # 这些属性在gitlab配置
    - docker login --username=${USER_NAME} ${ADDR_IP} --password ${PASS_WORD}
    - PROJECT_VERSION=$(ls *.version | head -n 1)
    - PROJECT_VERSION=${PROJECT_VERSION%.version}
    - echo "PROJECT_VERSION = $PROJECT_VERSION"
    - echo "登录harbor成功"
    - echo "Project name is $PROJECT"
    # 这里的变量就是我们全局配置定义的了
    - docker build --build-arg JAR_FILE=/$FILENAME -t $IMAGE .
    - echo "IMAGE is ------   $IMAGE"
    - docker tag $IMAGE:latest ${ADDR_IP}/bbc/$IMAGE:$PROJECT_VERSION
    - docker push ${ADDR_IP}/bbc/$IMAGE:$PROJECT_VERSION
    - echo "上传jar镜像包到harbor成功,开始删除target 和镜像"
    - rm -rf target
    - docker rmi $IMAGE:latest
  # 设置在dev的runner上面执行
  tags:
    - java
Dockerfile文件内容如下:

FROM primetoninc/jdk:1.8

WORKDIR /bbc

ARG JAR_FILE

COPY ${JAR_FILE} ./app.jar
EXPOSE 9999

# -c为清除以前启动的数据
ENTRYPOINT java -jar *.jar
 第二种(推荐):gitlab-runner一阶段shell,二阶段docker,这样一阶段使用maven使用了宿主机环境,本地不需要手动放包,会自动拉取映射,后续也不会一直拉取远程
build:
  # 属于上面定义的哪一个阶段
  stage: compile
  # 是否允许失败,允许的话如果当前阶段运行失败还会继续执行下一个阶段
  allow_failure: false
  # 运行脚本
  script:
    - export PROJECT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
    - echo "PROJECT_VERSION name is $PROJECT_VERSION"
    - echo "开始maven clean package"
    - mvn clean package -Dmaven.test.skip=true
    - echo "$PROJECT_VERSION" >> $PROJECT_VERSION.version
  # 因为是Maven编译,所以会有Jar包产物,这里定义产物的过期时间
  artifacts:
    name: $IMAGE
    expire_in: 1 days
    paths:
      - target/*.jar
      - ./*.version

必须:需要在linux配置环境 vim /etc/profile,里面配置改为自己的路径

JAVA_HOME=/opt/jdk1.8.0_371
PATH=/opt/jdk1.8.0_371/bin:$PATH
export JAVA_HOME PATH
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
export MAVEN_HOME=/home/test/testauto/apache-maven-3.3.9
export PATH=${PATH}:${MAVEN_HOME}/bin

source /etc/profile 生效

必须:重新配置gitlab-runner,将环境挂载到gitlab-runner中

which java与which mvn可以查看路径,取/bin前面的部分,如下-v配置启动

docker run -d --name gitlab-runner --restart always \
  -v /docker/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /home/test/testauto/apache-maven-3.3.9:/home/test/testauto/apache-maven-3.3.9 \
  -v /opt/jdk1.8.0_371:/opt/jdk1.8.0_371 \
  gitlab/gitlab-runner:latest

必须:docker exec -it gitlab-runner bash 进入gitlab-runner配置环境

docker exec -it gitlab-runner bash

#以下都是再容器内,没有退出

#安装vim

apt-get install vim

vim /etc/profile

加入如下3行配置

########

JAVA_HOME=/opt/jdk1.8.0_371
MAVEN_HOME=/home/test/testauto/apache-maven-3.3.9
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH

#########

#生效

source /etc/profile

#检测

mvn -v

java -version

显示版本则成功

!!!必须:使用第二种,务必把maven settings.xml中的<localRepository>标签去掉

到此就搭建好了,然后就可以推送到gitlab,去harbor检查镜像,rancher使用镜像(rancher可以使用端口映射,不过进入docker ps没有显示出来,不用担心直接使用)

###########如果你严格按照我的步骤,理论不会有问题,如果有问题,欢迎留言#########

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值