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 strategy: fail-fast: false matrix: include: - name: bff dockerfile: bff/Dockerfile - name: product dockerfile: services/product/Dockerfile - name: admin dockerfile: services/admin/Dockerfile - name: user dockerfile: services/user/Dockerfile - name: ad dockerfile: services/ad/Dockerfile - name: chore dockerfile: services/chore/Dockerfile - name: express dockerfile: services/express/Dockerfile - name: sale dockerfile: services/sale/Dockerfile - name: wecom dockerfile: services/wecom/Dockerfile 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: | docker buildx use default docker buildx build --builder default --load -f "${{ matrix.dockerfile }}" -t "${{ vars.REGISTRY }}/$NAME:latest" . - name: Docker push if: steps.check.outputs.build == 'yes' run: | docker push ${{ vars.REGISTRY }}/$NAME:latest