使用GithubAction自动构建部署项目
GitHub Actions 是一种持续集成和持续交付(CI/CD) 平台,可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。 GitHub Actions 不仅仅是DevOps,还允许您在存储库中发生其他事件时运行工作流程。
1.1 项目准备
这里以一个javaWEB项目作为演示:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>GithubActionDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>GithubActionDemo</name>
    <description>GithubActionDemo</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
这里注意一下SpringBoot 2.x 的话最好就用JDK1.8 如果要用Springboot 3.X版本必须使用JDK17。Springboot 3.x已经废弃JDK1.8了。
2.1 GithubAction设置
当然首先应该把该项目上传至Github,点击Action选项卡:

这里可以选择Github提供的诸多工作流模板:

也可以自己自定义一个工作流,new workflow因为该项目是一个JavaWeb项目这里随便找了一个maven打包构建的模板:
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
name: Java CI with Maven
on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]
jobs:
  develop_build:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取最新提交的代码
        uses: actions/checkout@v3
      - name: 设置jdk
        uses: actions/setup-java@v3
        with:
          distribution: 'temurin'
          java-version: '17'
          cache: 'maven'
      - name: 项目打包
        run: mvn -B package
      - name: 删除旧的jar包以及运行脚本
        run: sshpass -p ${{secrets.CHAOYUEPASSWORD}} ssh -o StrictHostKeyChecking=no root@${{secrets.CHAOYUEIP}} "cd /root/GitHub_Action && rm -rf ./*"
      - name: 上传jar包和启动脚本到服务器中
        run: sshpass -p ${{secrets.CHAOYUEPASSWORD}} scp -r -o StrictHostKeyChecking=no ./target/GithubActionDemo-0.0.1-SNAPSHOT.jar ./run.sh root@${{secrets.CHAOYUEIP}}:/root/GitHub_Action
      - name: 启动项目
        run: sshpass -p ${{secrets.CHAOYUEPASSWORD}} ssh -o StrictHostKeyChecking=no root@${{secrets.CHAOYUEIP}} "cd /root/GitHub_Action && chmod +x run.sh && ./run.sh"
以下为该脚本的说明:
| workFlow | 说明 | 
|---|---|
| name | 自定义workFlow名字 | 
| on | 触发器,指定该工作流什么时候生效,这里是在push和pull_request的时候触发生效 | 
| job | 一个任务,可以有多个 | 
| runs-on | 构建部署过程可以在本地也可以使用github提供的虚拟机服务 | 
| steps | 构建步骤,可以有多个 | 
sshpass是一个远程登录服务器的一个插件工具,这里我现在服务器里创建了一个目录/root/GitHub_Action用于存放构建后的项目。run.sh为启动脚本内容如下:
# run.sh
# 切换到jar包目录下
cd /root/GitHub_Action
# 杀死之前的项目进程。这里的cut -c9-14是截取进程id,不一定都是-c9-14
# 可以先运行ps -ef|grep java|grep GitHub_Action-0.0.1-SNAPSHOT.jar看一下进程id是第几位到第几位
ps -ef|grep java|grep GithubActionDemo-0.0.1-SNAPSHOT.jar|cut -c9-14|xargs kill -9
# 停5秒
sleep 5s
# 使环境变量生效
source /root/.bash_profile
# 运行项目
nohup java -jar GithubActionDemo-0.0.1-SNAPSHOT.jar >/root/cicd.log 2>&1 &
run.sh直接存放在项目根目录:

远程登录服务器肯定要用户名和密码,这里不建议用明文的形式直接写在脚本中除非你的项目是private的,方式是在Setting里存放服务器IP,用户名,密码:

调用方式为:${{secrets.你的secret}}
到这里一个workflow就定义完毕了,返回到原项目会发现多了一个文件夹:

这个文件夹里存放的就是我们的workFlow.yaml文件
3.1 运行测试
我们push一下本地项目到Github,便会触发workFlow的工作条件。在Action界面能看到详细的构建过程:



可以看到每一步都是按照我们的脚本文件按序在执行。
执行完毕后jar包会上传至服务器:

由于我们脚本中写了启动命令,就不用再在服务器里java -jar运行了。现在我们访问项目试试:

运行成功!
4.1 小结
GithubAction的工作流程和我之前用的Jenkins大体上差不多,但是GithubAction作为第三方服务不用单独部署使用,而且与Github使用联系紧密。
这里只是简单演示如何使用GithubAction完成CI/CD的过程。官方提供了很多内置workFlow模板,开发起来相对便捷。
项目原地址:https://github.com/HiFxs/GithubActionDemo
使用GithubAction自动构建部署项目的更多相关文章
- Ant + Jenkies +Tomcat 自动构建部署Web项目
		前言:博主资历尚浅,很多东西都还在刚起步学习的阶段,这几天开发任务比较轻,就在自己window系统下,模拟部署远程服务器,利用Jenkies + Ant + Tomcat 搭建了一个自动发布部署的环境 ... 
