Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(2)
上一篇:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1)
服务器版本 Ubuntu 16.04 LTS。
本篇博文目的:项目中添加Dockerfile文件,使用 CI 脚本构建自定义镜像,推送到 Docker 私有仓库,然后在服务器上拉取镜像并创建相应容器,最后启动容器,完成发布和部署。
实现上面目的,大概有三种实现方式:
- GitLab Runner 不运行在 Docker 容器中:Executor 选择
shell(本地运行),然后在本服务器上安装 .NET Core 和 Docker 环境,.gitlab-ci.yml中执行dotnet编译发布和docker构建发布脚本,将构建的镜像推送到 Docker 私有仓库,然后 SSH 连接到服务器,拉取镜像并创建相应容器,最后启动容器,完成发布和部署。 - GitLab Runner 运行在 Docker 容器中:Executor 选择
shell(GitLab Runner 容器中运行),然后进入 GitLab Runner 容器,在上面安装 .NET Core 和 Docker 环境,.gitlab-ci.yml中执行dotnet编译发布和docker构建发布脚本,后面同上操作。 - GitLab Runner 运行在 Docker 容器中:Executor 选择
docker(指定镜像容器中运行),需要自定义构建一个包含 .NET Core 和 Docker 环境的镜像,构建脚本执行在自定义镜像容器中,.gitlab-ci.yml中执行dotnet编译发布和docker构建发布脚本,后面同上操作。
上面三种方式,最简单的是第一种,第二种和第三种比较类似,实现稍微复杂点,我也没有配置成功,下面分别说下。
1. GitLab Runner 运行在 Docker 容器中
第二种和第三种实现方式,放在一块说,如果 Executor 选择shell,然后我们需要在 GitLab Runner 容器中配置编译环境,但这样会产生一个问题,就是如果我们是升级 GitLab Runner 的时候,需要重新配置编译环境,实际情况是,我进入容器docker exec -it gitlab-runner bash,并没有安装成功 .NET Core 和 Docker 环境(各种服务器中没出现的问题,而且速度非常慢),其实,还有一种方式,就是在.gitlab-ci.yml中执行安装 .NET Core 和 Docker 环境的脚本(检查是否安装),不过,编写是有些问题,这个我没进行尝试。
如果 Executor 选择docker,其实,这样会嵌套很多容器,首先服务器上运行 GitLab Runner 容器,然后在此容器内,运行另外一个构建容器,然后在此容器内,执行构建和发布操作,因为 GitLab Runner 在每次构建的时候,会创建和运行一个新的构建容器,所以,我们不能直接在这个容器中,配置 .NET Core 和 Docker 环境,也不能在.gitlab-ci.yml中执行安装,因为每次都会覆盖之前的操作,唯一的解决方式,就是自定义构建一个包含 .NET Core 和 Docker 环境的镜像文件,然后每次构建使用它进行创建对应容器,执行构建和发布脚本即可。
这里说下,自定义构建一个包含 .NET Core 和 Docker 环境的镜像文件,两种方式:
docker build -t 139.219.65.81:5000/xishuai-gitlab-ci-build .:在Dockerfile文件编写安装环境脚本。docker commit microsoft-aspnetcore 139.219.65.81:5000/xishuai-gitlab-ci-build:使用一个容器,然后在容器中安装环境,最后基于这个容器,创建一个自定义镜像文件
第一种方式,我没有进行尝试,第二种方式尝试了下,我使用microsoft/aspnetcore镜像作为基础镜像(800M 左右),然后在其创建的容器中安装 Docker 环境,速度非常慢,而且有时候报各种奇怪的错误,如果安装成功了,左右构建的自定义镜像文件,也非常的大。
这两种方式,我最后都没有采用,最后使用的是下面最简单的方式。
2. GitLab Runner 不运行在 Docker 容器中(Executor 选择 Shell)
如果我们不使用 Docker 安装和运行 GitLab Runner,就得手动进行安装和配置下 GitLab Runner。
安装命令:
$ sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-linux-amd64
然后进行给予其权限:
$ sudo chmod +x /usr/local/bin/gitlab-runner
接着就可以进行注册 GitLab Runner 了,命令:
$ sudo gitlab-runner register
示例配置:

