zoukankan      html  css  js  c++  java
  • 使用gitlab构建基于docker的持续集成(三)

    使用gitlab构建基于docker的持续集成(三)


     

     

    构建发布思路:

    1.构建单元测试镜像,上传镜像仓库。
    2.拉取测试镜像,执行单元测试。
    3.构建发布镜像,上传镜像仓库。
    4.使用docker-compose编排发布镜像和数据库镜像,打包发布,我把项目也发布到了gitlab.luna.cn服务器

    aspnetcore 下的dockerfile编写

     

    我的aspnetcore目录结构

     

    dockerfile的编写,参考了dotnet官方的例子,是用分层配置,这样只要写一个dockerfile就可以了。

     

    FROM microsoft/dotnet:2.0-sdk AS build
    WORKDIR /app
    
    # copy csproj and restore as distinct layers
    COPY *.sln .
    COPY User.Api/*.csproj ./User.Api/
    COPY User.Api.UnitTest/*.csproj ./User.Api.UnitTest/
    RUN dotnet restore
    
    # copy everything else and build app
    COPY . .
    WORKDIR /app//User.Api
    RUN dotnet build
    
    
    FROM build AS testrunner
    WORKDIR /app/User.Api.UnitTest
    ENTRYPOINT ["dotnet", "test", "--logger:trx"]
    
    
    FROM build AS publish
    WORKDIR /app/User.Api
    RUN dotnet publish -c Release -o out
    
    FROM microsoft/aspnetcore:2.0 AS runtime
    WORKDIR /app
    ENV ASPNETCORE_URLS http://+:80
    EXPOSE 80
    COPY --from=publish /app/User.Api/out ./
    ENTRYPOINT ["dotnet", "User.Api.dll"]
    
    

    发布docker-compose

    version: '3'
    
    services:
      user.api:
        image: gitlab.luna.cn/lunaselene/findbook.first/master:release
        container_name: user.api
        ports:
          - '8080:80'
        links:
          - mysql-bate
      mysql-bate:
        image: 'mysql/mysql-server:5.7'
        restart: always
        container_name: mysql-bate
        volumes:
          - ./mysql/data:/var/lib/mysql
          - ./mysql/config/my.cnf:/etc/my.cnf
          - ./mysql/init:/docker-entrypoint-initdb.d/
        ports:
           - '3306'
    

    gitlab-ci.yml的编写

     

    gitlab环境变量的设定

     

    安装构建思路,对应的yml文件如下

     

    image: tico/docker
    variables:
      CONTAINER_TEST_IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:test
      CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:release
      DOCKER_DRIVER: overlay2
    
    before_script:
      - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
      #下面是登录远程服务器的设置sshkey操作
       # 其中私有变量$SSH_PRIVATE_KEY 是远程服务器的ssh私匙
       # 我使用的部署gitlab的服务器所以url是gitlab.luna.cn
      - eval $(ssh-agent -s)
      - ssh-add <(echo "$SSH_PRIVATE_KEY")
      - mkdir -p ~/.ssh
      - chmod 700 ~/.ssh
      - ssh-keyscan gitlab.luna.cn > ~/.ssh/known_hosts
      - chmod 644 ~/.ssh/known_hosts
      - ssh -T root@gitlab.luna.cn
    stages:
      - build
      - test
      - release
      - deploy
    
    build:
      stage: build
      script:
       - docker build --target testrunner --pull -t $CONTAINER_TEST_IMAGE .
       - docker push $CONTAINER_TEST_IMAGE
    
    test:
      stage: test
      script:
        - docker pull $CONTAINER_TEST_IMAGE
        - docker run $CONTAINER_TEST_IMAGE
        - docker rm $(docker ps -q -l)
    
    release:
      stage: release
      script:
        - docker build --target runtime  --pull -t $CONTAINER_RELEASE_IMAGE .
        - docker push $CONTAINER_RELEASE_IMAGE
      only:
        - master
    
    deploy:
      stage: deploy
      script:
        - scp -r mysql root@gitlab.luna.cn:/root/deploy
        - scp docker-compose.yml root@gitlab.luna.cn:/root/deploy
        - ssh root@gitlab.luna.cn "docker-compose --f /root/deploy/docker-compose.yml up -d --force-recreate "
        - echo "Deploy to staging server"
      only:
        - master
    

    一些参数的解释

    image

    代表要使用的基础docker镜像,一切构建都是在这个镜像下完成,也就是一个大环境,后面的命令必须要能在这个环境下能执行。
    我指定这个是一个自带docker环境的镜像,它的信息可以到docker hub上查看。

    variables

    自定义变量,后面跟的是自定义的变量,$CI_REGISTRY_IMAGE等变量是gitlab-runner自带的变量。

    before_script

    前置脚本,也就是每个stages运行之前都会执行的命令。

    stages

    定义CI每个步骤,这个步骤是一个执行完才执行下一个的,上一个失败,全部失败。

    关于远程发布ssh的补充

    由于要全自动化发布,必须实现runner所在服务器和远程发布主机的无密登录。
    ssh无密码登录,分为单向和双向,这里用单向的就可以了。
    因为使用的是docker in docker 的方式运行runner,所以秘钥通过gitlab的环境变量进行传递。

    1.远程主机生成ssh秘钥。

    ssh-keygen -t rsa 
    

    命令输完一直回车到完成为止。
    2.远程主机中把公钥设置到authorized_keys。

    cd /root/.ssh
    cat id_rsa.pub > authorized_keys
    

    3.把私钥设置成环境变量。
    私钥设置成环境变量
    4.gitlab-ci.yml中给运行的容器设置runner私钥。

      #下面是登录远程服务器的设置sshkey操作
       # 其中私有变量$SSH_PRIVATE_KEY 是远程服务器的ssh私匙
       # 我使用的部署gitlab的服务器所以url是gitlab.luna.cn
      - eval $(ssh-agent -s)
      - ssh-add <(echo "$SSH_PRIVATE_KEY")
      - mkdir -p ~/.ssh
      - chmod 700 ~/.ssh
      - ssh-keyscan gitlab.luna.cn > ~/.ssh/known_hosts
      - chmod 644 ~/.ssh/known_hosts
      - ssh -T root@gitlab.luna.cn
    

    这样远程服务器的连接就设置完成了。

    提交测试

     

    build

     

     

     

    test

     

     

     

    release

     

     

     

    deploy

     

     

     

    全部通过

     

     

     

    查看发布情况

     

     

     

    本地访问查看

     

     

  • 相关阅读:
    部分网络加载预训练模型代码实现
    数据不平衡处理方法
    面试题目汇总
    多线程和多进程
    数据结构知识点总结
    GBDT和XGBoost的区别
    GBDT和随机森林的区别
    机器学习-特征处理
    一篇写得很好的关于lct的博客
    Count and Say 2014/10/23
  • 原文地址:https://www.cnblogs.com/mmry/p/9000719.html
Copyright © 2011-2022 走看看