自动部署项目,全靠它了!

news2024/11/18 1:33:42

前几天我把我的开源项目部署到了云服务器。

我部署的大概流程:

  1. 登录到云服务器控制台,新建一个服务器实例(我用的 Ubuntu Linux)。
  2. 在自己的电脑上生成 SSH 秘钥,将生成的公钥和实例进行绑定。
  3. 使用 SSH 登录到云服务器,安装项目所需要的运行环境。
  4. 拉取代码,初始化依赖、编译、运行。
  5. 配置域名的 DNS 解析,修改 Nginx 配置。

然后就可以通过域名访问了。

这只是一个大概的流程,在实际操作的过程中可能会遇到很多问题。

这次主要分享的是如何利用 Github Actions 实现自动部署项目到云服务器。

最终的实现效果:

当我们的项目有新版本要发布时,我们直接把代码 push 到 Github 代码仓库,Github Actions 会自动帮我们把项目部署到云服务,也就是不需要我们手动登录到服务器进行拉取代码、初始化依赖、编译、运行等操作,我们只需要 push 一下代码,他就会自动把项目部署到云服务器。

很显然,Github Actions 可以为我们节省大量的部署项目的时间。

接下来,以我的开源项目为例,教你如何使用 Github Actions 部署项目到自己的云服务器。

开源项目地址:

https://github.com/zchengo/crm

首先,我们需要在云服务器上安装项目需要的运行环境,安装 Nginx 用于部署前端项目,安装 MySQL、Redis 用于为Go服务端提供数据库服务。同时,需要启动 Nginx、MySQL、Redis 服务,然后还需要编写一个Shell脚本用于重启Go服务端。

Github Actions 官方的定义:

在 GitHub Actions 的仓库中自动化、自定义和执行软件开发工作流程。 您可以发现、创建和共享操作以执行您喜欢的任何作业(包括 CI/CD),并将操作合并到完全自定义的工作流程中。

Github Actions 的工作原理:

实际上就是Github官方给我们提供了一个虚拟机环境(如Windows、MacOS、Linux),项目安装、初始化依赖、打包编译全都是在这台虚拟机上操作的,再通过命令把最终打包生成的文件上传到云服务器,然后使用 ssh 在云服务器上执行一些命令,就完事了。

如何使用 Github Actions ?

1、我们需要在项目的根目录下创建.github/workflows/deploy.yaml,yaml文件的文件名可以自定义。

2、编写 deploy.yaml

name: CRM CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    
    - name: Use Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18.12.0'    
        
    - name: Build Web
      run: cd web && npm install && npm run build  
    
    - name: Use Go
      uses: actions/setup-go@v3
      with:
        go-version: 1.19
    
    - name: Build Server
      run: cd server && go mod tidy && go build -o crmserver main.go
    
    - name: Deploy CRM
      env:
        KEY: ${{ secrets.SSH_PRIVATE_KEY }}
        HOST: ${{ secrets.REMOTE_HOST }}
      run: |
        mkdir -p ~/.ssh/ && echo "$KEY" > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa
        scp -o StrictHostKeyChecking=no -r web/dist ubuntu@${HOST}:/usr/local/nginx/html/
        ssh -o StrictHostKeyChecking=no ubuntu@${HOST} "sudo /usr/local/nginx/sbin/nginx -s reload"
        scp -o StrictHostKeyChecking=no -r server/crmserver ubuntu@${HOST}:/home/ubuntu/
        ssh -o StrictHostKeyChecking=no ubuntu@${HOST} "sudo /home/ubuntu/crmapi/restart.sh > /dev/null 2>&1 &"

挺简单的,有几个地方需要说明一下。

env:
  KEY: ${{ secrets.SSH_PRIVATE_KEY }}
  HOST: ${{ secrets.REMOTE_HOST }}

