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

打印 上一主题 下一主题

主题 837|帖子 837|积分 2526

从代码到部署: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配置文件:
  1. name: CI/CD Pipeline
  2. on:
  3.   push:
  4.     branches:
  5.       - master
  6.   pull_request:
  7.     branches:
  8.       - master
  9. jobs:
  10.   build-and-deploy:
  11.     runs-on: ubuntu-latest
  12.     steps:
  13.       - name: Checkout code
  14.         uses: actions/checkout@v3
  15.       - name: Set up JDK 17
  16.         uses: actions/setup-java@v3
  17.         with:
  18.           java-version: '17'
  19.           distribution: 'temurin'
  20.       - name: Build with Maven
  21.         run: mvn clean package -DskipTests
  22.       - name: Deploy to ECS
  23.         env:
  24.           ECS_IP: ${{ secrets.SERVER_HOST }}
  25.           ECS_USER: ${{ secrets.SERVER_USER }}
  26.           ECS_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}
  27.         run: |
  28.           mkdir -p ~/.ssh
  29.           echo "${{ secrets.SERVER_SSH_KEY }}" > ~/.ssh/id_rsa
  30.           chmod 600 ~/.ssh/id_rsa
  31.           scp -o StrictHostKeyChecking=no target/*.jar ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/project/smartwork.jar
  32.           ssh -o StrictHostKeyChecking=no ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF'
  33.             if pgrep -f "java.*smartwork.jar"; then
  34.               pkill -f "java.*smartwork.jar"
  35.             fi
  36.             nohup java -jar /project/smartwork.jar > /project/app.log 2>&1 &
  37.           EOF
  38.       - name: Get commit information
  39.         id: commit_info
  40.         run: |
  41.           COMMIT_MESSAGE=$(git log -1 --pretty=%B)
  42.           echo "COMMIT_MESSAGE=${COMMIT_MESSAGE}" >> $GITHUB_ENV
  43.       - name: Send Telegram notification
  44.         run: |
  45.           COMMIT_URL="https://github.com/${{ github.repository }}/commit/${{ github.sha }}"
  46.           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 将当前仓库代码检出到运行环境中。这一步可以确保我们操作的是最新提交的代码。
  1. - name: Checkout code
  2.   uses: actions/checkout@v3
复制代码
3.2 设置Java环境

接下来,使用 actions/setup-java@v3 设置JDK 17的开发环境,以确保Java项目可以或许在构建服务器上正常编译运行。
  1. - name: Set up JDK 17
  2.   uses: actions/setup-java@v3
  3.   with:
  4.     java-version: '17'
  5.     distribution: 'temurin'
复制代码
3.3 构建和打包

项目通过Maven构建,并打包成 .jar 文件。-DskipTests 用于跳过测试,以加快打包速率。
  1. - name: Build with Maven
  2.   run: mvn clean package -DskipTests
复制代码
3.4 部署到ECS

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


  • 制止之前的应用。
  • 启动新的应用。
  1. - name: Deploy to ECS
  2.   run: |
  3.     mkdir -p ~/.ssh
  4.     echo "${{ secrets.SERVER_SSH_KEY }}" > ~/.ssh/id_rsa
  5.     chmod 600 ~/.ssh/id_rsa
  6.     scp -o StrictHostKeyChecking=no target/*.jar ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/project/smartwork.jar
  7.     ssh -o StrictHostKeyChecking=no ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF'
  8.       if pgrep -f "java.*smartwork.jar"; then
  9.         pkill -f "java.*smartwork.jar"
  10.       fi
  11.       nohup java -jar /project/smartwork.jar > /project/app.log 2>&1 &
  12.     EOF
复制代码
3.5 获取提交信息

使用 git log 获取最新的提交信息,并将其存储到环境变量中,供后续使用。
  1. - name: Get commit information
  2.   id: commit_info
  3.   run: |
  4.     COMMIT_MESSAGE=$(git log -1 --pretty=%B)
  5.     echo "COMMIT_MESSAGE=${COMMIT_MESSAGE}" >> $GITHUB_ENV
复制代码
3.6 发送Telegram通知

最后,通过调用Telegram的API,向开发者发送一条包含提交信息、提交SHA和仓库信息的通知。这个功能可以让开发团队实时掌握每次部署的状态。
  1. - name: Send Telegram notification
  2.   run: |
  3.     COMMIT_URL="https://github.com/${{ github.repository }}/commit/${{ github.sha }}"
  4.     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实践提供参考和帮助。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表