配置好之后,我们需要添加一个用于跑 GitLab Runner 的gitlab-runner用户,命令:
$ sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
然后指定 GitLab Runner 执行的用户和工作目录,命令:
$ sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
配置好之后,我们可以从配置文件中,查看相关配置信息:
$ cat /etc/systemd/system/gitlab-runner.service
[Unit]
Description=GitLab Runner
After=syslog.target network.target
ConditionFileIsExecutable=/usr/bin/gitlab-ci-multi-runner
[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/bin/gitlab-ci-multi-runner "run" "--working-directory" "/home/gitlab-runner" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--syslog" "--user" "gitlab-runner"
Restart=always
RestartSec=120
[Install]
WantedBy=multi-user.target
上面工作完成之后,就可以启动 GitLab Runner 了,命令:
$ sudo gitlab-runner start
然后,我们就可以在项目中看到 GitLab Runner 了,示例:

另外,我们还需要做一些其他工作,来保证 GitLab Runner 可以正常运行。
两台服务器需要配置的环境:
- GitLab Runner 服务器:.NET Core 2.0、Docker、Docker 私有仓库(或者其他服务器)、SSH
- 测试服务器:Docker
首先,我们需要创建一个 Docker 私有仓库,用于存放程序生成的镜像,这个最好是配置在一个单独的服务器,配置详见:Ubuntu Docker Registry 搭建私有仓库
通过下面两个连接,查看 Docker 私有仓库中的镜像:
然后,我们需要把 GitLab Runner 服务器中的gitlab-runner账户,添加到docker用户组中,命令:
$ sudo usermod -aG docker gitlab-runner
否则会报如下错误:

然后,我们在 GitLab Runner 服务器中,切换到gitlab-runner用户下,配置 SSH,命令:
$ su gitlab-runner
$ ssh-keygen -t rsa -P ''
$ ssh-copy-id root@139.219.69.172
139.219.69.172是测试服务器的 IP 地址,如果不进行这样配置,SSH 连接的时候,会报如下错误:

原因是,GitLab Runner 在执行脚本的时候,会切换到gitlab-runner用户下,我们在root账户下配置 SSH,是无效的。
以上工作完成之后,GitLab Runner 执行编译脚本,基本上执行是没有问题了,我们在示例项目中添加.gitlab-ci.yml配置文件,示例:
stages:
- build
- deploy_dev
build_job:
stage: build
only:
- master
script:
- dotnet restore
- dotnet build
deploy_dev_job:
stage: deploy_dev
environment:
name: development
only:
- master
script:
# 发布程序并部署运行
- dotnet publish -c Release --output bin/publish
- docker build -t $GITLAB_SERVER:5000/hwapp .
- docker push $GITLAB_SERVER:5000/hwapp
- ssh root@$DEPLOY_SERVER_DEV "docker pull $GITLAB_SERVER:5000/hwapp && docker run -d -p 5001:5001 $GITLAB_SERVER:5000/hwapp"
build_job执行效果:

deploy_dev_job执行效果:


然后,我们在测试服务器上,就可以看到创建和运行的容器了:

浏览器打开http://139.219.110.30:5001/api/values,查看效果:

参考资料:
- Manual installation and configuration on GNU/Linux
- Registering Runners
- Using SSH keys
- GitLab CI 自动部署 netcore web api 到 Docker
Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(2)的更多相关文章
- Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1)
相关博文: Ubuntu 简单安装和配置 GitLab Ubuntu 简单安装 Docker Ubuntu Docker 简单安装 GitLab Ubuntu Docker 安装和配置 GitLab ...
- Centos7 & Docker & Jenkins & ASP.NET Core 2.0 自动化发布和部署
写在前面 Docker一直很火热,一直想把原本的Jenkins自动部署工具搬到Docker上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了dotnet core 2.0 的正式发布,升级 ...
- [亲测]ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问
前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...
- [亲测]七步学会ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问
前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...
- ASP.NET Core 2.0 MVC 发布部署--------- Ubuntun 16.04 X64 具体操作
.Net Core 部署到Ubuntu 16.04 中的步骤 1.安装工具 1.apache 2..Net Core(dotnet-sdk-2.0) 3.Supervisor(进程管理工具,目的是服务 ...
- 无法下载apk等格式的文件的解决方案---ASP .NET Core 2.0 MVC 发布到IIS上以后无法下载apk等格式的文件的解决方案
ASP .NET Core MVC 发布到 IIS 上以后 无法下载apk等格式的文件 使用.NET Core MVC创建了一个站点,其他文件可以下载,但是后来又需求,就把手机端的apk合适的文件上 ...
- ASP .NET Core 2.0 MVC 发布到 IIS 上以后 无法下载apk等格式的文件
ASP .NET Core MVC 发布到 IIS 上以后 无法下载apk等格式的文件 使用.NET Core MVC创建了一个站点,其他文件可以下载,但是后来又需求,就把手机端的apk合适的文件上 ...
- ASP.NET Core 2.0 MVC 发布部署--------- ASP.NET Core 发布的具体操作
ASP.NET Core 发布的具体操作 下面使用C# 编写的ASP.NET Core Web项目示例说明发布的全过程. 1.创建项目 选择“文件” > “新建” > “项目”. 在“添加 ...
- ASP.NET Core 2.0 MVC 发布部署--------- CentOS7 X64 具体操作
.Net Core 部署到 CentOS7 64 位系统中的步骤 1.安装工具 1.apache 2..Net Core(dotnet-sdk-2.0) 3.Supervisor(进程管理工具,目的是 ...
随机推荐
- 一.CPU,Mem过高怎么办 --这是个开始
本身是名Java开发,在做了一段大数据的工作后,猛然间想对Java做个总结. 从未写过技术博客,一时不知如何开始,思虑后,暂且以自己喜爱的方式来开篇. 工作中遇到过CPU或内存过高的问题,解决步骤: ...
- Python网络数据采集6-隐含输入字段
Python网络数据采集6-隐含输入字段 selenium的get_cookies可以轻松获取所有cookie. from pprint import pprint from selenium imp ...
- Python处理csv文件
Python处理csv文件 CSV(Comma-Separated Values)即逗号分隔值,可以用Excel打开查看.由于是纯文本,任何编辑器也都可打开.与Excel文件不同,CSV文件中: 值没 ...
- 教学小例子:简易的webSevrer
HttpListener 流利简单的API static void Main() { using (var server = new SimpleWebServer("http://loca ...
- 用于NLP的CNN架构搬运:from keras0.x to keras2.x
本文亮点: 将用于自然语言处理的CNN架构,从keras0.3.3搬运到了keras2.x,强行练习了Sequential+Model的混合使用,具体来说,是Model里嵌套了Sequential. ...
- 自己动手封装一个url参数解释器( ghostWuUrlParser.js )
ghostWuUrlParser.js的作用是分析一段url中的查询参数,即: '?'号后面的 键值对参数. ghostWuUrlParser.js 使用说明: ghostWuUrlParser( ' ...
- [STM32F429-DISCO-uCosiii]3.uCOSIII 移植
uCOSiii的结构比uCOSii看上去是清晰了不少,也比较有条理,所以呢,移植不是让人感觉很乱.在工程中添加如下目录和文件 与CPU相关的文件都集中在uC-CPU文件夹中.这部分有很多是底层的实现, ...
- mybatis 详解(十一)------ mybatis和spring整合
想要整合mybatis和spring,那么我们首先要知道这两个框架是干嘛的,对于mybatis我们前面几篇博客已经有了很详细的介绍,我们通过加载mybatis-configuration.xml 文件 ...
- java IO流整理
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- C# 开机自启动和最小化托盘显示
C# 开机自启动和最小化托盘显示 一. C# 开机自启动 C# 开机自启动,这个功能是大多数服务型软件很常用一个功能,但是这个功能确是不 太好做,花了两天想对策.不过最终呢,结果还是很满意的 ...