Ubuntu amp;amp; GitLab CI amp;amp; Docker amp;amp; ASP.NETnbs

上一篇: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 RunnerAfter=syslog.target network.targetConditionFileIsExecutable=/usr/bin/gitlab-ci-multi-runner[Service]StartLimitInterval=5StartLimitBurst=10ExecStart=/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=alwaysRestartSec=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 私有仓库中的镜像:

  • http://139.219.69.172:5000/v2/_catalog

  • http://139.219.69.172:5000/v2/hwapp/tags/list

然后,我们需要把 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_devbuild_job:  stage: build  only:    - master  script:    - dotnet restore    - dotnet builddeploy_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

原文地址:http://www.cnblogs.com/xishuai/p/ubuntu-gitlab-ci-docker-aspnet-core-part-2.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

POJ2411-Mondriaan's Dream【状态压缩dp】

正题 题目链接:http://poj.org/problem?id2411 题目大意 有nmnm的矩阵,用1212的方块填满有多少种方法。 解题思路 用1表示竖着的块的上面,其他都是0。 我们先计算出所有单排合法状态(横着的都是连续的偶数)。 然后我们用sta…

JavaFX拖放事件

一、拖拽事件 DRAG_ENTERED_TARGET 拖拽进入node(包括进入子node) DRAG_ENTERED 拖拽进入node DRAG_EXITED_TARGET 拖拽退出node(包括退出子node) DRAG_EXITED 拖拽退出node DRAG_DROPPED 拖拽放下源node DRAG_DO…

新版《Windows Sysinternals实战指南》,读书积赞活动

新书《Windows Sysinternals实战指南》即将上市。该本由Sysinternals创始人、Windwos内核技术专家Mark Russinovich 与 Windows专家Aaron Margosis联手编著,详细介绍了Sysinternals每款工具的独到功能,并用较多篇幅深入介绍了如何通过几款重量级工具优化…

Bladex生成Swagger的方法

一、在启动类中添加如下代码:(目的是为了打印输出swagger的地址等) 注解:Slf4j 实现接口:CommandLineRunner 依赖注入: Autowiredprivate Environment environment;Overridepublic void run(String... str…

了解spark计算模型

简介 在集群背后,有一个非常重要的分布式数据架构,即弹性分布式数据集(resilient distributed dataset,RDD),它是逻辑集中的实体,在集群中的多台机器上进行了数据分区。通过对多台机器上不同RDD…

P1955-[NOI2015]程序自动分析【并查集,离散化】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1955 题目大意 给出若干个关系,xi≠xj or xixjxi≠xjorxixj,然后求是否全部都满足。 解题思路 首先由于数据较大,所以我们先离散化,然后用并查集。…

如何理解事件溯源

在近期举行的PHPDublin见面会上,来自DynamicRes的架构师Barry Sullivan被问到“什么是事件溯源”,作为对这个问题的回答,他在博客上写下了这篇文章,详细解释了什么是事件溯源以及事件溯源有哪些好处。以下内容翻译自Barry的博客&a…

JavaFX键盘事件

一、键盘事件 KeyPressed 按键按压 KeyReleased 按键释放 KeyTyped 按键类型 二、用法 node.setOnXX(event->{//do something });node.addEventFilter(KeyEvent.XX, event -> {//do something});

java中日期处理的一些工具方法

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 前言 现在是2022年4月16日15:35:14!忙里偷闲,直接来看方法吧,写完文章继续去改Bug: 1.计算两个日期之间相差的天数 /*** param stratTime 开始时间* p…

POJ1456-Supermarket【并查集】

正题 题目链接:http://poj.org/problem?id1456 题目大意 有n个货物,有不同的过期时间,过期了就卖不掉了,每个物品卖掉有不同的价值,每天只能卖一个货物,求最大价值。 解题思路 我们可以先排序一下价值 我们用并查…

ASP.NET Core 运行原理解剖[5]:Authentication

在现代应用程序中,认证已不再是简单的将用户凭证保存在浏览器中,而要适应多种场景,如App,WebAPI,第三方登录等等。在 ASP.NET 4.x 时代的Windows认证和Forms认证已无法满足现代化的需求,因此在ASP.NET Core…

bladex自定义分页

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 前言 现在是2022年4月16日21:44:05!今天分享一个代码段,个人觉得还是比较有参考性的。 后端使用框架:bladex前端使用技术:AVue功能:自定义分…

JavaFX滚动事件

一、滚动事件 SCROLL 滚动 SCROLL_STARTED 滚动开始 SCROLL_FINISHED 滚动结束 二、用法 node.setOnXX(event->{//do something });node.addEventFilter(ScrollEvent.XX, event -> {//do something});

bladex中自定义分页的写法~

“大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂”前言现在是2022年4月16日21:44:05!今天分享一个代码段,个人觉得还是比较有参考性的。后端使用框架:bladex前端使用技术:AVue功能:自定义分…

POJ1733,jzoj1779-Parity game(奇偶游戏)【带权并查集,离散化】

正题 POJ题目链接:http://poj.org/problem?id1733 jzoj题目链接:https://jzoj.net/senior/#main/show/1779 题目大意 长度为ll的01串,n" role="presentation" style="position: relative;">nn个答案,表示一段区间内有偶数或奇数个…

OpenID Connect:OAuth 2.0协议之上的简单身份层

OpenID Connect是什么?OpenID Connect(目前版本是1.0)是OAuth 2.0协议(可参考本人此篇:OAuth 2.0 / RCF6749 协议解读)之上的简单身份层,用 API 进行身份交互的框架,允许客户端根据授权服务器的认证结果最终确认用户的身份&#x…

JavaFX触屏事件

一、Touch 接触 TOUCH_PRESSED 按压 TOUCH_MOVED 移动 TOUCH_RELEASED 释放 TOUCH_STATIONARY 长按 二、Scroll 滚动 SCROLL 滚动 SCROLL_STARTED 滚动开始 SCROLL_FINISHED 滚动结束 三、Swipe 单指滑动 SWIPE_LEFT 单指滑动向左 SWIPE_RIGHT 单指滑动向右…

P2014-选课【树形dp,背包】

正题 评测记录:https://www.luogu.org/problemnew/show/P2014 题目大意 有n门课程&#xff0c;每个课程有不同的学分和前修课&#xff0c;必须学了前修课才可以学这门。 只能修m门&#xff0c;求最大学分 解题思路 背包的思想&#xff0c;套一个树形dp。 code #include<…

JS的Date.setMonth()方法坑

一、场景复现 业务需求&#xff0c;查询时间需要设置为前一个月。 //辅助代码 Date.prototype.format function(fmt) { //author: meizz var o { "M" : this.getMonth()1, //月份 "d" : this.getDate(), …

一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系

我们知道&#xff0c;不同肤色的人外貌差别很大&#xff0c;而双胞胎的辨识很难。有意思的是Web服务器/Web容器/Web应用程序服务器/反向代理有点像四胞胎&#xff0c;在网络上经常一起出现。本文将带读者对这四个相似概念如何区分。 1.1. Web服务器概念与基本原理 1.1.1. Web服…