Ubuntu GitLab CI Docker ASP.NET Core 2.0 自动化发布和部署(1)
相关博文:
- Ubuntu 简单安装和配置 GitLab
- Ubuntu 简单安装 Docker
- Ubuntu Docker 简单安装 GitLab
- Ubuntu Docker 安装和配置 GitLab CI 持续集成
服务器版本 Ubuntu 16.04 LTS。
经过上面四篇博文中的相关安装和配置,我们主要完成了两个容器的创建和运行:gitlab
和gitlab-runner
(GitLab 站点和 GitLab CI 服务):
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
696d559ce382 gitlab/gitlab-runner:latest "/usr/bin/dumb-ini..." 5 days ago Up 25 minutes gitlab-runner
ff95f354200d gitlab/gitlab-ce:latest "/assets/wrapper" 7 days ago Up 6 days (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8888->22/tcp gitlab
本篇博文目的:使用 GitLab CI 脚本编译 ASP.NET Core 2.0 程序,然后将编译后的文件传输到服务器上,最后使用 SSH 连接服务器,并运行程序,完成发布和部署。
简单来说,就是我们每次使用git push
提交完代码,自动完成发布和部署。
我们再理一下实现上面目的关键点:
- 创建一个 ASP.NET Core 2.0 示例程序
- 完善并正确的
.gitlab-ci.yml
文件配置 - GitLab CI 服务器使用
ssh
连接到测试服务器(在 Docker 中) - 使用
scp
进行服务器之间的文件传输 - 使用
supervisor
进行站点程序的进程管理
我花了很长时间配置第三步,其实最后解决也很简单,当然都是马后炮的结论?,下面我们分别来进行操作。
1. 创建 ASP.NET Core 2.0 示例程序
我自己创建示例程序:http://40.125.206.47/team/hwapp
注:服务器快过期了,大家可以随便搞?。
自己创建的话,也很简单,官方教程:https://www.microsoft.com/net/core#linuxubuntu
我再搬运下命令(安装 .NET Core 2.0,并创建 ASP.NET Core 2.0 示例程序):
$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
$ sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
$ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list'$ sudo apt-get update
$ sudo apt-get install dotnet-sdk-2.0.0$ dotnet new webapi -o hwapp
$ cd hwapp
最后,绑定下 ASP.NET Core 2.0 程序端口:
public class Program
{public static void Main(string[] args){BuildWebHost(args).Run();}public static IWebHost BuildWebHost(string[] args) =>WebHost.CreateDefaultBuilder(args).UseKestrel() //add code.UseUrls($"http://*:8088") //add code.UseStartup<hwapp.Startup>().Build();
}
2. .gitlab-ci.yml 文件配置
我的.gitlab-ci.yml
文件配置(http://40.125.206.47/team/hwapp/blob/master/.gitlab-ci.yml):
image: microsoft/aspnetcore-build
stages:- build- deploy_dev
before_script:# Install ssh-agent if not already installed, it is required by Docker.# (change apt-get to yum if you use a CentOS-based image)- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'# Run ssh-agent (inside the build environment)- eval $(ssh-agent -s)# Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store# error: https://gitlab.com/gitlab-examples/ssh-private-key/issues/1# - echo "$SSH_PRIVATE_KEY_DEV"- ssh-add <(echo "$SSH_PRIVATE_KEY_DEV")# For Docker builds disable host key checking. Be aware that by adding that# you are suspectible to man-in-the-middle attacks.# WARNING: Use this only with the Docker executor, if you use it with shell# you will overwrite your user's SSH config.- mkdir -p ~/.ssh- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
build_job:stage: buildonly:- masterscript:- dotnet restore- dotnet build
deploy_dev_job:stage: deploy_devenvironment:name: developmentonly:- masterscript:# 发布程序并部署运行- dotnet publish -c Release --output bin/publish- scp -r bin/publish root@$DEPLOY_SERVER_DEV:/home/xishuai/wwwroot/hwapp- ssh root@$DEPLOY_SERVER_DEV "supervisorctl restart hwapp && curl http://localhost:8088/api/values"
上面是我最终调试成功后的.gitlab-ci.yml
文件配置,其实整个的构建和发布流程,从上面的配置中都可以看出。
这里记录下一些东西:
配置一开始的image
,设置的是我们用于构建的镜像(也就是说后面所有的脚本执行,都是在基于这个镜像创建的容器中),如果不设置的话,默认使用的是我们一开始配置 GitLab CI 填写的 Docker Image,也可以手动编辑vim /srv/gitlab-runner/config/config.toml
进行修改,我这里使用的是microsoft/aspnetcore-build
镜像,只用于 ASP.NET Core 应用程序的编译和构建。
stage
可以理解为台阶,每走一步相当于job
,当然,这里的台阶可以走很多步,需要注意的是,每上一个台阶或者每走一步,都必须基于上一个台阶或上一步执行成功,before_script
执行在这些步骤之前,可以理解为准备工作。
environment
将执行的job
归纳为哪一种执行环境,你可以设置开发环境和正式环境,我们可以通过通过后台进行查看:
3. GitLab CI 服务器使用 SSH 连接到测试服务器
什么意思呢?就是我们需要在 GitLab CI 构建环境中,使用 SSH 连接到测试服务器,这样我们才可以做接下来的一些操作。
官方配置:SSH keys when using the Docker executor
.gitlab-ci.yml
示例配置:
before_script:# Install ssh-agent if not already installed, it is required by Docker.# (change apt-get to yum if you use a CentOS-based image)- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'# Run ssh-agent (inside the build environment)- eval $(ssh-agent -s)# Add the SSH key stored in SSH_PRIVATE_KEY_DEV variable to the agent store- ssh-add <(echo "$SSH_PRIVATE_KEY_DEV")# For Docker builds disable host key checking. Be aware that by adding that# you are suspectible to man-in-the-middle attacks.# WARNING: Use this only with the Docker executor, if you use it with shell# you will overwrite your user's SSH config.- mkdir -p ~/.ssh- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'# In order to properly check the server's host key, assuming you created the# SSH_SERVER_HOSTKEYS variable previously, uncomment the following two lines# instead.# - mkdir -p ~/.ssh# - '[[ -f /.dockerenv ]] && echo "$SSH_SERVER_HOSTKEYS" > ~/.ssh/known_hosts'
在进行配置之前,我们需要理一下这个步骤,要不然思路容易混乱,会造成一些问题,可以参考这篇文章:Fixing 'Enter passphrase for /dev/fd/63' in a Gitlab CI job
需要强调一点:别在 GitLab CI 容器中进行 SSH 配置,因为 CI 构建脚本执行在另外的容器中,并且这个容器是动态进行创建的,也没办法在这个动态容器中进行配置(指的是手动生成 RSA 密钥)。
所以,我们只能手动生成 RSA 密钥,然后强制添加到容器中的 SSH 配置中(通过 RSA 密钥内容)。
配置步骤:
首先,在任何一台服务器上,创建 RSA 无密码的密钥:
$ ssh-keygen -t rsa -P ''
$ cat /root/.ssh/id_rsa
然后复制 RSA 密钥内容,添加到/Project/Settings/Pipelines
的Secret variables
配置中(命名为SSH_PRIVATE_KEY_DEV
):
这里需要特别注意,复制内容为(包含开头和结尾的注释信息):
-----BEGIN RSA PRIVATE KEY-----
xxxxxxx
-----END RSA PRIVATE KEY-----
我一开始复制没有包含注释信息,然后就一直报下面的错误:
错误代码:
$ ssh-add <(echo "$SSH_PRIVATE_KEY_DEV")
Enter passphrase for /dev/fd/63: ERROR: Job failed: exit code 1
这里的$SSH_PRIVATE_KEY_DEV
,就是上面我们在Secret variables
中,添加的 RSA 密钥内容。
错误信息就是说需要输入 RSA 密钥的密码,但我创建的确实是无密码的 RSA 密钥,也就是说这个密钥是无效的,我被这个问题折磨了好几天?,其他人的记录:
- "Enter passphrase for /dev/fd/63" error(有我的回复?)
- "Enter passphrase for /dev/fd/63" error
- https://gitlab.com/gitlab-examples/ssh-private-key/-/jobs/376082(受这个兄弟的启发)
配置好这一步之后,然后重新测试下,我们就可以看到下面的执行信息了:
$ ssh-add <(echo "$SSH_PRIVATE_KEY_DEV")
Identity added: /dev/fd/63 (/dev/fd/63)
接着我们需要将这个 RSA 密钥对应的公钥,上传到需要连接到的服务器(也就是我们的测试服务器),命令如下:
$ ssh-copy-id root@40.125.201.75
到此,GitLab CI 中 SSH 的配置基本上完成了,你可以在.gitlab-ci.yml
中添加连接脚本,进行测试:
- ssh root@$DEPLOY_SERVER_DEV "ls && cd /"
一开始,我们说到使用scp
进行服务器之间的文件传输,因为scp
可以基于 SSH 连接进行传输文件,所以我们直接进行文件传输了,示例代码:
- scp -r bin/publish root@$DEPLOY_SERVER_DEV:/home/xishuai/wwwroot/hwapp
scp
命令参考:http://www.runoob.com/linux/linux-comm-scp.html
4. 使用 Supervisor 进行站点程序的进程管理
可以参考之前的文章:Ubuntu 安装和使用 Supervisor(进程管理)
这里贴一下,supervisorctl
的常用命令:
命令 | 说明 |
---|---|
supervisorctl stop program_name | 停止某个进程 |
supervisorctl start program_name | 启动某个进程 |
supervisorctl restart program_name | 重启某个进程 |
supervisorctl stop all | 停止全部进程 |
supervisorctl reload | 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程 |
supervisorctl update | 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启 |
5. 最终效果
Pipelines 管道(地址:http://40.125.206.47/team/hwapp/pipelines)
Build_Job 构建任务(地址:http://40.125.206.47/team/hwapp/-/jobs/113)
Deploy_Dev_Job 发布和部署任务(地址:http://40.125.206.47/team/hwapp/-/jobs/115)
写在最后:
- GitLab CI & ASP.NET Core 2.0 发布和部署(完成):使用 CI 脚本编译程序,然后将编译后的文件传输到服务器上,最后运行程序,完成发布和部署。
- GitLab CI & ASP.NET Core 2.0 & Docker 发布和部署(下篇):项目中添加
Dockerfile
文件,使用 CI 脚本构建自定义镜像,然后在服务器上拉取并创建相应容器,最后启动容器,完成发布和部署。
Ubuntu GitLab CI Docker ASP.NET Core 2.0 自动化发布和部署(1)相关推荐
- Centos7 Docker Jenkins ASP.NET Core 2.0 自动化发布和部署
写在前面 Docker一直很火热,一直想把原本的Jenkins自动部署工具搬到Docker上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了dotnet core 2.0 的正式发布,升级 ...
- 边缘化搭建 DotNet Core 2.1 自动化发布和部署(下)
写在前面 本篇文章是上一篇边缘化搭建 DotNet Core 2.1 自动化发布和部署(上)的后续操作,本文主要讲解如何开启Docker Remote API,开启Remote API后的权限安全问题 ...
- Docker ASP.NET Core 2.0 微服务跨平台实践
本篇博文的目的:在 Mac OS 中使用 VS Code 开发 ASP.NET Core 2.0 应用程序,然后在 Ubuntu 服务器配置 Docker 环境,并使用 Docker 运行 Consu ...
- ASP.NET Core 2.0 MVC 发布部署--------- ASP.NET Core 发布的具体操作
ASP.NET Core 发布的具体操作 下面使用C# 编写的ASP.NET Core Web项目示例说明发布的全过程. 1.创建项目 选择"文件" > "新建&q ...
- ASP .NET Core 2.0 MVC 发布到 IIS 上以后 无法下载apk等格式的文件
ASP .NET Core MVC 发布到 IIS 上以后 无法下载apk等格式的文件 使用.NET Core MVC创建了一个站点,其他文件可以下载,但是后来又需求,就把手机端的apk合适的文件上 ...
- 边缘化搭建DotNet Core 2.1 自动化构建和部署环境
写在前面 写这篇文章的缘由是由于笔者的对新兴技术方向有所追求,但个人资产有限,只能容许购买一台阿里云低配1核2G服务器.服务器上搭建了 Centos7 & Docker & Jenki ...
- 边缘化搭建DotNet Core 2.1 自动化构建和部署环境(上)
写在前面 写这篇文章的缘由是由于笔者的对新兴技术方向有所追求,但个人资产有限,只能容许购买一台阿里云低配1核2G服务器.服务器上搭建了 Centos7 & Docker & Jenki ...
- Razor Page–Asp.Net Core 2.0新功能 Razor Page介绍
Razor Page介绍 前言 上周期待已久的Asp.Net Core 2.0提前发布了,一下子Net圈热闹了起来,2.0带来了很多新的特性和新的功能,其中Razor Page引起我的关注,作为web ...
- ASP.NET Core 2.0 特性介绍和使用指南
ASP.NET Core 2.0 发布日期:2017年8月14日 ASP.NET团队宣布ASP.NET Core 2.0正式发布,发布Visual Studio 2017 15.3支持ASP.NET ...
最新文章
- [ Python ] PIL
- 薪酬管理的特点和注意事项[转]
- 交叉编译openwrt php,构建 openwrt 交叉编译工具链
- 自学python(一)
- 实时事件日志记录和聚合的平台——Sentry
- Oracle入门(十四.7)之良好的编程习惯
- python tkinter 安装_如何为Python安装tkinter?
- java properties读取缓存_java 读取 properties文件的各种方法
- [Design-Pattern]工厂模式
- 725 - Division
- 平台允许同时在线人数 显示_《女神异闻录4G》Steam同时在线人数创新纪录
- 关于layui的日期和时间组件LayData时间选择器使用时一闪而过
- Spark核心概念与案例拆解
- Linux系统使用git命令制作patch补丁详解
- Codeforces1040B Shashlik Cooking
- mysql中like与rlike_Hive中rlike,like,notlike区别及使用
- Flutter从相册选择图片并显示出来,上传到服务器
- 时尚html输入框,12款经典时尚的HTML5应用
- 线程池的核心线程会销毁吗?
- 软工网络15个人作业3——案例分析
热门文章
- Java在Windows下导出xml文件到Linux服务器上
- jsp,div 限制字数,超出部分用省略号代替
- 查看商品图片,鼠标悬浮图片放大js实现
- 剑指offer之求1+2+...+n
- 终于,我读懂了所有Java集合——map篇
- GAN-代码实现资料整合(1)
- 剑指offer(刷题61-65)--c++,Python版本
- adguard没有核心 core no_面试官:线程池如何按照core、max、queue的执行顺序去执行?...
- Ubuntu修改界面的大小
- 一个简单JavaAgent的实现