mirror of
				https://gitea.com/docker/build-push-action.git
				synced 2025-10-31 00:58:18 +07:00 
			
		
		
		
	Merge pull request #800 from crazy-max/e2e-local
e2e: local harbor and nexus
This commit is contained in:
		
						commit
						70cc701b9c
					
				
							
								
								
									
										8
									
								
								.github/e2e/harbor/env
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.github/e2e/harbor/env
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | REGISTRY_FQDN=localhost:8081 | ||||||
|  | REGISTRY_USER=admin | ||||||
|  | REGISTRY_PASSWORD=Harbor12345 | ||||||
|  | REGISTRY_SLUG=localhost:8081/test-docker-action/test-docker-action | ||||||
|  | 
 | ||||||
|  | HARBOR_HOST=localhost | ||||||
|  | HARBOR_PORT=8081 | ||||||
|  | HARBOR_PROJECT=test-docker-action | ||||||
							
								
								
									
										79
									
								
								.github/e2e/harbor/install.sh
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										79
									
								
								.github/e2e/harbor/install.sh
									
									
									
									
										vendored
									
									
										Executable file
									
								
							| @ -0,0 +1,79 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | set -eu | ||||||
|  | 
 | ||||||
|  | : "${HARBOR_VERSION:=v2.7.0}" | ||||||
|  | : "${HARBOR_HOST:=localhost}" | ||||||
|  | : "${HARBOR_PORT:=49154}" | ||||||
|  | : "${REGISTRY_USER:=admin}" | ||||||
|  | : "${REGISTRY_PASSWORD:=Harbor12345}" | ||||||
|  | 
 | ||||||
|  | : "${HARBOR_PROJECT:=test-docker-action}" | ||||||
|  | 
 | ||||||
