基于Github Actions + Docker + Git 的DevOps方案实践教程
- 为什么需要DevOps
- 如何实践DevOps
- 版本控制工具(Git)
- 学习使用
- 配置环境
- 源代码仓库
- 一台配置好环境的云服务器
- SSH远程登录
- 在服务器上安装docker
- docker技术准备工作
- 安装docker
- 使用docker安装mysql
- 选择合适的CI/CD平台
- 在本地代码仓库中配置好dockerfile
- 尝试使用docker在本地打包构建部署
- 使用Github Actions自动化打包构建
- workfile详解
- actions/checkout@v2
- actions/setup-dotnet@v1
- docker/login-action@v1.10.0
- docker/build-push-action@v2
- appleboy/ssh-action@master
- workfile详解
- 版本控制工具(Git)
- 演示效果
- 心得
为什么需要DevOps
dveops的概念提出已经近十年,各种devops的实践方案已经陆续在各个开发团队应用,通过版本控制工具(Git、SVN) + 源代码仓库(Gitee、Github) +CI/CD平台(Jenkins、Github actions、Travis CI...)的DevOps方案使得开发人员的开发体验得到极大的提升,即减少了开发和运营的成本又提高了产品质量...
由于个人阅历不足无法继续详细阐述DevOps的优势和作用,所以我推荐了一篇blog
devops基础理念梳理
如何实践DevOps
废话说那么多,不如实践一下见好坏,以Jenkins、Github actions、Travis CI等等CI/CD平台为中心都可以很好的做到持续集成持续部署,在码云源代码仓库中我们可以看到如下流行的devops方案
以及在Github中集成的Actions
所以我们真正搭建这样一个流水线平台到底需要使用什么技术,掌握什么工具?
我总结如下:
- 掌握流行的版本控制工具(Git,SVN)基本使用方法
- 依托一个源代码仓库(Github、Gitee)
- 基本的linux运维技术(SSH远程、Docker)
- 一个CI/CD平台(Jenkins、Github Actions、Travis CI...)
就这么多,不需要掌握任何编程技巧!
以上每一个技术精通都是不容易的,但是我们只需要任选其一掌握基本方法,能串起来就行。
我根据自己的技术栈设计了这样一个DevOps的方案
为此我们需要按部就班做一些准备工作
版本控制工具(Git)
学习使用
学习使用方法,这里我推荐廖雪峰的Git学习网站,阮一峰-Git命令清单,阮一峰-Git原理
配置环境
安装软件git官网
检验安装
git --version
配置本地用户信息
git config --global user.name "Name" git config --global user.email "**.com" git config --list
源代码仓库
这里我就不赘述了,太简单了,搜索引擎找一找,如图所示,我在github上建了一个这样的仓库(空仓库就行,代码可以后加)
注意,本教程依托了Github Actions这样一个平台,必需使用Github,所以网络问题需要自己解决
我们准备了如下图所示目录结构的一个基于Asp .NET Core 6 的一个图书管理系统的项目。然后将源代码推送到远程代码仓库如上图所示。(推送指令就不在详细描述,掌握了git的基本使用就会明白)
一台配置好环境的云服务器
为此我准备了一台4g运行内存,8M带宽的腾讯云服务器。操作系统为ubuntu
SSH远程登录
你可以使用云服务器控制台提供的远程工具,也可以使用xshell之类的远程控制工具。为了之后的操作能够尽可能顺利进行,你需要会使用一些基本的linux指令,可以看看这个linux快速上手视频。
xshell有免费版,下载安装后如下新建一个会话
之后按照提示输入账户名和密码就好
在服务器上安装docker
docker技术准备工作
这里我随便找了个视频狂胜-docker详细教程,大致看一下就能对docker有一个了解
一篇博客为什么要使用docker
我们知道一个项目要想运行起来是需要运行环境的,为了运行一个java项目我们为服务器安装对应版本的Jdk或Jre, 一个.Net应用想要运行起来需要对应版本的.Net FrameWork 或者.Net Core 的SDK,比如我们日常使用的可执行程序qq,weixin等等都是需要运行环境的,只不过windows提前安装好了各种版本的.Net Framework,使得我们安装好应用后就能直接使用。又比如在服务器上安装相应的数据库(mysql,sqlserver),管理这些开发环境是相当烦人的,但是当我们使用了docker这样一个容器化技术后库,代码即环境,可以在任何一台装有docker的服务器上运行,不需要配置任何环境。
安装docker
菜鸟教程-ubuntu安装docker
使用docker安装mysql
有了docker我们安装mysql将变得easy
docker pull mysql
检查一下我们拉去下来的docker镜像
docker images
运行
docker run -d --name mysql3306 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=******* mysql
查看一下正在运行的的服务
这样我们就创建按好了一个服务器上的数据库,这样的数据库不仅能用于生产环境,用来学习也是不错的,毕竟在笔记本上装数据库会比较占内存。
于是我就能在我的项目中配置数据库连接字符串使用这个数据库了
不管这个项目在哪台主机上启动,都是可以成功运行的,毕竟数据库的Ip, 密码都是固定的。
选择合适的CI/CD平台
如前文所说,我所用的是Github actions,最初我是在Asp .NET Core的官网文档上了解到的这个技术,自从github被微软收购后,Github actions就一直是微软推荐CI/CD技术。
Github Actions官网文档
想要真正理解这门技术,最好阅读一下英文版的文档,在看完“Understanding Github Actions"和”Finding and Customizing actions"这两栏的介绍后,基本上就可以上手Github Acitions了
推荐一篇blog,看完后你可以对其有个简单了解 阮一峰-github actions入门
在本地代码仓库中配置好dockerfile
在我的项目中实现如下
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["BMS.csproj", "./"]
RUN dotnet restore "BMS.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "BMS.csproj" -c Release -o /app/buildFROM build AS publish
RUN dotnet publish "BMS.csproj" -c Release -o /app/publishFROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "BMS.dll"]
尝试使用docker在本地打包构建部署
我们使用docker就可以根据这个文件将项目源码按照我们想要的方式打包构建好
这里我们简单演示一下,进行该测试需要在本地电脑安装docker,
切换到有dockerfile的项目目录下使用
docker build .
这个没有tag的镜像就是我们刚刚构建的
docker run -d --name bmstest -p 8080:80 7ab686d20640
打开游览器检查一下是否成功运行
成功了!
但是,还不够方便,虽然我们每次修改完代码运行几个命令就运行好了,别人也可以拿着我们的镜像去运行程序,但是执行的命令是固定的,我们能不能在修改完代码后就自动让其打包构建部署,事实证明是可以的,人类也是可以在偷懒中进步的。
使用Github Actions自动化打包构建
我们们在项目目录workflows下建立自己的workfile
name: .NETenv: IMAGE_NAME: teston:push:branches: [ master ]pull_request:branches: [ master ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Setup .NETuses: actions/setup-dotnet@v1with:dotnet-version: 6.0.x- name: Restore dependenciesrun: dotnet restore- name: Testrun: dotnet test --no-build --verbosity normal- name: Docker Loginuses: docker/login-action@v1.10.0with:username: ${{ secrets.DOCKER_USERNAME }}password: ${{ secrets.DOCKERHUB_TOKEN }}- name: Build and Pushuses: docker/build-push-action@v2with: tags: horaoen/app:latest push: truecontext: ./BMS- name: deployuses: appleboy/ssh-action@masterwith: host: ${{ secrets.HOST }}username: ${{ secrets.HOST_USERNAME }}key: ${{ secrets.HOST_SSHKEY }}script: |docker stop bms-containerdocker rm bms-containerdocker rmi horaoen/app:latestdocker pull horaoen/app:latestdocker run -d --name bms-container -p 8080:80 horaoen/app
可以看到这里的yml文件引用了几个变量,这些是有关用户安全的东西不能直接写在配置文件中,需要在github 的仓库中设置
添加自己需要的密钥
workfile详解
关于上面这个dotnet.yml的Github Actions的配置文件怎么写的需要先了解Github Actions的基本原理
然后掌握一下几个Actions的使用
其实这些actions用户下项目,基本格式是users/repository,是一些别人写好的脚本,通过重复利用别人写好的脚本,我们可以很方便的做许多事
actions/checkout@v2
这个是用于将远程仓库中的源代码拉取到workfile自动化构建脚本运行的服务器,在我们这里是github提供的ubutu latest(这在配置文件中写的有)
actions/setup-dotnet@v1
这个是用于搭建项目的基本环境
docker/login-action@v1.10.0
docke官方给的antion,用于登录docker以便我们后续上传docker镜像到自己的镜像仓库
docker/build-push-action@v2
构建docker镜像,推送到自己的docker镜像仓库,这个context参数是比较难理解的,实际上是相对以远程代码仓库的根路径的Dockerfile的路径
在这个aciton的官网文档中介绍到,Dockerfile的文件路径默认在context/Dockerfile 下,所以这个配置很重要不能配错。
appleboy/ssh-action@master
在我们成功将docker镜像推送到镜像仓库后,需要ssh连接我们自己要部署项目的服务器,然后在其上运行一系列docker commond去部署项目。
其它参数一目了然,唯独这个稍微麻烦,它是我们将要连接到的服务器的ssh私钥,在这个action的官网中给出了教程
官网文档
可以照着教程,其实你已经看到这里就说明具备解决这个问题的能力,详细步骤可以查一下博客怎么配置ssh密钥。需要注意的是复制尽量用指令去复制,错一个字符都不行
私钥一定要把上下分割线也复制上,巨坑!!!
演示效果
查看项目
我们发现有乱码,这里正好模拟实际项目中的bug,现在我们修改代码修复bug
实际上改一下encoding就好了,然后重新提交代码
成功了!!
心得
显然从结果来看,这很方便,但是学习技术的过程是很痛苦的,如果把学习过程放到比较条件中去是不公平的,学习一次收益很久,但是不做改变就会一直麻烦。
评论区可以留言,我会尽力解答。
基于Github Actions + Docker + Git 的DevOps方案实践教程相关推荐
- 最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?
点亮 ⭐️ Star · 照亮开源之路 https://github.com/apache/dolphinscheduler 01. DolphinScheduler 和 Python API 介绍 ...
- 解放双手,基于github travis-ci docker自动化部署java项目
前言 最近在写一些小玩具的时候,一次次的测试,打包,部署流程太麻烦了,正好代码都放在github上,于是就是打算用travis-ci来进行持续集成 解放双手. 实现思路 dockerfile + do ...
- Jenkins 流水线 获取git 分支列表_基于Jenkins的DevOps流水线实践教程
讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...
- Jenkins 流水线 获取git 分支列表_基于Jenkins的DevOps流水线实践教程|2020全新制作|端到端研发效能提升...
讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...
- 基于Jenkins的DevOps流水线实践教程
讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...
- 基于Jenkins的DevOps流水线实践教程|2020全新制作|端到端研发效能提升
讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...
- 基于Jenkins的DevOps流水线实践教程|2020全新制作|端到到研发效能提升
讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...
- 37 手游基于 Flink CDC + Hudi 湖仓一体方案实践
简介: 介绍了 37 手游为何选择 Flink 作为计算引擎,并如何基于 Flink CDC + Hudi 构建新的湖仓一体方案. 本文作者是 37 手游大数据开发徐润柏,介绍了 37 手游为何选择 ...
- 基于WSL2+NVIDIA Docker的开发环境最佳实践
1. Windows 11 安装WSL2 Ubuntu 22.04 LTS 1.1 安装windows附加功能 点击:设置->应用->可选功能->更多windows功能 弹出的窗口: ...
- DevOps流水线实践教程|端到端研发效能提升
讲师介绍 课程寄语 我认为Jenkins是对我这些年运维经验的总结,起初我们运维同学都是编写脚本完成一些自动化的操作.而有了Jenkins我们可以将我们的运维经验与Jenkins设计理念融合完成自动化 ...
最新文章
- python渲染html页面_从零开始学Python - 第031课:用Python解析HTML页面
- 左牵Uber右联大众,黄教主带领320家车企一统自动驾驶江湖
- DIB位图(Bitmap)的读取和保存
- JavaScript权威指南笔记
- 特斯拉CEO马斯克又怼巴菲特:别把冰雪皇后给毁了
- asp.net core IIS发布
- 68 道Redis面试题
- Python typing —— 类型提示(type hint)
- php获得mp3文件总时间,php获得音频文件信息,php获得mp3文件信息
- python工厂模式看不懂_python模式 工厂模式原理及实例详解
- 卸载掉360之后无法删除360safe文件夹解决办法!
- Java猜数字小游戏
- 程序员自学编程的6种方法,高效学习
- docker(4): 持久化
- 企业物流管理系统使用教程
- edge浏览器如何把网页放到桌面_怎么将Edge浏览器图标放到Win10桌面?
- 奇迹按键精灵挂机脚本_按键精灵做连击脚本(奇迹MU战士用)
- 银行存款利率C语言程序设计,存款利息的计算 有1000元,想存5年,可按以下5种办法存:...
- python内置函数bin,Python内置函数bin() oct()等实现进制转换
- 无人机动力系统扭矩测量方法和测试必要性的研究
热门文章
- 第二章:MFC绘图基础
- errors potentially fixable with the `--fix` option.
- 关于mybatis整合spring时报java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/Trasactionwar
- Android 控件数组
- python制作地图
- Mask R-CNN结构细节回顾
- 信道容量受哪三个要素_连续信道容量与
- 这么简单的道理,猩猩都懂,我们却忘了
- Win10 点击任务栏固定的文件夹资源管理器就重启
- 在IIS上部署ASP网站