name: build-and-push-harbor on: push: branches: - main - master - dev - "feature/**" workflow_dispatch: env: GO_VERSION: "1.24" NODE_VERSION: "22" jobs: docker-build-push: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: Setup Go uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Install dependencies run: npm ci - name: Install goctl run: | go install github.com/zeromicro/go-zero/tools/goctl@latest echo "$(go env GOPATH)/bin" >> "$GITHUB_PATH" - name: Set image tags id: vars run: | echo "short_sha=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT" echo "date_tag=$(date +%Y%m%d%H%M%S)" >> "$GITHUB_OUTPUT" - name: Login Harbor env: HARBOR_REGISTRY: ${{ secrets.HARBOR_REGISTRY }} HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }} HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }} run: | echo "$HARBOR_PASSWORD" | docker login "$HARBOR_REGISTRY" -u "$HARBOR_USERNAME" --password-stdin - name: Discover docker targets id: targets shell: bash run: | set -euo pipefail : > docker-targets.txt while IFS= read -r service_dir; do service_name="$(basename "$service_dir")" while IFS= read -r svc_dir; do svc_type="$(basename "$svc_dir")" if [[ "$svc_type" == "rpc" ]]; then go_entry="$svc_dir/pb.go" else go_entry="$svc_dir/$service_name.go" fi if [[ -f "$go_entry" ]]; then echo "$go_entry" >> docker-targets.txt fi done < <(find "$service_dir" -mindepth 1 -maxdepth 1 -type d | sort) done < <(find app -mindepth 1 -maxdepth 1 -type d | sort) target_count="$(wc -l < docker-targets.txt | tr -d ' ')" echo "count=$target_count" >> "$GITHUB_OUTPUT" echo "Found $target_count docker targets" cat docker-targets.txt - name: Generate Dockerfile, build and push images if: steps.targets.outputs.count != '0' env: HARBOR_REGISTRY: ${{ secrets.HARBOR_REGISTRY }} HARBOR_PROJECT: ${{ secrets.HARBOR_PROJECT }} SHORT_SHA: ${{ steps.vars.outputs.short_sha }} DATE_TAG: ${{ steps.vars.outputs.date_tag }} shell: bash run: | set -euo pipefail while IFS= read -r target; do [[ -z "$target" ]] && continue service_name="$(echo "$target" | cut -d'/' -f2)" svc_type="$(echo "$target" | cut -d'/' -f3)" image_name="${service_name}-${svc_type}" image_ref="$HARBOR_REGISTRY/$HARBOR_PROJECT/$image_name" echo "==== Building $image_name from $target ====" npx hereby -t docker -s "$target" docker build \ -f Dockerfile \ -t "$image_ref:$SHORT_SHA" \ -t "$image_ref:$DATE_TAG" \ -t "$image_ref:latest" \ . docker push "$image_ref:$SHORT_SHA" docker push "$image_ref:$DATE_TAG" docker push "$image_ref:latest" rm -f Dockerfile done < docker-targets.txt