Git Actions自动发布部署,非最完善但足够理解和上手的一篇
创始人
2025-06-01 03:04:58

Git Actions自动发布部署,非最完善但足够完善和上手的一篇


文章最后附带完整代码链接

GitHub Actions是一个持续集成和持续交付(CI/CD)平台,允许您自动化构建、测试和部署管道。您可以创建构建和测试存储库中的每个拉取请求的工作流,或者将合并的拉取请求部署到生产中。

  • 至于什么是CI/CD?

CI全称 Continuous Integration,代表持续集成,CD则是 Continuous Delivery和 Continuous Deployment两部分,分别是持续交付和持续部署。CI/CD 是一种软件开发实践,利用自动化的手段来提高软件交付效率,让交付更简单。

以上的概念问题粗暴理解就是,比如我提交push一个代码到git,git actions可以帮助我们实现传输到远程服务器,同时让远程服务器编译,重新启动服务等等。特别是测试阶段,改动代码需要发布并重启服务器,提交git即可自动完成,代替以往的手动操作上传,关闭和重启。

  • git actions怎么实现呢? 这里就不讲解太多,尽量简单过下大概流程。

通过git actions可以实现on事件监听行为(push,pull事件),然后触发事件,运行自定义的workflow工作流,workflow工作流执行自定义的job任务,可以把我们想要的行为通过job跑出来。


相关行为和事件等,都是通过yaml配置文件,入门则了解yaml配置文件中,on, workflow,job,step这几个关键字,以及格式和用法即可,其它关键字边学边上手,这里就不敞开讲,看文档


下面是一个完整的例子,监听git的push事件,触发传输到远程服务器,平滑关闭服务并重启服务的例子

第一步:github上开一个空项目

empty_project

第二步:增加web服务器代码,并推送push到github

服务器代码, main.go

