Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
08f9dfb
Add native SOCKS4/SOCKS5 cache_peer support via Squid patch
claude Mar 27, 2026
e4f9f46
Add GitHub Actions workflow for Squid SOCKS patch build and test
claude Mar 27, 2026
679a116
Fix patch_apply.sh python3 heredoc and Dockerfile ARG scoping
claude Mar 27, 2026
e2e141e
Address CodeRabbit review: validation, security, and error handling
claude Mar 27, 2026
7ee9761
Fix patch_apply.sh to use correct Squid 6.10 API
claude Mar 27, 2026
a961c78
Fix compilation errors verified with local Squid 6.10 build
claude Mar 28, 2026
5bfc1de
Address review: destructor cleanup, originserver validation, ATYP enc…
claude Mar 28, 2026
1cffe57
Address CodeRabbit review: error handling and output fixes
claude Mar 28, 2026
0b05a8a
Fix Docker buildx failure: remove /var/run from install tree
claude Mar 28, 2026
59c2625
Fix CI: use serjs/go-socks5-proxy, remove connectToPeer fallback
claude Mar 28, 2026
89bee4e
Improve E2E tests: local HTTP server, better debugging
claude Mar 28, 2026
a39d6c2
CI: add artifact uploads and improve test diagnostics
claude Mar 28, 2026
9c10bd8
CI: replace Docker SOCKS5 images with microsocks built from source
claude Mar 28, 2026
a9070db
CI: add Squid startup diagnostic step with -X -d5 debug output
claude Mar 28, 2026
9878ab6
Fix CI: remove diagnostic step (port conflict), show entrypoint errors
claude Mar 28, 2026
8862c83
CI: bypass entrypoint, run Squid directly to isolate crash cause
claude Mar 28, 2026
a7b8e18
CI: post Squid container logs as PR comment on failure
claude Mar 28, 2026
8654b32
Fix Squid FATAL crash: use file-based logs, fix ACL syntax
claude Mar 28, 2026
9ec8bd1
Fix PID file permission denied: use squid-writable directory
claude Mar 28, 2026
3e325c7
Address CodeRabbit and Copilot review comments
claude Mar 28, 2026
80cfad5
Add manual GitHub Release and Container Release workflows
claude Mar 28, 2026
02e7f47
Address Copilot review: socket error handling, SOCKS5 method validati…
claude Mar 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions .github/workflows/container-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
name: Container Release

on:
workflow_dispatch:
inputs:
version:
description: 'Image tag (e.g. v1.0.0, latest)'
required: true
type: string
default: 'latest'
push_latest:
description: 'Also tag as latest'
required: false
type: boolean
default: true

permissions:
contents: read
packages: write

env:
REGISTRY: ghcr.io
IMAGE_NAME: squid-socks

jobs:
build-and-push:
name: Build & Push Container Image
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- 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 GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Prepare tags
id: tags
run: |
OWNER=$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]')
FULL_IMAGE="${{ env.REGISTRY }}/${OWNER}/${{ env.IMAGE_NAME }}"
TAGS="${FULL_IMAGE}:${{ inputs.version }}"
if [ "${{ inputs.push_latest }}" = "true" ] && [ "${{ inputs.version }}" != "latest" ]; then
TAGS="${TAGS},${FULL_IMAGE}:latest"
fi
echo "tags=${TAGS}" >> "$GITHUB_OUTPUT"
echo "image=${FULL_IMAGE}" >> "$GITHUB_OUTPUT"
echo "Tags to push: ${TAGS}"

- name: Build and push
uses: docker/build-push-action@v6
with:
context: ./squid_patch
file: ./squid_patch/Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.tags.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
labels: |
org.opencontainers.image.title=squid-socks
org.opencontainers.image.description=Squid 6.10 with native SOCKS4/SOCKS5 cache_peer support
org.opencontainers.image.source=https://github.com/${{ github.repository }}
org.opencontainers.image.version=${{ inputs.version }}

- name: Verify pushed image
run: |
docker pull ${{ steps.tags.outputs.image }}:${{ inputs.version }}
docker run --rm ${{ steps.tags.outputs.image }}:${{ inputs.version }} squid -v
echo "--- Image verification OK ---"
72 changes: 72 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
name: Release

on:
workflow_dispatch:
inputs:
version:
description: 'Release version (e.g. v1.0.0)'
required: true
type: string
prerelease:
description: 'Mark as pre-release'
required: false
type: boolean
default: false

permissions:
contents: write

jobs:
release:
name: Create GitHub Release
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Validate version format
run: |
if ! echo "${{ inputs.version }}" | grep -qE '^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$'; then
echo "ERROR: Version must match vX.Y.Z or vX.Y.Z-suffix format"
exit 1
fi

- name: Check tag does not already exist
run: |
if git rev-parse "refs/tags/${{ inputs.version }}" >/dev/null 2>&1; then
echo "ERROR: Tag ${{ inputs.version }} already exists"
exit 1
fi

- name: Generate release notes
id: notes
run: |
PREVIOUS_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -n "${PREVIOUS_TAG}" ]; then
echo "Previous tag: ${PREVIOUS_TAG}"
CHANGELOG=$(git log "${PREVIOUS_TAG}..HEAD" --pretty=format:"- %s (%h)" --no-merges)
else
echo "No previous tag found, using full history"
CHANGELOG=$(git log --pretty=format:"- %s (%h)" --no-merges -50)
fi

{
echo "notes<<EOF"
echo "## What's Changed"
echo ""
echo "${CHANGELOG}"
echo ""
echo "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${PREVIOUS_TAG:-$(git rev-list --max-parents=0 HEAD | head -1)}...${{ inputs.version }}"
echo "EOF"
} >> "$GITHUB_OUTPUT"

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ inputs.version }}
name: ${{ inputs.version }}
body: ${{ steps.notes.outputs.notes }}
prerelease: ${{ inputs.prerelease }}
generate_release_notes: false
Loading
Loading