|  | project_post_data() { | ||||||
|  |   cat <<EOF | ||||||
|  | { | ||||||
|  |   "project_name": "$HARBOR_PROJECT", | ||||||
|  |   "public": true | ||||||
|  | } | ||||||
|  | EOF | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export TERM=xterm | ||||||
|  | 
 | ||||||
|  | # download | ||||||
|  | echo "::group::Downloading Harbor $HARBOR_VERSION" | ||||||
|  | ( | ||||||
|  |   cd /tmp | ||||||
|  |   set -x | ||||||
|  |   wget -q "https://github.com/goharbor/harbor/releases/download/${HARBOR_VERSION}/harbor-offline-installer-${HARBOR_VERSION}.tgz" -O harbor-online-installer.tgz | ||||||
|  |   tar xvf harbor-online-installer.tgz | ||||||
|  | ) | ||||||
|  | echo "::endgroup::" | ||||||
|  | 
 | ||||||
|  | # config | ||||||
|  | echo "::group::Configuring Harbor" | ||||||
|  | ( | ||||||
|  |   cd /tmp/harbor | ||||||
|  |   set -x | ||||||
|  |   cp harbor.yml.tmpl harbor.yml | ||||||
|  |   harborConfig="$(harborHost="$HARBOR_HOST" harborPort="$HARBOR_PORT" harborPwd="$REGISTRY_PASSWORD" yq --no-colors '.hostname = env(harborHost) | .http.port = env(harborPort) | .harbor_admin_password = env(harborPwd) | del(.https)' harbor.yml)" | ||||||
|  |   tee harbor.yml <<<"$harborConfig" >/dev/null | ||||||
|  |   yq --no-colors harbor.yml | ||||||
|  | ) | ||||||
|  | echo "::endgroup::" | ||||||
|  | 
 | ||||||
|  | # install and start | ||||||
|  | echo "::group::Installing Harbor" | ||||||
|  | ( | ||||||
|  |   cd /tmp/harbor | ||||||
|  |   set -x | ||||||
|  |   ./install.sh | ||||||
|  |   sleep 10 | ||||||
|  |   netstat -aptn | ||||||
|  | ) | ||||||
|  | echo "::endgroup::" | ||||||
|  | 
 | ||||||
|  | # compose config | ||||||
|  | echo "::group::Compose config" | ||||||
|  | ( | ||||||
|  |   cd /tmp/harbor | ||||||
|  |   set -x | ||||||
|  |   docker compose config | ||||||
|  | ) | ||||||
|  | echo "::endgroup::" | ||||||
|  | 
 | ||||||
|  | # create project | ||||||
|  | echo "::group::Creating project" | ||||||
|  | ( | ||||||
|  |   set -x | ||||||
|  |   curl --fail -v -k --max-time 10 -u "$REGISTRY_USER:$REGISTRY_PASSWORD" -X POST -H "Content-Type: application/json" -d "$(project_post_data)" "http://$HARBOR_HOST:$HARBOR_PORT/api/v2.0/projects" | ||||||
|  | ) | ||||||
|  | echo "::endgroup::" | ||||||
|  | 
 | ||||||
|  | # list projects | ||||||
|  | echo "::group::List projects" | ||||||
|  | ( | ||||||
|  |   set -x | ||||||
|  |   curl --fail -s -k --max-time 10 -u "$REGISTRY_USER:$REGISTRY_PASSWORD" -H "Content-Type: application/json" "http://$HARBOR_HOST:$HARBOR_PORT/api/v2.0/projects" | jq | ||||||
|  | ) | ||||||
|  | echo "::endgroup::" | ||||||
							
								
								
									
										8
									
								
								.github/e2e/nexus/docker-compose.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.github/e2e/nexus/docker-compose.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | services: | ||||||
|  |   nexus: | ||||||
|  |     image: sonatype/nexus3:${NEXUS_VERSION:-latest} | ||||||
|  |     volumes: | ||||||
|  |       - "./data:/nexus-data" | ||||||
|  |     ports: | ||||||
|  |       - "8081:8081" | ||||||
|  |       - "8082:8082" | ||||||
							
								
								
									
										9
									
								
								.github/e2e/nexus/env
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.github/e2e/nexus/env
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | REGISTRY_FQDN=localhost:8082 | ||||||
|  | REGISTRY_USER=admin | ||||||
|  | REGISTRY_PASSWORD=Nexus12345 | ||||||
|  | REGISTRY_SLUG=localhost:8082/test-docker-action | ||||||
|  | 
 | ||||||
|  | NEXUS_HOST=localhost | ||||||
|  | NEXUS_PORT=8081 | ||||||
|  | NEXUS_REGISTRY_PORT=8082 | ||||||
|  | NEXUS_REPO=test-docker-action | ||||||
							
								
								
									
										93
									
								
								.github/e2e/nexus/install.sh
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										93
									
								
								.github/e2e/nexus/install.sh
									
									
									
									
										vendored
									
									
										Executable file
									
								
							| @ -0,0 +1,93 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | set -eu | ||||||
|  | 
 | ||||||
|  | SCRIPT_DIR=$(cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd) | ||||||
|  | 
 | ||||||
|  | : "${NEXUS_VERSION:=3.47.1}" | ||||||
|  | : "${NEXUS_HOST:=localhost}" | ||||||
|  | : "${NEXUS_PORT:=8081}" | ||||||
|  | : "${NEXUS_REGISTRY_PORT:=8082}" | ||||||
|  | : "${REGISTRY_USER:=admin}" | ||||||
|  | : "${REGISTRY_PASSWORD:=Nexus12345}" | ||||||
|  | 
 | ||||||
|  | : "${NEXUS_REPO:=test-docker-action}" | ||||||
|  | 
 | ||||||
|  | createrepo_post_data() { | ||||||
|  |   cat <<EOF | ||||||
|  | { | ||||||
|  |   "name": "${NEXUS_REPO}", | ||||||
|  |   "online": true, | ||||||
|  |   "storage": { | ||||||
|  |     "blobStoreName": "default", | ||||||
|  |     "strictContentTypeValidation": true, | ||||||
|  |     "writePolicy": "ALLOW" | ||||||
|  |   }, | ||||||
|  |   "docker": { | ||||||
|  |     "v1Enabled": false, | ||||||
|  |     "forceBasicAuth": true, | ||||||
|  |     "httpPort": ${NEXUS_REGISTRY_PORT}, | ||||||
|  |     "httpsPort": null, | ||||||
|  |     "subdomain": null | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | EOF | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export NEXUS_VERSION | ||||||
|  | 
 | ||||||
|  | mkdir -p /tmp/nexus/data | ||||||
|  | chown 200:200 /tmp/nexus/data | ||||||
|  | cp "${SCRIPT_DIR}/docker-compose.yml" /tmp/nexus/docker-compose.yml | ||||||
|  | 
 | ||||||
|  | echo "::group::Pulling Nexus $NEXUS_VERSION" | ||||||
|  | ( | ||||||
|  |   cd /tmp/nexus | ||||||
|  |   set -x | ||||||
|  |   docker compose pull | ||||||
|  | ) | ||||||
|  | echo "::endgroup::" | ||||||
|  | 
 | ||||||
|  | echo "::group::Compose config" | ||||||
|  | ( | ||||||
|  |   cd /tmp/nexus | ||||||
|  |   set -x | ||||||
|  |   docker compose config | ||||||
|  | ) | ||||||
|  | echo "::endgroup::" | ||||||
|  | 
 | ||||||
|  | echo "::group::Running Nexus" | ||||||
|  | ( | ||||||
|  |   cd /tmp/nexus | ||||||
|  |   set -x | ||||||
|  |   docker compose up -d | ||||||
|  | ) | ||||||
|  | echo "::endgroup::" | ||||||
|  | 
 | ||||||
|  | echo "::group::Running Nexus" | ||||||
|  | ( | ||||||
|  |   cd /tmp/nexus | ||||||
|  |   set -x | ||||||
|  |   docker compose up -d | ||||||
|  | ) | ||||||
|  | echo "::endgroup::" | ||||||
|  | 
 | ||||||
|  | echo "::group::Waiting for Nexus to be ready" | ||||||
|  | until $(curl --output /dev/null --silent --head --fail "http://$NEXUS_HOST:$NEXUS_PORT"); do | ||||||
|  |   printf '.' | ||||||
|  |   sleep 5 | ||||||
|  | done | ||||||
|  | echo "::endgroup::" | ||||||
|  | 
 | ||||||
|  | echo "::group::Change user's password" | ||||||
|  | ( | ||||||
|  |   set -x | ||||||
|  |   curl --fail -v -k --max-time 10 -u "$REGISTRY_USER:$(cat /tmp/nexus/data/admin.password)" -X PUT -H 'Content-Type: text/plain' -d "$REGISTRY_PASSWORD" "http://$NEXUS_HOST:$NEXUS_PORT/service/rest/v1/security/users/$REGISTRY_USER/change-password" | ||||||
|  | ) | ||||||
|  | echo "::endgroup::" | ||||||
|  | 
 | ||||||
|  | echo "::group::Create Docker repository" | ||||||
|  | ( | ||||||
|  |   set -x | ||||||
|  |   curl --fail -v -k --max-time 10 -u "$REGISTRY_USER:$REGISTRY_PASSWORD" -X POST -H 'Content-Type: application/json' -d "$(createrepo_post_data)" "http://$NEXUS_HOST:$NEXUS_PORT/service/rest/v1/repositories/docker/hosted" | ||||||
|  | ) | ||||||
|  | echo "::endgroup::" | ||||||
							
								
								
									
										79
									
								
								.github/workflows/e2e.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										79
									
								
								.github/workflows/e2e.yml
									
									
									
									
										vendored
									
									
								
							| @ -25,69 +25,124 @@ on: | |||||||
| env: | env: | ||||||
|   BUILDX_VERSION: latest |   BUILDX_VERSION: latest | ||||||
|   BUILDKIT_IMAGE: moby/buildkit:buildx-stable-1 |   BUILDKIT_IMAGE: moby/buildkit:buildx-stable-1 | ||||||
|  |   HARBOR_VERSION: v2.7.0 | ||||||
|  |   NEXUS_VERSION: 3.47.1 | ||||||
| 
 | 
 | ||||||
| jobs: | jobs: | ||||||
|   docker: |   build: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         include: |         include: | ||||||
|           - |           - | ||||||
|  |             name: Docker Hub | ||||||
|             registry: '' |             registry: '' | ||||||
|             slug: ghactionstest/ghactionstest |             slug: ghactionstest/ghactionstest | ||||||
|             username_secret: DOCKERHUB_USERNAME |             username_secret: DOCKERHUB_USERNAME | ||||||
|             password_secret: DOCKERHUB_TOKEN |             password_secret: DOCKERHUB_TOKEN | ||||||
|  |             type: remote | ||||||
|           - |           - | ||||||
|  |             name: GitHub | ||||||
|             registry: ghcr.io |             registry: ghcr.io | ||||||
|             slug: ghcr.io/docker-ghactiontest/test |             slug: ghcr.io/docker-ghactiontest/test | ||||||
|             username_secret: GHCR_USERNAME |             username_secret: GHCR_USERNAME | ||||||
|             password_secret: GHCR_PAT |             password_secret: GHCR_PAT | ||||||
|  |             type: remote | ||||||
|           - |           - | ||||||
|  |             name: GitLab | ||||||
|             registry: registry.gitlab.com |             registry: registry.gitlab.com | ||||||
|             slug: registry.gitlab.com/test1716/test |             slug: registry.gitlab.com/test1716/test | ||||||
|             username_secret: GITLAB_USERNAME |             username_secret: GITLAB_USERNAME | ||||||
|             password_secret: GITLAB_TOKEN |             password_secret: GITLAB_TOKEN | ||||||
|  |             type: remote | ||||||
|           - |           - | ||||||
|  |             name: AWS ECR | ||||||
|             registry: 175142243308.dkr.ecr.us-east-2.amazonaws.com |             registry: 175142243308.dkr.ecr.us-east-2.amazonaws.com | ||||||
|             slug: 175142243308.dkr.ecr.us-east-2.amazonaws.com/sandbox/test-docker-action |             slug: 175142243308.dkr.ecr.us-east-2.amazonaws.com/sandbox/test-docker-action | ||||||
|             username_secret: AWS_ACCESS_KEY_ID |             username_secret: AWS_ACCESS_KEY_ID | ||||||
|             password_secret: AWS_SECRET_ACCESS_KEY |             password_secret: AWS_SECRET_ACCESS_KEY | ||||||
|  |             type: remote | ||||||
|           - |           - | ||||||
|  |             name: AWS ECR Public | ||||||
|             registry: public.ecr.aws |             registry: public.ecr.aws | ||||||
|             slug: public.ecr.aws/q3b5f1u4/test-docker-action |             slug: public.ecr.aws/q3b5f1u4/test-docker-action | ||||||
|             username_secret: AWS_ACCESS_KEY_ID |             username_secret: AWS_ACCESS_KEY_ID | ||||||
|             password_secret: AWS_SECRET_ACCESS_KEY |             password_secret: AWS_SECRET_ACCESS_KEY | ||||||
|  |             type: remote | ||||||
|           - |           - | ||||||
|  |             name: Google Artifact Registry | ||||||
|             registry: us-east4-docker.pkg.dev |             registry: us-east4-docker.pkg.dev | ||||||
|             slug: us-east4-docker.pkg.dev/sandbox-298914/docker-official-github-actions/test-docker-action |             slug: us-east4-docker.pkg.dev/sandbox-298914/docker-official-github-actions/test-docker-action | ||||||
|             username_secret: GAR_USERNAME |             username_secret: GAR_USERNAME | ||||||
|             password_secret: GAR_JSON_KEY |             password_secret: GAR_JSON_KEY | ||||||
|  |             type: remote | ||||||
|           - |           - | ||||||
|  |             name: Google Container Registry | ||||||
|             registry: gcr.io |             registry: gcr.io | ||||||
|             slug: gcr.io/sandbox-298914/test-docker-action |             slug: gcr.io/sandbox-298914/test-docker-action | ||||||
|             username_secret: GCR_USERNAME |             username_secret: GCR_USERNAME | ||||||
|             password_secret: GCR_JSON_KEY |             password_secret: GCR_JSON_KEY | ||||||
|  |             type: remote | ||||||
|           - |           - | ||||||
|  |             name: Azure Container Registry | ||||||
|             registry: officialgithubactions.azurecr.io |             registry: officialgithubactions.azurecr.io | ||||||
|             slug: officialgithubactions.azurecr.io/test-docker-action |             slug: officialgithubactions.azurecr.io/test-docker-action | ||||||
|             username_secret: AZURE_CLIENT_ID |             username_secret: AZURE_CLIENT_ID | ||||||
|             password_secret: AZURE_CLIENT_SECRET |             password_secret: AZURE_CLIENT_SECRET | ||||||
|  |             type: remote | ||||||
|           - |           - | ||||||
|  |             name: Quay | ||||||
|             registry: quay.io |             registry: quay.io | ||||||
|             slug: quay.io/crazymax/build-push-action |             slug: quay.io/crazymax/build-push-action | ||||||
|             username_secret: QUAY_USERNAME |             username_secret: QUAY_USERNAME | ||||||
|             password_secret: QUAY_TOKEN |             password_secret: QUAY_TOKEN | ||||||
|  |             type: remote | ||||||
|  |           - | ||||||
|  |             name: Harbor | ||||||
|  |             id: harbor | ||||||
|  |             type: local | ||||||
|  |           - | ||||||
|  |             name: Nexus | ||||||
|  |             id: nexus | ||||||
|  |             type: local | ||||||
|     steps: |     steps: | ||||||
|       - |       - | ||||||
|         name: Checkout |         name: Checkout | ||||||
|         uses: actions/checkout@v3 |         uses: actions/checkout@v3 | ||||||
|  |       - | ||||||
|  |         name: Set up env | ||||||
|  |         if: matrix.type == 'local' | ||||||
|  |         run: | | ||||||
|  |           cat ./.github/e2e/${{ matrix.id }}/env >> $GITHUB_ENV | ||||||
|  |       - | ||||||
|  |         name: Set up BuildKit config | ||||||
|  |         run: | | ||||||
|  |           touch /tmp/buildkitd.toml | ||||||
|  |           if [ "${{ matrix.type }}" = "local" ]; then | ||||||
|  |             echo -e "[registry.\"${{ env.REGISTRY_FQDN }}\"]\nhttp = true\ninsecure = true" > /tmp/buildkitd.toml | ||||||
|  |           fi | ||||||
|  |       - | ||||||
|  |         name: Set up Docker daemon | ||||||
|  |         if: matrix.type == 'local' | ||||||
|  |         run: | | ||||||
|  |           if [ ! -e /etc/docker/daemon.json ]; then | ||||||
|  |             echo '{}' | tee /etc/docker/daemon.json >/dev/null | ||||||
|  |           fi | ||||||
|  |           DOCKERD_CONFIG=$(jq '.+{"insecure-registries":["http://${{ env.REGISTRY_FQDN }}"]}' /etc/docker/daemon.json) | ||||||
|  |           sudo tee /etc/docker/daemon.json <<<"$DOCKERD_CONFIG" >/dev/null | ||||||
|  |           sudo service docker restart | ||||||
|  |       - | ||||||
|  |         name: Install ${{ matrix.name }} | ||||||
|  |         if: matrix.type == 'local' | ||||||
|  |         run: | | ||||||
|  |           sudo -E bash ./.github/e2e/${{ matrix.id }}/install.sh | ||||||
|       - |       - | ||||||
|         name: Docker meta |         name: Docker meta | ||||||
|         id: meta |         id: meta | ||||||
|         uses: docker/metadata-action@v4 |         uses: docker/metadata-action@v4 | ||||||
|         with: |         with: | ||||||
|           images: ${{ matrix.slug }} |           images: ${{ env.REGISTRY_SLUG || matrix.slug }} | ||||||
|           tags: | |           tags: | | ||||||
|             type=ref,event=branch |             type=ref,event=branch | ||||||
|             type=ref,event=tag |             type=ref,event=tag | ||||||
| @ -100,17 +155,19 @@ jobs: | |||||||
|         uses: docker/setup-buildx-action@v2 |         uses: docker/setup-buildx-action@v2 | ||||||
|         with: |         with: | ||||||
|           version: ${{ inputs.buildx-version || env.BUILDX_VERSION }} |           version: ${{ inputs.buildx-version || env.BUILDX_VERSION }} | ||||||
|           buildkitd-flags: --debug |           config: /tmp/buildkitd.toml | ||||||
|  |           buildkitd-flags: --debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host | ||||||
|           driver-opts: | |           driver-opts: | | ||||||
|             image=${{ inputs.buildkit-image || env.BUILDKIT_IMAGE }} |             image=${{ inputs.buildkit-image || env.BUILDKIT_IMAGE }} | ||||||
|  |             network=host | ||||||
|       - |       - | ||||||
|         name: Login to Registry |         name: Login to Registry | ||||||
|         if: github.event_name != 'pull_request' |         if: github.event_name != 'pull_request' | ||||||
|         uses: docker/login-action@v2 |         uses: docker/login-action@v2 | ||||||
|         with: |         with: | ||||||
|           registry: ${{ matrix.registry }} |           registry: ${{ env.REGISTRY_FQDN || matrix.registry }} | ||||||
|           username: ${{ secrets[matrix.username_secret] }} |           username: ${{ env.REGISTRY_USER || secrets[matrix.username_secret] }} | ||||||
|           password: ${{ secrets[matrix.password_secret] }} |           password: ${{ env.REGISTRY_PASSWORD || secrets[matrix.password_secret] }} | ||||||
|       - |       - | ||||||
|         name: Build and push |         name: Build and push | ||||||
|         uses: ./ |         uses: ./ | ||||||
| @ -121,16 +178,14 @@ jobs: | |||||||
|           push: ${{ github.event_name != 'pull_request' }} |           push: ${{ github.event_name != 'pull_request' }} | ||||||
|           tags: ${{ steps.meta.outputs.tags }} |           tags: ${{ steps.meta.outputs.tags }} | ||||||
|           labels: ${{ steps.meta.outputs.labels }} |           labels: ${{ steps.meta.outputs.labels }} | ||||||
|           cache-from: type=registry,ref=${{ matrix.slug }}:master |           cache-from: type=registry,ref=${{ env.REGISTRY_SLUG || matrix.slug }}:master | ||||||
|           cache-to: type=inline |           cache-to: type=inline | ||||||
|       - |       - | ||||||
|         name: Inspect image |         name: Inspect image | ||||||
|         if: github.event_name != 'pull_request' |  | ||||||
|         run: | |         run: | | ||||||
|           docker pull ${{ matrix.slug }}:${{ steps.meta.outputs.version }} |           docker pull ${{ env.REGISTRY_SLUG || matrix.slug }}:${{ steps.meta.outputs.version }} | ||||||
|           docker image inspect ${{ matrix.slug }}:${{ steps.meta.outputs.version }} |           docker image inspect ${{ env.REGISTRY_SLUG || matrix.slug }}:${{ steps.meta.outputs.version }} | ||||||
|       - |       - | ||||||
|         name: Check manifest |         name: Check manifest | ||||||
|         if: github.event_name != 'pull_request' |  | ||||||
|         run: | |         run: | | ||||||
|           docker buildx imagetools inspect ${{ matrix.slug }}:${{ steps.meta.outputs.version }} --format '{{json .}}' |           docker buildx imagetools inspect ${{ env.REGISTRY_SLUG || matrix.slug }}:${{ steps.meta.outputs.version }} --format '{{json .}}' | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user