GitHub Actions自动化部署+Idea远程Debug
GitHub Actions
简介
"CI/CD" 是指持续集成(Continuous Integration)和持续交付(Continuous Delivery)的缩写。它是一种软件开发实践方法,旨在通过自动化构建、测试和部署的流程来加快软件交付的速度和质量。
GitHub Actions 是 GitHub 提供的一种自动化工作流程的功能。当我写完代码推送到GitHub后,他可以自动帮我们构建打包并部署到服务器上,自动完成繁琐的部署上线的步骤。
实践
首先你要有一个代码的仓库,这里我演示的是SpringBoot的一个仓库,里面只有一个Controller验证是否部署成功。
@RestController
@RequestMapping("/")
public class Controller {
@GetMapping
public String get() throws InterruptedException {
System.out.println("111");
return "ok";
}
}
GitHub Actions 创建工作流 workflows
修改自动部署的文件名,我这里填的是deploy.yml,一个简单的示例如下:
# 部署工作流的名称
name: grpc-deploy
# 你要监听哪个分支的变动
on:
push:
branches:
- main
workflow_dispatch:
# 运行环境,一般填这个即可
jobs:
build:
runs-on: ubuntu-latest
#关键配置,下面是你自定义的步骤
steps:
# 自定义的步骤名称,检查
- name: Checkout Repository
# 这些是一些模板,照抄即可
uses: actions/checkout@v3
# maven打包部署
- name: Build JAR file
run: mvn clean package -DskipTests
# 将jar包通过scp上传到你的服务器中
- name: copy file via ssh key
uses: appleboy/scp-action@master
# 你包的位置
with:
source: 'target/grpc-runner.jar'
# SSH address 服务器地址
host: ${{ secrets.HOST }}
# Remote dir path 服务器下部署文件存放路径
target: /www/jar/grpc/
# SSH Port 服务器端口
port: 22
# SSH User name 用户名
username: ${{ secrets.USERNAME }}
# SSH User password 用户密码
# password: ${{ secrets.PASSWORD }}
# key 密匙
key: ${{ secrets.DEPLOY_KEY }}
# 这个是进入的服务器终端,然后执行的命令
- name: SSH into remote server and deploy
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
script: |
cd /www/jar/grpc
java -jar grpc-runner.jar
一个大致的模板就差不多是这样,如果你有别的需求,请尽情提问ChatGPT。
然后接下来就是这个yml文件中的一些变量了,需要我们进行设置,给一个权限去进入到服务器上。
首先我们需要生成ssh公钥和密钥,我们在你的服务器上进行生成.
# 1. 进入~/.ssh文件夹中
cd ~/.ssh
# 2. 生成密钥对
ssh-keygen -t rsa -C "你的邮箱即可"
# 查看公钥,复制并追加到authorized_keys中
cat id_ed25519.pub
vim authorized_keys
# 查看秘钥,复制,---begin都需要复制,GitHub填的Deploy_key
cat id_ed25519
依次填入你的服务器登录用户名、密码、ip地址、ssh秘钥。
那么,接下来就可以尽情享受CI/CD的快乐啦。我们只需要写完代码,在Idea中push代码。
如果有报错,点进去查看即可
Idea远程Debug
简介
那么当我们使用了自动化部署,那如果当线上出现了Bug,我们要如何及时地发现问题呢?那么远程Debug就出现了。
那么这里我们介绍一下容器里面服务的远程Debug,相对于直接部署的坑更多一点。
实践
首先,我们要让JVM能接受远程调试,我们在JVM参数上加上这个参数。
# -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:39601
# port你指定即可,记住,防火墙、安全组,都需要放行端口,然后记住,很多博客都是address=port,没有了前面的*:,那么在容器部署中就会有问题,他会绑定不到ip地址。
nohup java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:39601 ./target/grpc-runner.jar > logs/nohup.out 2>&1 &
然后我们需要开启docker的远程访问的功能。
vim /usr/lib/systemd/system/docker.service
# 注释掉上面的一句,然后添加下面一句,记住9527的端口,防火墙、安全组都需要开启!!
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:9527 -H unix:///var/run/docker.sock
# 保存并退出,通知docker服务做出的修改
systemctl daemon-reload
# 重启docker
systemctl restart docker
做到这里就基本差不多啦,这里列出docker-compose.yml的代码,主要是注意java运行的参数,docker容器的暴露并映射端口。
version: '3'
services:
grpc-vedio:
image: openjdk:11
ports:
- "39600:39600"
- "39601:39601"
volumes:
- /www/jar/grpc/logs:/app/logs
- /www/jar/grpc:/app
working_dir: /app
command: bash -c "nohup java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:39601 ./target/grpc-runner.jar > logs/nohup.out 2>&1 & tail -f /dev/null"
然后Idea如此配置即可。
点击调试按钮,接下来就可以尽情享受远程Debug的乐趣啦!