Intro
- This GitHub Actions template is designed to automate the CI/CD pipeline for a backend project. It has two main stages: Build and Deploy.
Hint:
- Replacement instructions:Add the Secrets information provided above (such as DOCKER_USERNAME, NGROK_HOST, etc.) to GitHub's Secrets configuration one by one.
- When using, there is no need to modify ${{ secrets.XXXX }} in the YAML file, GitHub will automatically replace them with the corresponding Secrets values.
Applicable scenarios:
- Applicable to Docker image building and pushing.
- Supports deploying projects to specified servers and executing Kubernetes configuration through Ngrok.
name: CI/CD for Backend
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
- name: Build with Maven
run: mvn clean package -DskipTests
- name: Build Docker image
run: docker build -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest .
- name: Push Docker image to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- run: docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest
deploy:
runs-on: ubuntu-latest
needs: build
steps:
- name: Checkout code
uses: actions/checkout@v3
# Load NGROK_PORT and NGROK_HOST from the config file
- name: Load NGROK configuration
run: |
NGROK_PORT=$(yq '.NGROK_PORT' ./.github/workflows/config.yml)
NGROK_HOST=$(yq '.NGROK_HOST' ./.github/workflows/config.yml)
echo "NGROK_PORT=$NGROK_PORT" >> $GITHUB_ENV
echo "NGROK_HOST=$NGROK_HOST" >> $GITHUB_ENV
# Ensure the target directory exists
- name: Prepare target directory
run: |
sshpass -p "${{ secrets.SSH_PASSWORD }}" ssh -o StrictHostKeyChecking=no -p ${{ env.NGROK_PORT }} ${{ secrets.SSH_USER }}@${{ env.NGROK_HOST }} << 'EOF'
mkdir -p /home/linlin1/io-multiple-backend/
EOF
# Transfer code to the target server
- name: Transfer code to server
run: |
sshpass -p "${{ secrets.SSH_PASSWORD }}" scp -o StrictHostKeyChecking=no -P ${{ env.NGROK_PORT }} -r * ${{ secrets.SSH_USER }}@${{ env.NGROK_HOST }}:/home/linlin1/io-multiple-backend/
# Deploy Kubernetes configurations
- name: Deploy on server
run: |
sshpass -p "${{ secrets.SSH_PASSWORD }}" ssh -o StrictHostKeyChecking=no -p ${{ env.NGROK_PORT }} ${{ secrets.SSH_USER }}@${{ env.NGROK_HOST }} << 'EOF'
cd /home/linlin1/io-multiple-backend/k8s
kubectl apply -f .
EOF
Placeholder | Description | Example Value | Secret Key in GitHub |
---|---|---|---|
${{ secrets.DOCKER_USERNAME }} |
DockerHub username | your-docker-username | DOCKER_USERNAME |
${{ secrets.DOCKER_PASSWORD }} |
DockerHub password | your-docker-password | DOCKER_PASSWORD |
${{ secrets.DOCKER_REPO }} |
DockerHub repository name | dockerRepo | DOCKER_REPO |
${{ secrets.SSH_USER }} |
SSH username for the target server | ubuntu | SSH_USER |
${{ secrets.SSH_PASSWORD }} |
SSH password for the target server | 12345678 | SSH_PASSWORD |
configure config.yml for dynamic ip of ngork
if you choose dynamic ip configuration in ngork, then it is better to configure ngork host and port in config.yml file instead of github secrets.
- create config.yml under the same directory:
NGROK_PORT: 12345
NGROK_HOST: 0.tcp.eu.ngrok.io
Top comments (0)