package  mainimport ("context""github.com/toegg/egg_actions/test""log""net/http""os""os/signal""syscall""time"
)
func main() {// 创建一个接收信号的通道,监听signal信息quit := make(chan os.Signal, 1)signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)log.Println("start server")//启动web服务器,监听两个API行为,1个测试,1个重启http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {log.Println("Test Print:", test.Test())w.Write([]byte("hello http HandleFunc, Result:" + test.Test()))})http.HandleFunc("/reload", func(w http.ResponseWriter, r *http.Request) {quit <- syscall.SIGINTlog.Println("Server Reload")w.Write([]byte("http HandleFunc"))})s := &http.Server{Addr: ":8881",}go s.ListenAndServe()// 阻塞在此,接收到关闭进程信号,继续往下走<-quitlog.Println("Shutdown Server ...")timeoutCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)defer cancel()if err := s.Shutdown(timeoutCtx); err != nil {log.Println(err)}}

增加编译的shell脚本, build.sh,脚本为了git actions远程ssh操作执行

#!/bin/bash# 切换到服务器工程所在目录(这里要切换到所在目录,避免不必要路径报错问题)
cd /home/tool/golearn/src/egg_actions# 用go指令(带上安装路径),编译
/home/tool/go/go/bin/go build main.go

最后把内容推送push到github,必须推送push

第三步:启用项目git actions,直接在github项目中操作

打开github的项目,选择Actions,点击set up a workflow yourself
setactions

点击后会进入自定义yaml配置文件界面。页面右边也选择了可以提供的模板,右边可选择不同编程语言的yaml模板配置等。我们这里用我已经写好的,先贴上去。

我们自己的用到了3个任务job
code: 测试编译go代码
restart:平滑关闭服务并重启
deply:推送文件模块到远程服务器

# 这里声明git actions的名字
name: Go# 指定监听事件,这里监听push到git分支main的事件
on:push:branches: [ "main" ]# 这里定义工作流,工作流配置对应job任务
jobs:code: # 声明job的名字(这个job主要用来介绍,可以用做测试go test流程)runs-on: ubuntu-latest   # 使用ubuntu系统镜像运行脚本# steps定义job的步骤,具体执行,运行xxx,-字符开头的一块则为一个步骤,可以配置多个步骤steps:                   - uses: actions/checkout@v2   # 步骤1:下载git仓库中的代码,使用官方提供,使用库用uses关键字- name: SetUp Go              # 步骤2:下载go代码uses: actions/setup-go@v3   # 使用官方提供with:go-version: 1.16          # 指定go版本1.16- name: Build Go              # 步骤3:编译仓库中的代码run: go build -v ./restart: # 声明另一个job的名字runs-on: ubuntu-latest   steps:- name: Check my-json-serveruses: cross-the-world/ssh-pipeline@master   # 使用别人包装好的步骤,执行远程操作的库with:host: ${{ secrets.REMOTE_HOST }}      # 远程连接的host,引用配置user: ${{ secrets.SSH_USERNAME }}     # 远程连接的用户名,引用配置key: ${{ secrets.ACCESS_TOKEN }}      # 远程连接的ssh秘钥,引用配置port: '22'                            # ssh端口connect_timeout: 10s                  # 远程连接的超时时间# 下面是执行的脚本内容,找到go服务进程,通过发送信号关闭进程,调用build.sh脚本编译代码,用nohup重启服务script: |echo "hello egg" (ps aux|grep main|grep -v "grep"|head -n 1|awk '{printf $2}'|xargs kill -15) &&(sh /home/tool/golearn/src/test_actions/build.sh) &&(nohup /home/tool/golearn/src/test_actions/main > /home/tool/golearn/src/test_actions/error.log 2>&1 &) echo "over"needs: deploy   # 依赖关键字,等deploy的执行完了再执行restartdeploy:runs-on: ubuntu-latest   steps:  - uses: actions/checkout@v2  - name: Deploy to Server  # 使用别人包装好的步骤,推送文件模块到远程服务器uses: AEnterprise/rsync-deploy@v1.0  env:DEPLOY_KEY: ${{ secrets.ACCESS_TOKEN }}   #  远程连接的ssh秘钥,引用配置ARGS: -avz --delete                       # rsync参数SERVER_PORT: '22'                         # ssh端口FOLDER: ./                                # 要推送的文件夹,路径相对于代码仓库的根目录SERVER_IP: ${{ secrets.REMOTE_HOST }}     # 远程连接的host,引用配置USERNAME: ${{ secrets.SSH_USERNAME }}     # 远程连接的用户名,引用配置SERVER_DESTINATION: /home/tool/golearn/src/test_actions  # 部署到目标文件的路径needs: code # 等code完成再执行deploy

粘贴上去,点击start commit提交,会自动在项目目录创建.github/workflows/main.yaml文件

再选择Actions,会看到我们新增的actions的Create main.yaml,但是失败了,点击其中一个进去
actions
进入之后可以看到我们三个job为线性关系,有前后依赖(因为用到了needs关键字)。
可以看到在code任务成功了,但是deploy报错停住了,点击deploy查看具体原因
errordetail
这里面会显示具体的任务job执行步骤,查看报错原因,原来是由于我们用到了引用配置,但是还没配,导致执行远程推送服务器失败。
error

第四步:配置github项目的配置变量,提供引用

进入项目主页,选中settings,点击actions,添加对应的key=》val配置变量

addsecret
分别添加以下3个我们会用到的变量

REMOTE_HOST :远程连接的host
SSH_USERNAME : 远程连接的用户名
ACCESS_TOKEN : 远程连接的ssh秘钥

addkeyval
添加完毕后,则如图
secrets

第五步:编译go程序可执行文件,手动上传服务器,启动web服务

因为我们为了测试重启,所以先手动上传服务器并启动web服务。
buildserver

第六步:重新跑actions,测试结果

点击回第三步最后的actions页面,重新跑工作流,测试,选中右上角的Re-run all jobs会自动执行。

again

出现以下结果,测试通过

againresult
进入服务器查看,文件是否推送同步过来,并且编译了main.go,存在main可执行程序
sync

打开浏览器,访问web服务器链接,出现如图,说明部署成功了
run

第七步:本地修改代码,push推送git,查看是否自动发布,远程传输,重启

修改test/test.go模块的代码为

func Test() string {return "Hello TestActions Change Push"
}

提交push到github,跟着上github项目查看actions执行结果,看到正在执行
push
待执行完毕,显示成功
finish

打开浏览器,访问web服务器链接,已经生效,说明改动代码,直接提交git,会自动发布部署了

testpic

完整代码链接

相关内容

热门资讯

舆论战升级!巨子生物深夜回应,... 2025.06.02本文字数:2490,阅读时长大约4分钟作者 |第一财经 刘晓颖重组胶原蛋白成分之...
财经时评|以创新厚度重塑汽车产... 作者 远山中国汽车工业协会与工业和信息化部近期针对行业“内卷式”竞争的联合发声,为持续蔓延的价格战按...
恒生指数午盘下跌2.20%,恒... 6月2日午盘,香港恒生指数下跌2.20%,报22778.45点;恒生科技指数下跌2.43%,报504...
“以旧换新”带货1万亿,中国何... “美国想让制造业回流成为中国的样子,一个踏实劳作的‘生产者社会’;而中国想努力扩大消费成为美国的样子...
恒指半日跌2.2% 恒指半日跌... 【恒指半日跌2.2%】截至午间收盘,香港恒生指数下跌2.20%,报22778.45点;恒生科技指数下...
“成分之争”舆论战升级,巨子生... 重组胶原蛋白成分之争的舆论战再度升级。美妆博主 "大嘴博士" (郝宇)近日连续发文质疑,巨子生物(0...
汇川技术新注册《InoCube... 证券之星消息,近日汇川技术(300124)新注册了《InoCube-InoData数据分析系统V1....
博将控股多家所投企业荣登202... 博将控股多家所投企业荣登2025杭州独角兽与准独角兽榜单 2025年4月24日,由民建浙江省委会、浙...
刚刚,A50直线跳水!亚太股市... 6月2日,亚太股市开盘后持续走弱。富时中国A50期货开盘跌0.6%,截至目前跌幅1.91%。 截至...
问界、智界、享界、尊界,202... 2025鸿蒙智行:四界表现鸿蒙智行作为国内造车新势力的主流品牌,一共规划了“五界”车型,包括:问界、...
花样年控股:重组支持协议的最后... 6月1日,花样年控股(01777.HK)公告称,公司2024年4月29日所订立的重组支持协议的最终截...
蜜雪集团股价创上市以来新高 蜜... 新京报贝壳财经讯 6月2日,港股蜜雪集团盘中涨超7%,股价刷新上市新高。
美单边关税让全球经济面临更大不... 美国征收关税的对象和标准可能随意变更,其关税政策具有不可预测性。无论是外国企业,还是美国本土企业,都...
桃李面包创始人向其两儿子转让3... 5月30日晚间,桃李面包(沪市代码:603866)公告称,公司控股股东及实际控制人吴志刚通过大宗交易...
前4月东莞重大项目完成投资42... 本期看点:前4月东莞重大项目完成投资429.09亿元;长联科技募投项目提升年产至2.77万吨;广东省...
恒生指数跌幅扩大至2%,医药、... 6月2日,恒生指数跌幅扩大至2%,医药、地产、能源板块跌幅居前,美中嘉和跌超14%,石四药集团跌近1...
港股、A50飘绿,亚太市场多数... 早间,亚太市场多数下跌。港股、A50集体下跌其中,恒生指数、恒生科技指数开盘跌幅扩大, 港股生物技术...
雷军看好的两兄弟,要IPO了 ... 2021年夏,小米产业园办公室内,雷军饶有兴致地打量眼前一对兄弟,“为什么张波是创始人,董事长却是张...
圣阳股份涨1.66%,成交额9... 5月30日,圣阳股份涨1.66%,成交额9.82亿元,换手率15.03%,总市值66.67亿元。 异...
“龙舟溪游”点燃江南西商圈消费... 5月31日至6月2日,海珠区江南中街道一年一度的节假日消费体验活动如约而至。今年“龙舟溪游・与你童在...
恒生指数开盘跌1.06%,恒生... 6月2日,恒生指数开盘跌1.06%报23043.10点,恒生科技指数跌1.33%,恒生中国企业指数跌...
*ST天喻实控人被刑事立案 此... 5月30日,*ST天喻(300205.SZ)发布公告称,公司收到武汉市公安局送达的《立案告知书》,公...
“玩”出更多花样——“六一”礼... 能交流、讲故事的毛绒玩偶,融入中国文化、科技元素的拼插积木,电影《哪吒2》衍生开发的各类公仔……“六...
5月十大牛股出炉:中邮科技逾1... 截至5月30日收盘,沪指月内累计涨2.09%,深证成指累计涨1.42%,创业板指累计涨2.32%。在...
恒生指数止步周线七连阳,IPO... 南方财经全媒体记者 袁思杰 实习生武桐羽 香港报道上周(5月26日-5月30日),港股震荡回调,主要...
新势力车企5月放榜:零跑汽车登... 近期,国内多家主流自主汽车企业纷纷发布了5月份的销售数据。造车新势力5月交付成绩也出炉,第一名依然是...
最新!2025新势力5月销量出... 5月新势力表现如何?2025年5月的销售周期刚刚过去,不少造车新势力厂商的销量数据,已经新鲜出炉。数...
两家A股公司,收终止上市决定 又有两家A股上市公司收到股票终止上市决定,6月10日进入退市整理期。 上述自律监管决定书指出,因2...
重磅,事关教育强国,主力提前埋... 数据是个宝数据宝投资少烦恼这些产业的景气度处于上升期。《求是》杂志发表文章《加快建设教育强国》6月1...