首页 > 编程语言 >从代码到部署:GitHub Actions实现Java项目CI/CD的完整实践

从代码到部署:GitHub Actions实现Java项目CI/CD的完整实践

时间:2024-09-22 19:20:42浏览次数:11  
标签:CI GitHub Java name secrets SERVER github COMMIT

从代码到部署:GitHub Actions实现Java项目CI/CD的完整实践

在现代软件开发中,持续集成和持续部署(CI/CD)已经成为了团队高效交付代码的关键策略。通过GitHub Actions,可以轻松配置CI/CD流水线,实现从代码提交到部署的自动化工作流。本文将基于英语听力网站(studytool.site)项目介绍如何基于一个真实的GitHub Actions脚本,通过持续集成和持续部署实现对应用程序的自动化管理。

1. 项目背景

该实践使用了GitHub Actions来实现CI/CD,包含以下主要功能:

  • 自动构建Java项目。
  • 使用Maven打包项目。
  • 部署到远程ECS服务器。
  • 通过Telegram通知开发者最新的提交情况。

2. GitHub Actions配置详解

在这里插入图片描述

以下是完整的GitHub Actions配置文件:

name: CI/CD Pipeline

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Build with Maven
        run: mvn clean package -DskipTests

      - name: Deploy to ECS
        env:
          ECS_IP: ${{ secrets.SERVER_HOST }}
          ECS_USER: ${{ secrets.SERVER_USER }}
          ECS_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.SERVER_SSH_KEY }}" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa

          scp -o StrictHostKeyChecking=no target/*.jar ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/project/smartwork.jar

          ssh -o StrictHostKeyChecking=no ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF'
            if pgrep -f "java.*smartwork.jar"; then
              pkill -f "java.*smartwork.jar"
            fi

            nohup java -jar /project/smartwork.jar > /project/app.log 2>&1 &
          EOF

      - name: Get commit information
        id: commit_info
        run: |
          COMMIT_MESSAGE=$(git log -1 --pretty=%B)
          echo "COMMIT_MESSAGE=${COMMIT_MESSAGE}" >> $GITHUB_ENV

      - name: Send Telegram notification
        run: |
          COMMIT_URL="https://github.com/${{ github.repository }}/commit/${{ github.sha }}"
          curl -s -X POST https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage           -d chat_id=${{ secrets.TELEGRAM_CHAT_ID }}           -d parse_mode="HTML"           -d text=$'✅ <b>New commit to</b> <code>${{ github.repository }}</code> <b>on branch</b> <code>${{ github.ref_name }}</code>\n\n<b>Commit Author</b>: <code>${{ github.actor }}</code>\n<b>Commit Message</b>: <code>${{ env.COMMIT_MESSAGE }}</code>\n<b>Commit SHA</b>: <a href="'${COMMIT_URL}'">${{ github.sha }}</a>'

3. CI/CD流程分析

3.1 检出代码

第一步是使用 actions/checkout@v3 将当前仓库代码检出到运行环境中。这一步可以确保我们操作的是最新提交的代码。

- name: Checkout code
  uses: actions/checkout@v3

3.2 设置Java环境

接下来,使用 actions/setup-java@v3 设置JDK 17的开发环境,以确保Java项目能够在构建服务器上正常编译运行。

- name: Set up JDK 17
  uses: actions/setup-java@v3
  with:
    java-version: '17'
    distribution: 'temurin'

3.3 构建和打包

项目通过Maven构建,并打包成 .jar 文件。-DskipTests 用于跳过测试,以加快打包速度。

- name: Build with Maven
  run: mvn clean package -DskipTests

3.4 部署到ECS

通过 scpssh 将打包好的 .jar 文件传输到远程ECS服务器,并通过SSH远程执行命令来部署应用。此步骤确保:

  • 停止之前的应用。
  • 启动新的应用。
- name: Deploy to ECS
  run: |
    mkdir -p ~/.ssh
    echo "${{ secrets.SERVER_SSH_KEY }}" > ~/.ssh/id_rsa
    chmod 600 ~/.ssh/id_rsa
    scp -o StrictHostKeyChecking=no target/*.jar ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/project/smartwork.jar
    ssh -o StrictHostKeyChecking=no ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF'
      if pgrep -f "java.*smartwork.jar"; then
        pkill -f "java.*smartwork.jar"
      fi
      nohup java -jar /project/smartwork.jar > /project/app.log 2>&1 &
    EOF

3.5 获取提交信息

使用 git log 获取最新的提交信息,并将其存储到环境变量中,供后续使用。

- name: Get commit information
  id: commit_info
  run: |
    COMMIT_MESSAGE=$(git log -1 --pretty=%B)
    echo "COMMIT_MESSAGE=${COMMIT_MESSAGE}" >> $GITHUB_ENV

3.6 发送Telegram通知

最后,通过调用Telegram的API,向开发者发送一条包含提交信息、提交SHA和仓库信息的通知。这个功能可以让开发团队实时掌握每次部署的状态。

- name: Send Telegram notification
  run: |
    COMMIT_URL="https://github.com/${{ github.repository }}/commit/${{ github.sha }}"
    curl -s -X POST https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage     -d chat_id=${{ secrets.TELEGRAM_CHAT_ID }}     -d parse_mode="HTML"     -d text=$'✅ <b>New commit to</b> <code>${{ github.repository }}</code> <b>on branch</b> <code>${{ github.ref_name }}</code>\n\n<b>Commit Author</b>: <code>${{ github.actor }}</code>\n<b>Commit Message</b>: <code>${{ env.COMMIT_MESSAGE }}</code>\n<b>Commit SHA</b>: <a href="'${COMMIT_URL}'">${{ github.sha }}</a>'

推送通知如下图,点击commit SHA链接可以直接跳转到当次提交页。

在这里插入图片描述

4. 关键点回顾

  • 自动化部署:通过GitHub Actions和SSH,将应用自动部署到远程服务器,极大地减少了人工干预。
  • 通知机制:通过Telegram的通知功能,开发者可以实时了解部署的状态和提交信息。
  • 安全性:使用GitHub Secrets存储敏感信息,如服务器的SSH密钥和Telegram的Bot Token,确保了数据的安全。

5. 总结

通过这一CI/CD实践,我们展示了如何利用GitHub Actions实现从代码提交到自动部署的完整流水线。这一自动化流程可以显著提高开发效率,并且通过通知机制增强了团队协作的透明度。希望这篇文章能为大家的CI/CD实践提供参考和帮助。

标签:CI,GitHub,Java,name,secrets,SERVER,github,COMMIT
From: https://blog.csdn.net/ooobama/article/details/142439888

相关文章

  • 技术名称通解 --- 什么是 CICD?
    持续集成(ContinuousIntegration,CI):CI是CICD的第一部分,通俗解释,CI就是使用一系列可选工具测试更新后代码的可用性,比如我要测试代码的安全性,我用安全工具和代码仓库关联起来自动测试。CI的主要目标是快速发现集成问题,确保每次代码更改不会破坏已有的功能。持续交付(Con......
  • Java反射机制
    1、什么是Java反射机制?Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。2、......
  • 使用java做一个微信机器人
    微信机器人这个功能,目前在市面上运用的还是不是很多,每个人实现机器人的目的也不一样,有的为了自动加好友;有的为了自动拉群:也有的为了机器人对话聊天等等一系列。想必大家对微信机器人感兴趣的伙伴,也在aithub上面搜索了很多吧,但是大多数走到一半遇到各种bug就没有继续坚持走下去,原......
  • java基础
    java基础语法对象/类/方法/实例/继承对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色,名字,品种;行为有:摇尾巴,叫,吃等。类:类是一个模版,它描述一类对象的行为和状态方法:方法就是行为,一个类可以有很多方法。逻辑运算,数据修改以及所有动作都是在方法......
  • java计算机毕业设计抗疫资源调配平台(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在全球抗击新冠疫情的持久战中,资源的有效调配成为决定战役成败的关键因素之一。面对突如其来的疫情高峰,各地医院对医疗物资、人力资源的需求急剧增加......
  • java计算机毕业设计篮球论坛系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:在数字化时代,篮球运动作为一项广受欢迎的全民健身活动,其爱好者群体日益庞大且需求多元化。随着互联网的普及,篮球爱好者们渴望一个集信息交流、技术分......
  • java计算机毕业设计吕梁学院微门户(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在信息化高速发展的今天,高等教育领域正经历着深刻的变革。吕梁学院作为一所充满活力与潜力的高等学府,其信息化建设对于提升教学质量、优化管理效率、......
  • 论 JAVA 集合框架中 接口与类的关系
    前言这是笔者在学习过程中的一篇"备忘录",其目的是能用最EZ最粗鄙的语言口述出JAVA集合框架中所有类与接口的关系本人在不断地学习中,总会混淆集合框架中的类和接口,以及它们的作用关系,虽然不影响我的使用,但是我也不想一直糊涂下去,故而趁知识还没混淆之际,赶紧写下来.......
  • MySQL 的 ACID 属性:保障数据完整性的基石
    《MySQL的ACID属性:保障数据完整性的基石》在数据库领域,MySQL以其强大的功能和广泛的应用而备受青睐。其中,ACID属性是MySQL保证数据完整性和可靠性的重要特性。那么,什么是MySQL的ACID属性呢?它又是如何在实际应用中发挥作用的呢?让我们一起来深入了解一下。一、ACID属性......
  • JavaScript二进制浮点数和四舍五入错误
    二进制浮点数和四舍五入错误实数有无数个,但JS通过浮点数的形式,只能表示有限个数,JS表现的常常是真实值的近似表示。二进制无法表示类似于0.1这样的十进制数字,只能机器近似于0.1,看如下代码:<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>3......