为什么需要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

所以我们真正搭建这样一个流水线平台到底需要使用什么技术,掌握什么工具?

我总结如下:

  1. 掌握流行的版本控制工具(Git,SVN)基本使用方法
  2. 依托一个源代码仓库(github、gitee)
  3. 基本的linux运维技术(ssh远程、docker)
  4. 一个CI/CD平台(Jenkins、Github actions、Travis CI...)

就这么多,不需要掌握任何编程技巧!

以上每一个技术精通都是不容易的,但是我们只需要任选其一掌握基本方法,能串起来就行。

我根据自己的技术栈设计了这样一个devops的方案

为此我们需要按部就班做一些准备工作

版本控制工具(Git)

学习使用

学习使用方法,这里我推荐廖雪峰的Git学习网站阮一峰-Git命令清单阮一峰-Git原理

配置环境

  1. 安装软件git官网

  2. 检验安装

    git --version

  3. 配置本地用户信息

    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 443 FROM 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/build FROM build AS publish
RUN dotnet publish "BMS.csproj" -c Release -o /app/publish FROM 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: .NET

env:
IMAGE_NAME: test on:
push:
branches: [ master ]
pull_request:
branches: [ master ] jobs:
build: runs-on: ubuntu-latest steps:
- uses: actions/checkout@v2
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.x
- name: Restore dependencies
run: dotnet restore
- name: Test
run: dotnet test --no-build --verbosity normal
- name: Docker Login
uses: docker/login-action@v1.10.0
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and Push
uses: docker/build-push-action@v2
with:
tags: horaoen/app:latest
push: true
context: ./BMS
- name: deploy
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.HOST_USERNAME }}
key: ${{ secrets.HOST_SSHKEY }}
script: |
docker stop bms-container
docker rm bms-container
docker rmi horaoen/app:latest
docker pull horaoen/app:latest
docker 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方案实践教程的更多相关文章

  1. 基于 Github Actions 自动部署 Hexo 博客

    前言 前不久使用了 Hexo 搭建独立博客,我是部署在我的腾讯云轻量应用服务器上的,每次都需要 hexo deploy 然后打包.上传.解压和刷新 CDN,非常麻烦.我的服务器配置也不高 2C2G 无 ...

  2. 使用.NET 6开发TodoList应用(31)——实现基于Github Actions和ACI的CI/CD

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求和目标 在这个系列的最后一节中,我们将使用GitHub Actions将TodoList应用部署到Azure Container ...

  3. 使用GitHub Actions实现自动化部署

    前言 大家在工作中想必都是通过自动化部署来进行前端项目的部署的,也就是我们在开发完某个需求时,我们只需要将代码推送到某个分支,然后就能自动完成部署,我们一般不用关心项目是如何build以及如何depl ...

  4. 基于【腾讯云函数】/【GitHub Actions】/【Docker】的每日签到脚本(支持多账号使用)

    每日签到集合 基于[腾讯云函数]/[GitHub Actions]/[Docker]的每日签到脚本 支持多账号使用 特别声明: 本仓库发布的脚本及其中涉及的任何解锁和解密分析脚本,仅用于测试和学习研究 ...

  5. 基于 Jenkins+Docker+Git 的CI流程初探

    在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要.目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部 ...

  6. 基于webhook方案的Git自动部署方案

    之前已经用Git实现了自己博客的提交自动部署,并自动提交到GitHub和coding以备不时之需.平时项目代码都托管在Coding或者GitHub上,也已经用上了coding提供的webhook功能, ...

  7. 基于 Docker 的微服务架构实践

    本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...

  8. Github Actions 还能做这些事

    前言 最近公司内部项目的发布流程接入了 GitHub Actions,整个体验过程还是比较美好的:本文主要目的是对于没有还接触过 GitHub Actions的新手,能够利用它快速构建自动测试及打包推 ...

  9. 5 分钟教你快速掌握 GitHub Actions 自动部署博客

    自从 GitHub 宣布 GitHub Actions 在平台上对所有开发人员和存储库可用以来,GitHub Actions 越来越受欢迎.很多第三方平台在生态系统中有速度等限制,将进一步推动开发人员 ...

随机推荐

  1. 设计模式学习-使用go实现观察者模式

    观察者模式 定义 适用场景 优点 缺点 代码实现 不同场景的实现方式 观察模式和发布订阅模式 参考 观察者模式 定义 观察者模式(Observer Design Pattern)定义了一种一对多的依赖 ...

  2. cmd命令配置MySQL

    当安装完MySql后,每次windows启动的时候都会将MySql服务启动起来. 如果是winxp则不需要使用管理员权限既可以很简单的打开和关闭,具体在cmd中敲入命令: 1.启动MySql服务: n ...

  3. [hdu6145]Arithmetic of Bomb II

    对于题中的"normal expression"(仅含加减乘和无前导0的非负整数,无括号)的计算,实际上并不需要通常的表达式求值,而可以用下述方式计算-- 维护三元组$(a,b,c ...

  4. 快速入门上手Markdown

    第一次接触Markdown是写代码初期看很多大佬的github,他们的项目一定会有一份文件叫Readme.md的文件 他们由一些简单美观的符号和汉字字母组成,编译之后成为一篇简单直观的文档 深入了解之 ...

  5. [NOIP2018 提高组] 旅行

    考虑如果我们要回溯的话,一定要把非环上的子树都搜索完. 而在环上的一个地方回溯,相当于把环上的下一个点置于所有环的顺序的最后. 所以我们只有在环上遇到环上的最大点时且周围的点都比这个点小时非正常回溯即 ...

  6. Codeforces 718E - Matvey's Birthday(思维题)

    Codeforces 题面传送门 & 洛谷题面传送门 首先注意到这个图的特殊性:我们对于所有 \(s_i=s_j\)​ 的 \((i,j)\)​ 之间都连了条边,而字符集大小顶多只有 \(8\ ...

  7. DTOJ 3999: 游戏

    题目描述这个游戏是这样的,你有一个初始序列S ,你每次可以选择一段任意长度的连续区间,把他们+1 再膜k,给定目标序列,你需要尝试用尽量少的操作次数将初始序列变为目标序列.作为一名优秀的OIer,您认 ...

  8. C/C++ Qt TabWidget 实现多窗体创建

    在开发窗体应用时通常会伴随分页,ToolBar组件可以实现顶部工具栏菜单,每一个ToolBar组件关联到一个TabWidget组件的Tab标签内,这样我们就可以实现一个复杂的多窗体分页结构,此类结构也 ...

  9. Parallel NetCDF 简介

    Parallel NetCDF API 所有C接口前加ncmpi前缀,Fortran接口前加nfmpi前缀 函数返回整数 NetCDF 状态变量 1. Variable and Parameter T ...

  10. Anaconda建立新的环境,出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url ...... 解决过程

    2020.3.7准备scrapy,使用anaconda创建一个新的环境,执行"conda create -n scrapyEnv python=3.6",结果出现了"Co ...