使用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. Redis命令之setbit

    setbit的作用是,对key上存储的字符串,设置或清除指定偏移量上的位(bit). 语法如下: SETBIT key offset value key是要操作的对象的键. offset是操作对象上的 ...

  2. 2020牛客暑期多校训练营(第八场)Game SET

    传送门:Game SET 题意 一套牌有四种属性,每种属性都有三种特征,shapes (one, two, or three), shape (diamond, squiggle, or oval), ...

  3. 【uva 1395】Slim Span(图论--最小生成树+结构体快速赋值 模版题)

    题意:给一个N(N<=100)个点的联通图(无自环和平行边),求苗条度(最大边-最小边的值)尽量小的生成树. 解法:枚举+Kruskal.先从小到大排序边,枚举选择的最小的边. 1 #inclu ...

  4. Codeforces Round #550 (Div. 3) E. Median String (思维,模拟)

    题意:给你两个字符串\(s\)和\(t\),保证\(t\)的字典序大于\(s\),求他们字典序中间的字符串. 题解:我们假设题目给的不是字符串,而是两个10禁止的正整数,那么输出他们之间的数只要把他两 ...

  5. Codeforces Round #177 (Div. 2) B. Polo the Penguin and Matrix (贪心,数学)

    题意:给你一个\(n\)x\(m\)的矩阵,可以对矩阵的所有元素进行\(\pm d\),问能否使得所有元素相等. 题解:我们可以直接记录一个\(n*m\)的数组存入所有数,所以\((a_1+xd)=( ...

  6. constexpr 的来龙去脉

    constexpr 是什么? 关键字 constexpr (constant expression) 是在 C++11 中引入的,并且在 C++14 中进行了优化. constexpr 和 const ...

  7. Leetcode(213)-打家劫舍II

    你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在 ...

  8. VS2010下如何查看类的内存布局

    用VS2010查看类的内存布局,这里用两种方法 (1)MSVC有个隐藏的"/d1"开关,通过这个开关可以查看项目中类的内存布局情况. 修改项目属性,添加"/d1 repo ...

  9. Raven1渗透实战

    Raven1渗透实战 目录: 1.wordpress爆破用户 2.wp-config得到数据库账号密码 3.ssh连接4.pythn提权(sudo python -c 'import pty;pty. ...

  10. range()函数的使用、while循环、for-in循环等

    一.range()函数 用于直接生成一个整数序列 创建range对象的三种方式: (1)range(stop)    创建一个(0,stop)之间的整数序列,步长为1 (2)range(start,s ...