SSH_PRIVATE_KEY 指的是你在自己电脑上生成的SSH私钥(这个私钥必须能连接到云服务器才行),REMOTE_HOST 指的是云服务器的IP地址,因为这两个变量属于敏感信息,所以需要在代码库->Settings->secrets->Actions 中设置,设置完成后,就可以通过 secrets 来调用。

mkdir -p ~/.ssh/ && echo "$KEY" > ~/.ssh/id_rsa && chmod 600~/.ssh/id_rsa

这个的作用就是让 Github 提供给我们的虚拟机能够连接到云服务器,所以我们需要把 ssh 私钥给虚拟机。

ssh -o StrictHostKeyChecking=no ubuntu@${HOST} "sudo /home/ubuntu/crmapi/restart.sh > /dev/null 2>&1 &"

这个就是在使用ssh执行云服务器上编写的脚本,用于重启服务端。/dev/null2>&1& 指的是把控制台(Go服务端运行)输出的内容输出到空设备,这样可以避免 Github Actions 一直处于运行状态。

/home/ubuntu/crmapi/restart.sh 脚本如下:

#!/bin/bash
sudo pkill crmserver
sudo cp /home/ubuntu/crmserver /home/ubuntu/crmapi/
sudo nohup /home/ubuntu/crmapi/crmserver > /home/ubuntu/crmapi/crmserver.log 2>&1 &

nohup 命令可以让二进制文件 crmserver 在后台运行,并把结果输出到 crmserver.log 文件中。

最终,我们把 .github/workflows/deploy.yaml 提交并推送到代库,Github Actions 就会自动执行,之后你每进行一次 push 操作,Actions就会执行一次。执行成功,就相当于项目部署成功。

扫描下方二维码,关注公众号「GoCode」,看更多优质干货!偷偷学习,然后惊艳所有人!!!

在这里插入图片描述

希望这篇文章对你有帮助,关于 Github Actions 的更多用法,大家可以参考官方文档。

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

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

相关文章

大数据 linux目录操作

linux 目录操作 常用权限操作 常用权限操作 chgrp命令 功能:修改文件所属组 语法格式:chgrp 用户组 文件(说明:ch - change;grp - group) chown命令 功能:改变文件所有者 语法格式&…

R语言Outliers异常值检测方法比较

识别异常值的方法有很多种,R中有很多不同的方法。 最近我们被客户要求撰写关于异常值检测的研究报告,包括一些图形和统计输出。关于异常值方法的文章结合了理论和实践。理论一切都很好,但异常值是异常值,因为它们不遵循理论。如…

chatGPT能不能有危险活体模型

🍿*★,*:.☆欢迎您/$:*.★* 🍿

【安全狗安全研究】SkidMap挖矿木马研究

近日,安全狗威胁情报中心监测到多起“Skidmap”挖矿木马事件。经研判,这些病毒感染事件是攻击者经Redis未授权访问漏洞攻击的方式植入挖矿木马“SkidMap”导致的。虽然“SkidMap”并非新型的病毒家族,但鉴于该病毒家族一直保持着较高的流行热…

多种方式绘制简单的作废章

作废章是常用的长方形印章,其形式如下图所示(图片来自参考文献1)。印章的形式很简单,就是红色方框内显示作废两个字,其实在网上百度长方形印章的话,可以搜索出很多类似形式的印章,区别仅在于尺寸…

lcd屏调试记录

一,lcd屏介绍 LCD液晶屏的接口类型非常丰富,最常用的接口主要有RGB、MCU、LVDS、MIPI接口。 1、RGB接口 LCD液晶屏的RGB接口通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及三者组合来得到丰富多彩的颜色,RGB分别代表红、绿、蓝三个通道的…

QT:多进程

标题1.多进程2.多线程3.常用方法1.多进程 (1)创建进程对象 QProcess::QProcess(QObject *parent nullptr)(2)启动进程去执行另外一个程序 void QProcess::start(const QString &command) //类似于system()/exec函数族 参数:command --》你要执行的另外一个程序…

