Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1)
服务器版本 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: 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 - 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 脚本构建自定义镜像,然后在服务器上拉取并创建相应容器,最后启动容器,完成发布和部署。
本文转自田园里的蟋蟀博客园博客,原文链接:http://www.cnblogs.com/xishuai/p/ubuntu-gitlab-ci-docker-aspnet-core-part-1.html,如需转载请自行联系原作者
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
OpenStack Icehouse neutron-networking 架构介绍
采用了OpenStack中新的网络管理组件(neutron),具体参见 安装指导。上图为该网络部署结构的示意,分为三类节点: 控制节点 负责整个OpenStack机群的管控,由于它不承担kvm虚拟机的实际运行,负载交轻,一般将管理性(仅仅负责调度,监控)的服务部署在其上如 neutron 网络管理服务 nova 计算管理服务 glance 虚拟机映像管理服务 keystone 身份验证服务 horizon OpenStack的web管理服务 rabbitmq 消息队列服务 mysql 数据库 网络节点 为虚拟网络提供DHCP,L2交换,路由,浮动IP安全策略等网络服务。主要运行 neutron openstack的虚拟网络服务 openvswitch 虚拟L2交换 计算节点 nova-compute 实际运行kvm虚拟机,运行受到控制节点的调度 网络 在官方给出的这个部署架构中的网络分为三类 管理网络(红色) OpenStack中的服务通信都通过这个网络进行,一般它与数据网络是分离的,避免由于数据网络的大流量影响到正常的OpenStack服务通信 数据网络(绿色) 虚拟机实例之间的通信...
- 下一篇
openstack libtray
OpenStack packages¶ Distributions release OpenStack packages as part of the distribution or using other methods because of differing release schedules. Perform these procedures on all nodes. Warning Your hosts must contain the latest versions of base installation packages available for your distribution before proceeding further. Note Disable or remove any automatic update services because they can impact your OpenStack environment. Enable the OpenStack repository¶ # apt-get install software-pro...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装