Skip to main content

Průvodce CI/CD

Šablony GitHub Actions

Požadovaná tajemství (secrets) úložiště: Nakonfigurujte v úložišti GitHub v Settings → Secrets and Variables → Actions:

Název tajemstvíPopisVyžadováno
DOCKERHUB_USERNAMEUživatelské jméno Docker Hub (pro odesílání obrazů)Vyžadováno pro aplikace Docker
DOCKERHUB_TOKENPřístupový token Docker Hub (ne heslo)Vyžadováno pro aplikace Docker
GPG_PRIVATE_KEYSoukromý klíč GPG pro podpis balíčků (budoucí)Volitelné
GPG_PASSPHRASEHeslová fráze klíče GPGVolitelné

Nikdy nehardcodujte pověření do souborů workflow. Vždy používejte GitHub Secrets.

Aplikace Deb používají následující workflow GitHub Actions. Nahraďte <appid> svým skutečným ID aplikace a ./app-root cestou ke kořenovému adresáři vašeho balíčku Deb.

# .github/workflows/build-deb.yml
name: Build Deb Package

on:
push:
tags:
- 'v*'
pull_request:
branches: [main]

jobs:
build:
strategy:
matrix:
arch: [amd64, arm64]
include:
- arch: amd64
runner: ubuntu-latest
- arch: arm64
runner: ubuntu-latest

runs-on: ${{ matrix.runner }}

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up QEMU (arm64)
if: matrix.arch == 'arm64'
uses: docker/setup-qemu-action@v3

- name: Install build dependencies
run: |
sudo apt-get update
sudo apt-get install -y dpkg-dev debhelper lintian

- name: Build deb package
run: |
dpkg-deb --build ./app-root ./<appid>_${{ github.event.release.tag_name }}_${{ matrix.arch }}.deb

- name: Validate package
run: |
dpkg-deb -c ./*.deb
dpkg-deb -I ./*.deb
lintian ./*.deb || true

- name: Generate checksums
run: |
sha256sum ./*.deb > ./*.deb.sha256

- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: deb-${{ matrix.arch }}
path: |
*.deb
*.sha256

release:
needs: build
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')

steps:
- name: Download artifacts
uses: actions/download-artifact@v4

- name: Create GitHub Release
uses: softprops/action-gh-release@v1
with:
files: |
deb-amd64/*.deb
deb-amd64/*.sha256
deb-arm64/*.deb
deb-arm64/*.sha256

Sestavení pro více architektur

Aplikace Docker:

# .github/workflows/build-docker.yml
name: Build and Push Docker Image

on:
push:
tags:
- 'v*'

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up QEMU
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/<appid>:latest
${{ secrets.DOCKERHUB_USERNAME }}/<appid>:${{ github.ref_name }}

- name: Security scan
uses: aquasecurity/trivy-action@master
with:
image-ref: '${{ secrets.DOCKERHUB_USERNAME }}/<appid>:${{ github.ref_name }}'
format: 'table'
exit-code: '1'
severity: 'CRITICAL,HIGH'

Automatizovaná validace

Přidejte validační workflow, který při každém pushnutí kontroluje konfigurační soubory. Validační skript by měl také zkontrolovat, zda type a open_path neexistují současně; pokud ano, ohlásit chybu.

# .github/workflows/validate.yml
name: Validate Configuration

on:
push:
pull_request:

jobs:
validate:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Validate config.ini (JSON format)
run: |
python3 -c "import json; json.load(open('config.ini'))"
echo "config.ini JSON format is valid"

- name: Validate required fields
run: |
python3 -c "
import json
config = json.load(open('config.ini'))
required = ['id', 'icon', 'publisher', 'exec', 'version', 'low_version',
'category', 'depend', 'platform', 'application_type', 'user',
'all_user_display', 'allow_open_in_mobile']
for field in required:
assert field in config, f'Missing required field: {field}'

# Validate Deb-specific fields
if config['application_type'] == 'deb':
assert config.get('system_id'), 'Deb application must have system_id'
assert config.get('package'), 'Deb application must have package'

# Validate category count
assert len(config['category']) <= 3, 'Maximum 3 categories'

# Validate type and open_path cannot coexist
if 'type' in config and 'open_path' in config:
raise AssertionError('type and open_path cannot both exist; choose only one')

print('All validations passed!')
"

- name: Validate app.lang (14 languages)
run: |
python3 -c "
required_langs = ['zh-cn', 'zh-hk', 'en-us', 'fr-fr', 'de-de',
'it-it', 'es-es', 'hu-hu', 'ja-jp', 'ko-kr',
'pl-pl', 'ru-ru', 'tr-tr', 'pt-pt']
with open('app.lang', 'r') as f:
content = f.read()
for lang in required_langs:
assert f'[{lang}]' in content, f'Missing language: {lang}'
print('All 14 languages present!')
"

- name: Validate icon (SVG format)
run: |
python3 -c "
import json, os
config = json.load(open('config.ini'))
icon_path = config['icon']
icon_file = icon_path.lstrip('/')
assert os.path.exists(icon_file), f'Icon not found: {icon_file}'
with open(icon_file, 'r') as f:
content = f.read()
assert '<svg' in content and '</svg>' in content, 'Not a valid SVG file'
assert 'viewBox' in content, 'SVG missing viewBox attribute'
print(f'Icon validation passed: {icon_file}')
"

Gitee Actions (vývojáři v Číně)

Pro vývojáře hostující na Gitee přizpůsobte workflow GitHub Actions formátu Gitee CI/CD. Kompletní šablony Gitee CI/CD jsou k dispozici na TOS Developer Platform. Gitee používá konfigurační formát gitee-ci.yml. Pokyny k nastavení prostředí naleznete v dokumentaci Gitee.

Vydání a nahrání

Po úspěšném sestavení:

  1. Vytvořte GitHub Release s balíčkem deb a kontrolními součty
  2. V případě potřeby aktualizujte config.ini a app.lang v úložišti
  3. Odešlete novou verzi prostřednictvím TOS Developer Platform
  4. Propojte tag Release s podáním verze