name: CI on: push: branches: - develop paths: - "bff/**" - "services/**" - "rpc/**" - "pkg/**" - ".gitea/workflows/ci.yml" workflow_dispatch: jobs: changes: runs-on: runner outputs: build_list: ${{ steps.filter.outputs.build_list }} steps: - name: Checkout uses: https://git.ailuowan.com/deploy/checkout@v4 with: fetch-depth: 0 - name: Detect changes id: filter run: | SERVICES="bff product admin user ad chore express sale wecom" pattern_for() { case "$1" in bff) echo '^(bff|pkg|rpc)/|^\.gitea/workflows/ci\.yml$' ;; *) echo "^(services/$1|rpc/$1|pkg)/|^\\.gitea/workflows/ci\\.yml$" ;; esac } build_all=false if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then build_all=true else before="${{ github.event.before }}" if [ -z "$before" ] || [ "$before" = "0000000000000000000000000000000000000000" ]; then changed=$(git ls-files) else changed=$(git diff --name-only "$before" "${{ github.sha }}") fi echo "changed files:" echo "$changed" fi build_list="" for svc in $SERVICES; do should_build=false if [ "$build_all" = true ]; then should_build=true elif echo "$changed" | grep -qE "$(pattern_for "$svc")"; then should_build=true fi if [ "$should_build" = true ]; then if [ -n "$build_list" ]; then build_list="$build_list,$svc" else build_list="$svc" fi echo "$svc=yes" else echo "$svc=no" fi done echo "build_list=$build_list" >> "$GITHUB_OUTPUT" echo "build_list=$build_list" docker: needs: changes runs-on: runner name: ${{ matrix.name }} strategy: fail-fast: false matrix: name: - bff - product - admin - user - ad - chore - express - sale - wecom env: BUILD_LIST: ${{ needs.changes.outputs.build_list }} NAME: lone/${{ matrix.name }} steps: - name: Check changes id: check run: | if echo ",$BUILD_LIST," | grep -q ",${{ matrix.name }},"; then echo "build=yes" >> "$GITHUB_OUTPUT" else echo "build=no" >> "$GITHUB_OUTPUT" echo "skip ${{ matrix.name }} (no changes)" fi - name: Checkout if: steps.check.outputs.build == 'yes' uses: https://git.ailuowan.com/deploy/checkout@v4 - name: Login Registry if: steps.check.outputs.build == 'yes' run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login ${{ vars.REGISTRY }} -u "${{ vars.REGISTRY_USERNAME }}" --password-stdin - name: Docker build if: steps.check.outputs.build == 'yes' run: | case "${{ matrix.name }}" in bff) dockerfile="bff/Dockerfile" ;; *) dockerfile="services/${{ matrix.name }}/Dockerfile" ;; esac docker buildx use default docker buildx build --builder default --load -f "$dockerfile" -t "${{ vars.REGISTRY }}/$NAME:latest" . - name: Docker push if: steps.check.outputs.build == 'yes' run: | docker push ${{ vars.REGISTRY }}/$NAME:latest