从代码到部署: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实践提供参考和帮助。
版权归原作者 业余程序员Blue 所有, 如有侵权,请联系我们删除。