- 使用Docker+Jenkins自动构建部署
		环境 Windows 10 Docker Version 18.06.1-ce-win73 (19507) 运行jenkins 运行jenkins 容器 docker run -d --name ln ... 
- Linux下Jenkins与GitHub自动构建Node项目(Vue)
		根据上篇文章<Linux下Jenkins与GitHub自动构建NetCore与部署>,我们知道了Jenkins的强大功能,自动构建,部署了一个NetCore的Web,让开发人员专注于开发, ... 
- Yeoman自动构建js项目
		Aug 19, 2013 Tags: bowergruntJavascriptjsnodejsyeomanyo Comments: 10 Comments Yeoman自动构建js项目 从零开始nod ... 
- 使用jekins自动构建部署java maven项目(jdk1.7+tomcat7.0+jenkins2.19.3)
		1.下载jenkins 地址:https://jenkins.io/index.html 本人下载了2.19.3版本的war包:jenkins.war 2.安装jenkins 拷贝jenkins.wa ... 
- 使用jenkins进行项目的自动构建部署
		jenkins 简介 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:持续的软件版本发布/测试项目和监控外部调用执行的工作. 官网地址地址: https://je ... 
- 解放双手 | Jenkins + gitlab + maven 自动打包部署项目
		前言 记录 Jenkins + gitlab + maven 自动打包部署后端项目详细过程! 需求背景 不会偷懒的程序员不是好码农,传统的项目部署,有时候采用本地手动打包,再通过ssh传到服务器部署运 ... 
- Ubuntu系统下使用Jenkins进行项目的自动构建还是项目回滚方法
		上面虽然实现了项目的自动部署,但是有时部署失败的时候我们需要回滚到指定版本的构建,这样才能更灵活的进行项目的构建部署.我们可以选择“参数化的构建过程”进行传递不同的参数来选择是进行新的构建还是回滚 如 ... 
- 【转】使用Docker+Jenkins自动构建部署
		转载自 https://segmentfault.com/a/1190000012921606 环境 阿里云ESC,宿主机服务器安装Docker,在安全规则中确认8080端口开启. 客户端mac 运行 ... 
- 小伙伴想学Jenkins自动构建发布项目,我:安排上了!!
		写在前面 趁着十一长假,很多小伙伴都在悄悄学习,有些是为了能够顺利通过面试,进入大厂升职加薪.有些则是为了进一步巩固和提高自己的专业技能,希望有朝一日能过成为互联网架构师乃至技术专家.这不,就有小伙伴 ... 
随机推荐
- element-ui跨行
			1 <template> 2 <el-table :data="scheduleList" :span-method="objectSpanMethod ... 
- nuxt中处理跨域
			一.安装 npm install @nuxtjs/axios @nuxtjs/proxy -S 二.nuxt.config.js进行配置 modules:[ '@nuxtjs/axios' ' ... 
- Linux下查看全部的环境变量
			在Windows下,查看环境变量的命令是:set,这个命令会输出系统当前的环境变量. ... Linux查看环境变量使用env命令显示所有的环境变量 $ env 
- vite+vue3批量导入静态资源图片;动态绑定大量图片
			vite版本:vite3:vue版本:vue3 打包上线后发现,动态绑定的图片皆失效. 单图可用 import 导入解决,但是若有大量图片,一一导入则耗时耗力. vue2+webpack 可用 req ... 
- CentOS 8.x下编译php 7.4、php5.6、php5.3多版本报错处理教程
			一.编译安装php 7.4.x 参考CentOS 8.0.1905编译安装Nginx1.16.1+MySQL8.0.18+PHP7.3.10 1.安装编译工具及库文件(使用yum命令安装) yum i ... 
- 用python提取txt文件中的特定信息并写入Excel
			这个是用 excel里面的 去掉空格最后导出的一个list: 原本是有空格的 后面是抵消了中间的空格. 然后 这里侧重说一下什么是split()函数 语法:str.split(str="&q ... 
- Object.definedProperty和Proxy的对比
			Object.definedProperty和Proxy经常用来实现对象的劫持 Object.definedProperty是vue2.x拦截对象属性变化的方法,再结合订阅-发布者模式和观察者模式实现 ... 
- jQuery实现论坛发帖Demo
			目录 效果展示 思路 代码 改进空间 效果展示 思路 主要知识点:运用jQuery对HTML元素节点的操作(append)来添加帖子. 交互设计:用户点击页面上的"论坛发帖"按钮, ... 
- PHP中获取时间的下一周下个月的方法
			PHP中获取时间的下一周,下个月等通常用于定制服务的时候使用,比如包月会员,包年等等 //通常用于定制服务的时候使用,比如包月会员,包年等等 //获取当前时间过一个月的时间,以DATETIME格式显示 ... 
- Pytorch Cross Entropy
			Entropy Uncetainly measure of surprise higher entropy = less info \[Entropy = -\sum_i P(i)\log P(i) ... 
