0


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

从代码到部署: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

通过

scp

ssh

将打包好的

.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实践提供参考和帮助。

标签: github java ci/cd

本文转载自: https://blog.csdn.net/ooobama/article/details/142439888
版权归原作者 业余程序员Blue 所有, 如有侵权,请联系我们删除。

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

还没有评论