前言
去年公司已经完成所有产品的.NET Core改造工作,团队成员也逐步积累了docker和devops的知识,今年的主要任务之一就是把核心的产品迁移到devops生产线上。本来是打算用微软的Azure平台,因为真的太好用了,我自己的测试站点就一直用Azure来做持续交付工作。但是公司原来的产品、数据、备案都在阿里云上,迁移的话会有大量的工作,包括数据迁移、备案迁移都很麻烦。加上目前国内这种政治绝对正确的要求,搞不准哪天就因为用Azure就撞雷了,虽然很无语,但是也没有办法。
这几天一直在想方案,前年是打算用开源的持续集成(CI)工具Jenkins来配合阿里云,不过去年发现GitHub Action用起来更加顺畅,而我们的代码基本都是托管在GitHub上面,阿里云去年也发布了自己的K8S平台ACK,我们打算当小白鼠,正式使用看看效果如何。
不过在使用ACK之前,我们希望能够把Github上面的代码持续发布到docker Hub上面,去年已经完成了这部分工作,今天整理一下步骤和流程。
一、创建docker Hub账号
首先是到 https://hub.docker.com/ 创建一个账号,并且创建一个自己的repository,可以是公开的,也可以是私有的。另外,设置和GitHub的连接:
二、创建Dockerfile
通过VSCode或者VS创建自动Dockerfile,如果是VS,就右键项目(不是解决方案),添加Docker支持,VS会自动生成这个项目的Dockerfile文件,不用做任何修改。
三、提交整个解决方案
我们的项目一般都是位于一个解决方案里面,所以一个解决方案可能保护多个项目,这个没有问题,把整个解决方案都提交到GitHub上面,当然必须是本地可以编译通过并且可以运行的代码。网上很多教程都没有说清楚这种项目的打包细节,我后面会重点说一下,因为对于一个初学者,很容易在这里迷茫。
四、设置GitHub的密钥
需要把第一步创建的Hub账号填写到GitHub的settings里面:
五、编写Action的WorkFlow
通过Github的Action,可以创建很多类型的工作流WorkFlow,非常方便。
可以看到,几乎涵盖了所有国内外常用云平台的模板。
当然了,也包含了几乎所有常用开发语言的模板,太牛了。
Github上还有非常多通用的Action,你可以直接引用来使用,这里我不多说,贴一个我们可以运行的WorkFlow:
name: .NET
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 3.1.x
- name: Push to Docker Hub
uses: docker/build-push-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
dockerfile: ./Academy.PCCore/Dockerfile
repository: academy/academypc
tags: v0.0.1
tag_with_ref: true
这里重点说一下后面的这几个变量:
1、username和password就是第四步里面设置的变量。
2、dockerfile的路径问题,路径“./”就是指当前在Github的这个respository的根目录,比如:
这里我只需要将Academy.PCCore项目打成docker,Dockerfile也在这个文件夹的根目录。
3、repository,这个就是在Docker Hub里面创建的仓储Respository的路径,两边一定要一直,否则无法提交。
这里我使用了三个别人写好的Action, actions/checkout@v2 是迁出代码到GitHub运行环境的Action,actions/setup-dotnet@v1 是生成打包.NET Core程序的Action,docker/build-push-action@v1 将程序打包到Docker并且发布到Hub的Action,自己几乎不用写太多代码,确实非常方便。