当前位置:   article > 正文

GitHub Actions构建镜像并部署服务

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中写下面内容

  1. # 工作流名称
  2. name: Docker
  3. on:
  4.   push: # 推送的时候触发
  5.     branches: [ "main" ] # 推送的分支
  6.     # Publish semver tags as releases.
  7.     tags: [ 'v*.*.*' ]
  8.   pull_request:
  9.     branches: [ "main" ]
  10. env:
  11.   # 仓库地址
  12.   REGISTRY: registry.cn-hangzhou.aliyuncs.com
  13.   IMAGE_NAME: zrng/myexample
  14.   IMAGE_TAG: latest
  15. jobs:
  16.   build:
  17.     runs-on: ubuntu-latest
  18.     permissions:
  19.       contents: read
  20.       packages: write
  21.       # This is used to complete the identity challenge
  22.       # with sigstore/fulcio when running outside of PRs.
  23.       id-token: write
  24.     steps:
  25.       # 将远程仓库中的源代码领取到workfile自动化构建脚本运行的服务器
  26.       - name: Checkout repository
  27.         uses: actions/checkout@v3 
  28.       # Login against a Docker registry except on PR
  29.       # https://github.com/docker/login-action
  30.       - name: login to ${{ env.REGISTRY }}
  31.         if: github.event_name != 'pull_request'
  32.         uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c # 用于登录docker以便我们后续上传镜像到自己的镜像仓库
  33.         with:
  34.           registry: ${{ env.REGISTRY }}
  35.           username: ${{ secrets.USERMAME }} # 镜像仓库用户名
  36.           password: ${{ secrets.PASSWORD }} # 镜像仓库密码
  37.       # 生成和推送镜像  阿里云镜像仓库推送有问题
  38.       # # https://github.com/docker/build-push-action
  39.       # - name: Build and push Docker image
  40.       #   id: build-and-push # 构建docker镜像,推送到自己的docker镜像仓库
  41.       #   uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a
  42.       #   with:
  43.       #     registry: ${{ env.REGISTRY }}
  44.       #     username: ${{ secrets.USERMAME }} # 镜像仓库用户名
  45.       #     password: ${{ secrets.PASSWORD }} # 镜像仓库密码
  46.       #     push: ${{ github.event_name != 'pull_request' }}
  47.       #     tags: ${{env.IMAGE_NAME}}:${{env.IMAGE_TAG}}.${{ github.run_id }}.${{ github.run_number }} #动态变量镜像TAG 使用github运行job和jobid设置tag
  48.       #     context: . # 相对以远程仓库根路径的dockerfile的路径
  49.       #     file: ./NetByDocker/Dockerfile # 指定Dockerfile
  50.       - name: Build the Docker image
  51.         run: |
  52.           docker version
  53.           # 登录阿里云镜像仓库
  54.           docker login --username=${{ secrets.USERMAME }} --password=${{ secrets.PASSWORD }} registry.cn-hangzhou.aliyuncs.com
  55.           # 使用Dockerfile构建镜像  ${{env.IMAGE_TAG}}.${{ github.run_id }}.${{ github.run_number }}
  56.           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 }}
  57.           # 推送镜像到镜像仓库
  58.           docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{env.IMAGE_TAG}}
  59.           docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.run_number }}
  60.       # 列出所有镜像    
  61.       - name: Docker Images Lst 
  62.         run: docker images

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

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

  1. FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
  2. WORKDIR /app
  3. EXPOSE 80
  4. FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
  5. WORKDIR /src
  6. COPY ["NetByDocker/NetByDocker.csproj""NetByDocker/"]
  7. RUN dotnet restore "NetByDocker/NetByDocker.csproj"  # 还原项目的Nuget包
  8. COPY . .
  9. WORKDIR "/src/NetByDocker"
  10. RUN dotnet build "NetByDocker.csproj" -c Release -o /app/build # 在发布模式下生成项目。 生成工件将写入中间映像的 app/build/ 目录。
  11. FROM build AS publish
  12. RUN dotnet publish "NetByDocker.csproj" -c Release -o /app/publish # 在发布模式下发布项目。 已发布的捆绑将写入最终映像的 app/publish/ 目录。
  13.  
  14. FROM base AS final
  15. WORKDIR /app
  16. COPY --from=publish /app/publish .
  17. 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文件,在最后追加内容

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

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

  1. version: '3.4'
  2. services: 
  3.   netsample:
  4.     container_name: netsample
  5.     image: registry.cn-hangzhou.aliyuncs.com/zrng/myexample
  6.     restart: always
  7.     environment: 
  8.       - ASPNETCORE_ENVIRONMENT=Production
  9.     networks: 
  10.       - my-bridge
  11.     ports: 
  12.       - "8002:80"
  13. networks: 
  14.   my-bridge:
  15.     driver: bridge

然后在dotnet.yml文件后追加

  1. - name: executing remote ssh commands using password
  2.     uses: appleboy/ssh-action@master
  3.     with:
  4.       host: ${{ secrets.SERVERHOST }}
  5.       username: ${{ secrets.SERVERUSERNAME }}
  6.       password: ${{ secrets.SERVERPASSWORD }}
  7.       port: ${{ secrets.SERVERPORT }}
  8.       script: 
  9.         cd /root/net;
  10.         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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/186001
推荐阅读
相关标签
  

闽ICP备14008679号