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

gitlab
docker
aspnetcore
持续集成

构建发布思路:

1.构建单元测试镜像,上传镜像仓库。

2.拉取测试镜像,执行单元测试。

3.构建发布镜像,上传镜像仓库。

4.使用docker-compose编排发布镜像和数据库镜像,打包发布,我把项目也发布到了gitlab.luna.cn服务器

aspnetcore 下的dockerfile编写

 

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的编写

 

安装构建思路,对应的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

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

提交测试

 
 
 
 
 
 
 

使用gitlab构建基于docker的持续集成(三)的更多相关文章

  1. 使用gitlab构建基于docker的持续集成(二)

    使用gitlab构建基于docker的持续集成(二) gitlab docker aspnetcore Centos配置gitlab镜像并且启动 Centos配置防火墙 windows上访问gitla ...

  2. 使用gitlab构建基于docker的持续集成(一)

    使用gitlab构建基于docker的持续集成(一) gitlab docker aspnetcore 持续集成 开篇 整体环境规划 准备工作 CA证书 虚拟机系统:安装Centos7.3 3.设置C ...

  3. 【持续集成】GitLab CI + Docker 实现持续集成

    GitLab CI + Docker 实现持续集成 一.持续集成(Continuous Integration, CI)的基本概念 概述 在传统软件的开发中,代码的集成工作通常是在所有人都将工作完成后 ...

  4. Docker+Jenkins持续集成环境(5): android构建与apk发布

    项目组除了常规的java项目,还有不少android项目,如何使用jenkins来实现自动构建呢?本文会介绍安卓项目通过jenkins构建的方法,并设计开发一个类似蒲公英的app托管平台. andro ...

  5. 学习笔记——Maven实战(四)基于Maven的持续集成实践

    Martin的<持续集成> 相信很多读者和我一样,最早接触到持续集成的概念是来自Martin的著名文章<持续集成>,该文最早发布于2000年9月,之后在2006年进行了一次修订 ...

  6. Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现

    前面我们已经通过jenkins+docker搭建了基本的持续集成环境,实现了服务的自动构建和部署,但是,我们遇到一个问题,jenkins构建出来的镜像部署后,需要通过ip:port去访问,有什么更好的 ...

  7. Maven实战(四)——基于Maven的持续集成实践

    Martin的<持续集成> 相信非常多读者和我一样.最早接触到持续集成的概念是来自Martin的著名文章<持续集成>.该文最早公布于2000年9月,之后在2006年进行了一次修 ...

  8. Docker+Jenkins持续集成

    Docker+Jenkins持续集成 使用etcd+confd实现容器服务注册与发现   前面我们已经通过jenkins+docker搭建了基本的持续集成环境,实现了服务的自动构建和部署,但是,我们遇 ...

  9. Ansible的roles标准化与Jenkins持续集成(三)

    Ansible的roles标准化与Jenkins持续集成(三) 链接:https://pan.baidu.com/s/1A3Iq3gGkGS27L_Gt37_I0g 提取码:ncy2 复制这段内容后打 ...

随机推荐

  1. 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)

    题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...

  2. 2018 ccpc吉林 The Tower

    传送门:HDU - 6559 题意 在一个三维空间,给定一个点和他的三维速度,给定一个圆锥,问这个点最早什么时候能撞上圆锥. 题解 本来一直想着怎么求圆锥的方程,然后....队友:这不是二分吗!然后问 ...

  3. Codeforces Round #547 (Div. 3) D. Colored Boots (贪心,模拟)

    题意:有两个字符串,两个字符串中的相同字符可以相互匹配,\(?\)可以和任意字符匹配,输出最大匹配的字符数量和它们分别两个字符串中的位置. 题解:很容易贪心,我们先遍历第一个字符串,然后在第二个字符串 ...

  4. Linux系统编程【3.1】——编写ls命令

    ls命令简介 老规矩,直接在终端输入:man ls (有关于man命令的简介可以参考笔者前期博客:Linux系统编程[1]--编写more命令) 可以看到,ls命令的作用是显示目录中的文件名,它带有可 ...

  5. CF1474-C. Array Destruction

    CF1474-C. Array Destruction 题意: 题目给出一个长度为\(2n\)的正整数序列,现在问你是否存在一个\(x\)使得可以不断的进行如下操作,直到这个序列变为空: 从序列中找到 ...

  6. servlet相关知识点

    一.servlet的生命周期 Servlet(Sever Applet),全称是Java Servlet,是用java编写的服务器程序.Servlet是指任何实现了这个Servlet接口的类. ser ...

  7. codefforces 877B

    B. Nikita and stringtime limit per test2 secondsmemory limit per test256 megabytesinputstandard inpu ...

  8. Node.js 文件上传 cli tools

    Node.js 文件上传 cli tools byte stream 断点续传 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  9. MDN All In One

    MDN All In One https://github.com/mdn/ https://wiki.mozilla.org/MDN MDN 要凉了 https://developer.mozill ...

  10. js 检测屏幕分辨率

    js 检测屏幕分辨率 class screenChecker { constructor() { this.screen = window.screen; this.fullscreen = fals ...