大连全瓷种植牙齿制作中心 发表于 2024-10-12 18:46:13

从代码到部署: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配置详解

https://i-blog.csdnimg.cn/direct/024d0b3660d946068ee868451a0f1e8b.jpeg#pic_center
以下是完整的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链接可以直接跳转到当次提交页。
https://i-blog.csdnimg.cn/direct/aa3f03a4bca047fabd16674e7dcde261.jpeg#pic_center
4. 关键点回首



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

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 从代码到部署:GitHub Actions实现Java项目CI/CD的完整实践