36氪2022年Q3总收入同比增长两位数超预期,连续第四个季度盈利,广告收入同比增长20%

12月7日,36氪(证券代码:KRKR)披露2022年第三季度业绩。该季度36氪总收入同比增长11.5%至9461万元,净利润249万元,连续第四个季度实现盈利。 本季度,36氪广告业务持续表现优异,实现了…

windows电脑关机开机后没声音,重启就有声音故障处理方法

今天遇到一件非常奇葩的windows电脑, 从关机状态下进入系统没有声音,且从以下几点判断声卡硬件及驱动不存在故障,详见如下: 1、开机后任务栏右下角声音图标正常 2、声音设置——扬声器/麦克风(Realtek(R) Audio)正常; 3、windows+x键,选择“设备管理器”,找到“音频…

Primavera Unifier 常用标准数据要素

目录 一:什么是数据要素 二: 常用数据要素字段 一:什么是数据要素 数据元素是Oracle Primavera Unifier维护业务单据/表达的最小单元,也就是我们常说的字段,她将数据定义与字段标签相结合,成为用户在 Pr…

用70行Python编写一个概率编程语言

1、简介 在这篇文章中,我将介绍概率编程语言(Probabilistic Programming Languages,简称PPL)的工作原理,并逐步演示如何用Python构建一个简单的概率编程语言。 本文主要面向的读者是统计学家、AI研究员和好奇的程序员…

Python+Appium自动化测试(14)-yaml配置Desired capabilities

目录:导读 一,前言 二,使用yaml文件配置Capabilities示例 三,更新yaml文件的内容 四,结语 一,前言 在之前的appium自动化测试示例中,我们都是把构造driver实例对象的数据(即Des…

对于单例,多进程的误解

单例 单例在多线程下,可以保证全局唯一,但在多进程下呢?子进程不共享父进程的变量 所以,每个进程都维护着一个自己的单例。 验证 创建appserver 以flask为例,以包的形式创建一个单例 # view.py-----------------…

四十、Java 多线程编程

Java 多线程编程 Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。 这里定义和…

移动WEB开发之rem布局--苏宁首页案例制作(flexible.js)

简洁高效的rem适配方案flexible.js 手机淘宝团队出的简洁高效 移动端适配库 我们再也不需要在写不同屏幕的媒体查询,因为里面js做了处理 它的原理是把当前设备划分为10等份,但是不同设备下,比例还是一致的。 我们要做的,就是确…

[附源码]Python计算机毕业设计Django学生疫情防控信息填报系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

【Java面试】说说你对ThreadLocal内存泄漏问题的理解

文章目录前置知识为什么会产生内存泄漏问题?如何解决内存泄露问题?为什么要使用弱引用?前置知识 讲解ThreadLocal的内存泄漏问题之前,首先得先知道什么是内存泄漏。 Memory overflow:内存溢出,没有足够的内…

第02章_MySQL环境搭建

目录第02章_MySQL环境搭建服务启动与停止登录MySQL查看版本退出MySQL1. MySQL操作1.1 MySQL的使用演示数据库查看所有的数据库创建数据库使用数据库查看数据库的创建信息删除数据库表格查看数据库的所有表格创建新的表格查看一个表的数据添加一条记录查看表的创建信息删除表格1…

FineReport地图数据图表-按钮控件

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 -- 1.2 应用场景 「按钮控件」可应用于填报、参数等场景中,添加按钮后,点击按钮可触发某些报表操作。如下图所示: 1.3 如何添加 1.3.1 填报控件 选中单元格后,点击右侧属性…

Python中的__init__.py的高级用法

刚开始学习编程,我们很少会关注这个文件,只知道一个目录中存在该文件,该目录就是一个package,不存在就是普通的目录,普通的目录在导入包时,pycharm并不会智能提示。 Python中每新建一个package都会默认生成…