GitHub Actions构建镜像并部署服务

目的

通过GitHub的Actions来(白嫖)部署.Net服务到阿里云服务器。

环境准备

需要一个阿里云服务器并且该服务器还安装了docker环境,如果环境安装不清楚可以查看之前的文章。

创建镜像仓库

在阿里云的容器镜像服务中,创建一个镜像仓库用来存储我们测试的镜像,这里我提前创建仓库为myexample,地址为registry.cn-hangzhou.aliyuncs.com/zrng/myexample。

准备项目文件

本文主要讨论GitHub的Action功能,所以项目文件直接使用之前示例代码,在Github创建仓库my-example,该仓库的代码使用之前的代码(仓库地址为:https://gitee.com/AZRNG/my-example)

隐私信息配置

在指定的仓库中,选择Settings=>Secrets=>Actions

315b729e72ac336b9fda0dabf4c35d65.png
img

点击右上的新建就可以创建想要保存的隐私配置信息

a7cbc4dfb8a8a690400b1520f5e90ad6.png
img

这里我保存了一下镜像仓库的账号密码等信息。

25a68bdf599e2d88c22a468780d3bd70.png
img

仓库脚本配置

在仓库的根目录新建工作流文件.github/workflows/dotnet.yml(也可以在Actions选项卡中新建),我们将每次提交的项目生成测试镜像,在dotnet.yml中写下面内容

# 工作流名称
name: Dockeron:push: # 推送的时候触发branches: [ "main" ] # 推送的分支# Publish semver tags as releases.tags: [ 'v*.*.*' ]pull_request:branches: [ "main" ]env:# 仓库地址REGISTRY: registry.cn-hangzhou.aliyuncs.comIMAGE_NAME: zrng/myexampleIMAGE_TAG: latestjobs:build:runs-on: ubuntu-latestpermissions:contents: readpackages: write# This is used to complete the identity challenge# with sigstore/fulcio when running outside of PRs.id-token: writesteps:# 将远程仓库中的源代码领取到workfile自动化构建脚本运行的服务器- name: Checkout repositoryuses: actions/checkout@v3 # Login against a Docker registry except on PR# https://github.com/docker/login-action- name: login to ${{ env.REGISTRY }}if: github.event_name != 'pull_request'uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c # 用于登录docker以便我们后续上传镜像到自己的镜像仓库with:registry: ${{ env.REGISTRY }}username: ${{ secrets.USERMAME }} # 镜像仓库用户名password: ${{ secrets.PASSWORD }} # 镜像仓库密码# 生成和推送镜像  阿里云镜像仓库推送有问题# # https://github.com/docker/build-push-action# - name: Build and push Docker image#   id: build-and-push # 构建docker镜像,推送到自己的docker镜像仓库#   uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a#   with:#     registry: ${{ env.REGISTRY }}#     username: ${{ secrets.USERMAME }} # 镜像仓库用户名#     password: ${{ secrets.PASSWORD }} # 镜像仓库密码#     push: ${{ github.event_name != 'pull_request' }}#     tags: ${{env.IMAGE_NAME}}:${{env.IMAGE_TAG}}.${{ github.run_id }}.${{ github.run_number }} #动态变量镜像TAG 使用github运行job和jobid设置tag#     context: . # 相对以远程仓库根路径的dockerfile的路径#     file: ./NetByDocker/Dockerfile # 指定Dockerfile- name: Build the Docker imagerun: |docker version# 登录阿里云镜像仓库docker login --username=${{ secrets.USERMAME }} --password=${{ secrets.PASSWORD }} registry.cn-hangzhou.aliyuncs.com# 使用Dockerfile构建镜像  ${{env.IMAGE_TAG}}.${{ github.run_id }}.${{ github.run_number }}docker build . --file NetByDocker/Dockerfile --tag registry.cn-hangzhou.aliyuncs.com/zrng/myexample:${{env.IMAGE_TAG}} --tag registry.cn-hangzhou.aliyuncs.com/zrng/myexample:${{ github.run_number }}# 推送镜像到镜像仓库docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{env.IMAGE_TAG}}docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.run_number }}# 列出所有镜像    - name: Docker Images Lst run: docker images

本来在推送镜像的时候我们可以直接build-and-push来推送,但是推送到阿里云仓库有问题,我百度说是阿里云仓库必须写前面镜像地址等信息,所以没成功,所以换用其他方式来实现

上文中涉及的dockerfile文件内容如下

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["NetByDocker/NetByDocker.csproj", "NetByDocker/"]
RUN dotnet restore "NetByDocker/NetByDocker.csproj"  # 还原项目的Nuget包
COPY . .
WORKDIR "/src/NetByDocker"
RUN dotnet build "NetByDocker.csproj" -c Release -o /app/build # 在发布模式下生成项目。 生成工件将写入中间映像的 app/build/ 目录。FROM build AS publish
RUN dotnet publish "NetByDocker.csproj" -c Release -o /app/publish # 在发布模式下发布项目。 已发布的捆绑将写入最终映像的 app/publish/ 目录。FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "NetByDocker.dll"] # 启动

在我们提交代码并推送中可以去github的Actions选项卡中查看

9ed1a75d81f59f2c1e1eb8fbce6c4dd7.png
img

因为一些笨笨的操作,错误了好多次

29a913ef8454e698b2718e0dce8de555.png
img

然后再去阿里云镜像仓库查看是否有我们推送上去的镜像

88b1ff5fb8bc7735b046cd0f271517bb.png
img

已经存在,说明我们生成镜像并推送的步骤成功了,也可以通过以下命令拉取到

docker pull registry.cn-hangzhou.aliyuncs.com/zrng/myexample:latest

部署镜像

我们需要让推送成功后,在我们的阿里云服务器上拉取镜像并启动,那么先增加服务器的地址、账号、密码、端口等变量

f5f854392ff31f7f648556a9d7b626ae.png
img

再修改dotnet.yml文件,在最后追加内容

# 列出所有镜像    
- name: Docker Images Lst 
run: docker images- name: executing remote ssh commands using password
uses: appleboy/ssh-action@master
with:host: ${{ secrets.SERVERHOST }}username: ${{ secrets.SERVERUSERNAME }}password: ${{ secrets.SERVERPASSWORD }}port: ${{ secrets.SERVERPORT }}script: docker run --name netsample -d -p 8002:80 registry.cn-hangzhou.aliyuncs.com/zrng/myexample

我本来是按照上面这方案走的,结果还得考虑到停止并删除容器,以及删除镜像拉取最新的镜像,所以我索性直接使用docker-compose去处理了,我在服务器的/root/net目录,放了一个docker-compose文件,内容如下

version: '3.4'services: netsample:container_name: netsampleimage: registry.cn-hangzhou.aliyuncs.com/zrng/myexamplerestart: alwaysenvironment: - ASPNETCORE_ENVIRONMENT=Productionnetworks: - my-bridgeports: - "8002:80"networks: my-bridge:driver: bridge

然后在dotnet.yml文件后追加

- name: executing remote ssh commands using passworduses: appleboy/ssh-action@masterwith:host: ${{ secrets.SERVERHOST }}username: ${{ secrets.SERVERUSERNAME }}password: ${{ secrets.SERVERPASSWORD }}port: ${{ secrets.SERVERPORT }}script: cd /root/net;docker-compose pull && docker-compose  up -d;

然后我提交新增加的代码,等工作流跑结束后

9f4e2728263bfede016e16257aadc715.png
img

访问我们项目的swagger(http://IP:8002/swagger/index.html)页面(前提是阿里云服务器的端口安全组已经设置),既可以看到下面的效果

f400bbcec88dd96b9dd0decbb9019112.png
img

登录服务器后查看镜像版本,也是我们刚刚推送的镜像。

总结

本文完整介绍了如何使用Github Actions做CI&CD,将ASP.NET Core 6.0 程序的main分支打包并部署到阿里云Linux服务器。

如果想在每次dev提交代码后自动生成服务(不再推送镜像仓库),那么可以稍稍修改上面的脚本使用appleboy/ssh-action@master进入某一个目录(提前拉取好项目的目录),然后构建镜像生成容器。

资料

本文完整代码可以查看仓库:https://gitee.com/AZRNG/my-example

完整的dotnet.yaml文件可以查看:https://gitee.com/AZRNG/my-example/blob/master/.github/workflows/dotnet.yml

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

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

相关文章

20165232 缓冲区溢出漏洞实验

缓冲区溢出漏洞实验 实验准备 实验环境需要32位的Linux系统,需要下载安装一些用于编译 32 位 C 程序的软件包,代码如下: $ sudo apt-get update$ sudo apt-get install -y lib32z1 libc6-dev-i386$ sudo apt-get install -y lib32readline-gp…

Atcoder 084D - Small Multiple(最短路径+思维)

分析&#xff1a;这题脑洞新奇...居然是最短路...将0到k-1看做k个点&#xff0c;第t个点向(10*t0,1,2...,9)%k连一条长度为0,,1,2,..,9的边&#xff0c;然后枚举s1,2,...,9,算出所有从s到0的最短路&#xff0c;答案就是最短路s的最小值。 1 #include<iostream>2 #include…

Blazor学习之旅(5)数据绑定

【Blazor】| 总结/Edison Zhou大家好&#xff0c;我是Edison。最近在学习Blazor做全栈开发&#xff0c;因此根据老习惯&#xff0c;我会将我的学习过程记录下来&#xff0c;一来体系化整理&#xff0c;二来作为笔记供将来翻看。本篇&#xff0c;我们来了解下在Blazor中数据是如…

chrome开启touch屏幕点击事件

2019独角兽企业重金招聘Python工程师标准>>> 在chrome浏览器输入 chrome://flags/#top-chrome-md 找到属性 UI Layout for the browsers top chrome 选择Hybrid&#xff0c;重启chrome&#xff0c;如下图&#xff1a; 转载于:https://my.oschina.net/swingcoder/blo…

Linux服务器重启后crs_stat -t 命令无法正常使用以及解决思路

前提&#xff1a;在Linux系统中安装ASM&#xff0c;安装完ASM和Oracle数据库时都是正常使用的&#xff0c;但在重启服务器后Oracle相关命令不识别。1、[gridudevasm:/home/grid]$crsctl status res -t -bash: crsctl: command not found2、查看环境变量是否正常&#xff0c;命令…

python 打开某个exe_python定时检查启动某个exe程序(如果exe挂了)

详见代码如下&#xff1a;import threadingimport timeimport osimport subprocessdef get_process_count(imagename):p os.popen(tasklist /FI "IMAGENAME eq %s" % imagename)return p.read().count(imagename)def timer_start():t threading.Timer(120,watch_fu…

Google发布了Tensorflow Lite,用于移动电话的神经网络库

Google的工程副总Dave Burke宣布了一个专门针对移动电话而优化的Tensorflow新版本。\\这一新的软件库称为Tensorflow Lite&#xff0c;允许开发人员在用户的移动电话上实时地运行人工智能应用。据Burke介绍&#xff0c;该库在设计上力求更快和更小的同时&#xff0c;依然支持最…

4. ZooKeeper 基本操作

ZooKeeper的数据模型及其API支持以下九个基本操作&#xff1a; 操作描述create在ZooKeeper命名空间的指定路径中创建一个znodedelete从ZooKeeper命名空间的指定路径中删除一个znodeexists检查路径中是否存在znodegetChildren获取znode的子节点列表getData获取与znode相关的数据…

微软正式发布Azure Functions 2.0

微软正式发布Azure Functions的第二个版本&#xff0c;这是一个事件驱动的、按需计算的Azure平台服务。与版本1相比&#xff0c;新版本的Azure Functions包含的多项特性使开发人员可以更轻松地构建可伸缩的无服务器应用程序。2016年初&#xff0c;微软首次推出Azure Functions预…

CSS-下拉导航条

Web网站中很多时候都会出现下拉导航条&#xff0c;有的是通过CSS实现&#xff0c;有的通过JavaScript插件实现&#xff0c;其实CSS实现起来比较简单,先来看一个简版的下拉菜单: Html代码通过ul列表实现: 123456789101112131415161718<ul class"nav"> <li>…

#UnityTips# 2017.11.14

hi&#xff0c;all。最近比较忙&#xff0c;所以更新也比较慢了。 今天就来和大家分享一个小Tip&#xff0c;它是关于UGUI的坑的。 使用过UGUI的朋友们都知道&#xff0c;Canvas的渲染方式有三种&#xff1a; Screen Space OverlayScreen Space CameraWorld Space其中后两者都需…

java 复制excel_Java 复制Excel工作表

本文归纳了关于Java如何复制Excel工作表的方法&#xff0c;按不同复制需求&#xff0c;可分为&#xff1a;1. 复制工作表1.1 在同一个工作簿内复制工作表1.2 在不同工作簿间复制工作表2. 复制指定单元格数据对于复制方法copy()&#xff0c;这里简单整理了一个表格&#xff0c;其…

Blazor学习之旅(4)数据共享

【Blazor】| 总结/Edison Zhou大家好&#xff0c;我是Edison。前几天没有发布本篇就发布了第五篇&#xff0c;属于操作失误哈&#xff0c;这次把第四篇补上&#xff01;本篇&#xff0c;我们来了解下在Blazor中数据是如何共享的&#xff0c;组件之间又该如何传递参数。关于Blaz…

# 20172307 2018-2019-1 《程序设计与数据结构》第5周学习总结

20172307 2018-2019-1 《程序设计与数据结构》第5周学习总结 教材学习内容总结 查找 1.线性查找&#xff1a;从该列表头开始依次比较每一个值&#xff0c;直至找到该目标元素。2.二分查找法&#xff1a;二分查找是从排序列表的中间开始查找&#xff0c;如果没有在那个中间元素则…

IBM 的大型机 z Systems 引入 Go 语言

据 cbronline 报道&#xff0c;IBM 正把 Go 语言运用到旗下的大型机上。 IBM 将开源的 Go 语言引入到 z Systems 大型机后&#xff0c;可以给用户多一个的选择&#xff0c;即在大型机上使用 Linux 或基于 Go 的应用&#xff0c;同时也使大型机更加灵活。Go 语言在高并发的网络应…

WPF-10 逻辑树和可视化树

我们在WPF-03 资源之Resources结尾中介绍逻辑树和可视化树的基本概念&#xff0c;我们这节来介绍这两棵树逻辑树&#xff08;Logical Tree&#xff09;逻辑树是由每个控件的节点组成&#xff0c;本质上就是XAML文件中的UI元素&#xff0c;我们可以通过LogicalTreeHelper类提供的…

国产车崛起粉碎德日工业神话

由于二战战败&#xff0c;德国一大批顶尖人才被美苏瓜分&#xff0c;战败国地位和人才断层导致德国工业基本是第二次工业革命的产物&#xff0c;专精于机械、化工等传统行业&#xff0c;并有巴斯夫、拜尔、大众、戴姆勒、宝马等一批世界级企业。不过&#xff0c;德国世界级的IT…

java hibernate 分页查询_4 Hibernate HQL查询,分页查询

/*** HQL查询的一个例子*/public static void hql(){Session s null;try{s HibernateUtil.getSeesion();//final String hql "from User as u where u.name?";final String hql "from User as u where u.name:name";final Query query s.createQuery…

Linux -sed

sed &#xff0c;查找sed -n /root/p passwd #列出passwd中有root的行 sed -nr /ot/p passwd #sed -r grep -E 都是进行脱意 sed -nr /0{2}/p passwd #匹配两次o的 sed -nr /root|bus/p passwd #匹配root 或者bus的 sed -n 2p passwd # 查找指定的行sed -n 2,5p passwd # 查找…

node安装问题

1.最好安装到默认路径&#xff0c;手贱安到了D盘&#xff0c;升级npm各种出错。 明明升级成功&#xff0c;查看版本时&#xff0c;确显示依然是老的版本。 原因&#xff1a;升级的是C盘的node_modules中的npm&#xff0c;执行时确是D盘node自带的npm&#xff0c;不知道为啥。。…