Some checks failed
Go CI Pipeline / Run Tests (push) Successful in 2m21s
Go CI Pipeline / Lint Code (push) Successful in 3m0s
DNS & Network Test / network-test (push) Failing after 3s
Go CI Pipeline / Security Scan (SCA - govulncheck) (push) Successful in 2m47s
Go CI Pipeline / Build Application (push) Successful in 1m2s
Go CI Pipeline / Build and Push Docker Image (push) Failing after 3m1s
Go CI Pipeline / Deploy to VPS (push) Has been skipped
207 lines
8.2 KiB
YAML
207 lines
8.2 KiB
YAML
# File: .gitea/workflows/ci.yml (Phiên bản cải thiện)
|
|
|
|
name: Go CI Pipeline
|
|
|
|
# Step 1: Thêm trigger pull_request
|
|
on:
|
|
push:
|
|
branches: [ master ] # Hoặc main
|
|
|
|
jobs:
|
|
# ---- Job: Lint Code ----
|
|
lint:
|
|
name: Lint Code
|
|
# Step 3: Chuẩn hóa runs-on
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
# Step 2: Cập nhật action versions
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
|
|
# Step 2: Cập nhật action versions
|
|
- name: Set up Go
|
|
uses: actions/setup-go@v5
|
|
with:
|
|
go-version: '1.23' # Đặt phiên bản Go của bạn
|
|
cache-dependency-path: go.sum # Bật cache cho Go modules
|
|
|
|
- name: Run golangci-lint
|
|
uses: golangci/golangci-lint-action@v6
|
|
with:
|
|
version: latest # Hoặc phiên bản cụ thể
|
|
args: --timeout=5m # Giữ timeout
|
|
# Gợi ý: Tạo file .golangci.yml trong repo để cấu hình chi tiết,
|
|
# bao gồm bật các linter bảo mật như 'gosec' để có SAST cơ bản.
|
|
# cache: true # Cân nhắc bật cache của golangci-lint nếu cần
|
|
|
|
# ---- Job: Run Tests ----
|
|
test:
|
|
name: Run Tests
|
|
# Step 3: Chuẩn hóa runs-on
|
|
runs-on: ubuntu-latest
|
|
# needs: [lint] # Có thể chạy song song với lint
|
|
steps:
|
|
# Step 2: Cập nhật action versions
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
|
|
# Step 2: Cập nhật action versions
|
|
- name: Set up Go
|
|
uses: actions/setup-go@v5
|
|
with:
|
|
go-version: '1.23'
|
|
cache-dependency-path: go.sum
|
|
|
|
# Step 7: Cài đặt tool tạo report JUnit
|
|
- name: Install go-junit-report
|
|
run: go install github.com/jstemmer/go-junit-report@latest
|
|
|
|
# Step 7: Chạy test, tạo coverage và report JUnit
|
|
- name: Run Go Test, Coverage and Generate JUnit Report
|
|
run: |
|
|
# Chạy test với -v để go-junit-report có input, lưu output vào file log
|
|
go test -v -race -coverprofile=coverage.out ./... | tee test-output.log
|
|
# Tạo report JUnit từ output log
|
|
cat test-output.log | ~/go/bin/go-junit-report -set-exit-code > report.xml
|
|
# Tạo report coverage dạng text (tùy chọn)
|
|
go tool cover -func=coverage.out
|
|
# ---- Job: Security Scan (SCA - govulncheck) ----
|
|
sca_scan:
|
|
name: Security Scan (SCA - govulncheck)
|
|
# Step 3: Chuẩn hóa runs-on
|
|
runs-on: ubuntu-latest
|
|
# needs: [lint, test] # Có thể chạy song song với test và lint
|
|
steps:
|
|
# Step 2: Cập nhật action versions
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
|
|
# Step 2: Cập nhật action versions
|
|
- name: Set up Go
|
|
uses: actions/setup-go@v5
|
|
with:
|
|
go-version: '1.23'
|
|
cache-dependency-path: go.sum
|
|
|
|
# Step 5: Thay Trivy bằng govulncheck action
|
|
- name: Run Go Vulnerability Check (govulncheck)
|
|
uses: golang/govulncheck-action@v1
|
|
# govulncheck sẽ tự động fail job nếu tìm thấy lỗ hổng có thể bị ảnh hưởng
|
|
|
|
# ---- Job: Build ----
|
|
build:
|
|
name: Build Application
|
|
# Step 3: Chuẩn hóa runs-on
|
|
runs-on: ubuntu-latest
|
|
# Quan trọng: needs phải bao gồm tất cả các job kiểm tra trước đó
|
|
needs: [lint, test, sca_scan]
|
|
steps:
|
|
# Step 2: Cập nhật action versions
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
|
|
# Step 2: Cập nhật action versions
|
|
- name: Set up Go
|
|
uses: actions/setup-go@v5
|
|
with:
|
|
go-version: '1.23'
|
|
cache-dependency-path: go.sum
|
|
|
|
# Step 6: Build với các cờ tối ưu và version info
|
|
- name: Build Go Application
|
|
run: |
|
|
# Lấy thông tin version (ví dụ: tên tag hoặc tên nhánh + SHA ngắn)
|
|
# Lưu ý: Biến context của Gitea có thể là gitea.* thay vì github.*
|
|
APP_VERSION="${{ gitea.ref_name }}-${{ format('{0}', gitea.sha) }}"
|
|
# Thay main.version bằng đường dẫn thực tế đến biến version trong code của bạn
|
|
go build -v -ldflags="-s -w -X main.version=${APP_VERSION}" -o ./bin/server ./cmd/server
|
|
# Step 6: Upload artifact binary
|
|
# Step 2: Cập nhật action versions
|
|
- name: Upload build artifact
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: server-binary # Tên artifact rõ ràng hơn
|
|
path: ./bin/server # Đường dẫn tới file binary
|
|
# ---- Job: Build & Push Docker Image ----
|
|
docker-build-push:
|
|
name: Build and Push Docker Image
|
|
runs-on: ubuntu-latest
|
|
# Chạy sau khi job 'build' (tạo binary) thành công
|
|
needs: [build]
|
|
# Chỉ chạy khi push vào nhánh master (không chạy cho PR)
|
|
# Kiểm tra lại biến context của Gitea Actions, có thể là 'gitea.ref_name' hoặc 'github.ref_name'
|
|
if: github.ref_name == 'master' || gitea.ref_name == 'master'
|
|
steps:
|
|
- name: Checkout code # Cần checkout để lấy Dockerfile.prod
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Download build artifact # Tải artifact binary từ job 'build'
|
|
uses: actions/download-artifact@v3 # Dùng v3 cho Gitea
|
|
with:
|
|
name: server-binary # Tên artifact đã upload ở job build
|
|
path: ./bin # Giải nén vào thư mục ./bin
|
|
|
|
- name: Set up QEMU # Cần cho build đa kiến trúc (tùy chọn)
|
|
uses: docker/setup-qemu-action@v3
|
|
|
|
- name: Set up Docker Buildx # Công cụ build image nâng cao
|
|
uses: docker/setup-buildx-action@v3
|
|
|
|
- name: Login to Gitea Container Registry # Đăng nhập vào registry
|
|
uses: docker/login-action@v3
|
|
with:
|
|
registry: ${{ gitea.server_url }} # Biến context chứa URL Gitea (vd: gitea.tuvanwebsite.com) - Kiểm tra lại biến đúng
|
|
username: ${{ secrets.REGISTRY_USER }}
|
|
password: ${{ secrets.REGISTRY_PASSWORD }}
|
|
|
|
- name: Build and push Docker image
|
|
uses: docker/build-push-action@v5
|
|
with:
|
|
context: . # Build context là thư mục gốc
|
|
file: ./Dockerfile.prod # Chỉ định Dockerfile cho production
|
|
push: true # Đẩy image lên registry
|
|
tags: | # Đặt tên và tag cho image
|
|
${{ gitea.server_url }}/${{ gitea.repository }}:${{ gitea.sha }} # Tag bằng commit SHA (duy nhất)
|
|
${{ gitea.server_url }}/${{ gitea.repository }}:latest # Tag là latest
|
|
# cache-from: type=gha # Bật cache build layer (tùy chọn)
|
|
# cache-to: type=gha,mode=max
|
|
# ---- Job: Deploy to VPS ----
|
|
deploy:
|
|
name: Deploy to VPS
|
|
runs-on: ubuntu-latest # Job này phải chạy trên runner có quyền truy cập Docker socket của host
|
|
# Chạy sau khi build và push image thành công
|
|
needs: [docker-build-push]
|
|
# Chỉ chạy khi push vào nhánh master
|
|
if: github.ref_name == 'master' || gitea.ref_name == 'master'
|
|
steps:
|
|
# Lấy thông tin image vừa push
|
|
# Lưu ý: Kiểm tra lại biến context chính xác của Gitea Actions
|
|
- name: Set image name
|
|
run: echo "IMAGE_NAME=${{ gitea.server_url }}/${{ gitea.repository }}:${{ gitea.sha }}" >> $GITHUB_ENV
|
|
|
|
- name: Deploy using Docker commands
|
|
run: |
|
|
echo "Deploying image: ${{ env.IMAGE_NAME }}"
|
|
# Kéo image mới nhất về VPS host (thông qua runner)
|
|
docker pull ${{ env.IMAGE_NAME }}
|
|
|
|
# Dừng container cũ nếu đang chạy (bỏ qua lỗi nếu chưa có)
|
|
docker stop my-go-app-container || true
|
|
|
|
# Xóa container cũ nếu tồn tại (bỏ qua lỗi nếu chưa có)
|
|
docker rm my-go-app-container || true
|
|
|
|
# Chạy container mới từ image vừa kéo
|
|
# Quan trọng: Thêm các biến môi trường cần thiết cho ứng dụng (-e)
|
|
# và đảm bảo nó kết nối đúng network để thấy DB (-network)
|
|
docker run -d \
|
|
--name my-go-app-container \
|
|
--network gitea_network \
|
|
--restart always \
|
|
-p 8080:8080 \
|
|
-e DB_HOST=db \
|
|
-e DB_USER=gitea \
|
|
-e DB_PASSWORD=gitea \
|
|
-e DB_NAME=gitea \
|
|
${{ env.IMAGE_NAME }} # Sử dụng image vừa build/push
|