init repo
This commit is contained in:
commit
5c54de249f
|
@ -0,0 +1,9 @@
|
||||||
|
services:
|
||||||
|
- docker
|
||||||
|
before_install:
|
||||||
|
- docker login -u${user_name} -p${pass_word}
|
||||||
|
- chmod +x ./deploy.sh
|
||||||
|
- ./deploy.sh
|
||||||
|
|
||||||
|
script:
|
||||||
|
- echo hello
|
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2017 AnJia
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
|
@ -0,0 +1,58 @@
|
||||||
|
Google Container Registry Mirror [last sync ${current_date} UTC]
|
||||||
|
-------
|
||||||
|
|
||||||
|
[](https://travis-ci.org/anjia0532/gcr.io_mirror)
|
||||||
|
|
||||||
|
Syntax
|
||||||
|
-------
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gcr.io/namespace/image_name:image_tag
|
||||||
|
#eq
|
||||||
|
${user_name}/namespace.image_name:image_tag
|
||||||
|
```
|
||||||
|
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker pull gcr.io/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1
|
||||||
|
# eq
|
||||||
|
docker pull ${user_name}/google-containers.federation-controller-manager-arm64:v1.3.1-beta.1
|
||||||
|
```
|
||||||
|
|
||||||
|
ReTag ${user_name} images to gcr.io
|
||||||
|
-------
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# replace gcr.io/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1 to real image
|
||||||
|
# this will convert gcr.io/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1
|
||||||
|
# to ${user_name}/google-containers.federation-controller-manager-arm64:v1.3.1-beta.1 and pull it
|
||||||
|
|
||||||
|
images=$(cat img.txt)
|
||||||
|
#or
|
||||||
|
#images=$(cat <<EOF
|
||||||
|
# gcr.io/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1
|
||||||
|
# gcr.io/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1
|
||||||
|
# gcr.io/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1
|
||||||
|
#EOF)
|
||||||
|
|
||||||
|
eval $(echo ${images}|
|
||||||
|
sed 's/gcr\.io/${user_name}/g;s/\//\./g;s/ /\n/g;s/${user_name}\./${user_name}\//g' |
|
||||||
|
uniq |
|
||||||
|
awk '{print "docker pull "$1";"}'
|
||||||
|
)
|
||||||
|
|
||||||
|
# this code will retag all of ${user_name}'s image from local e.g. ${user_name}/google-containers.federation-controller-manager-arm64:v1.3.1-beta.1
|
||||||
|
# to gcr.io/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1
|
||||||
|
|
||||||
|
for img in $(docker images --format "{{.Repository}}:{{.Tag}}"| grep "${user_name}"); do
|
||||||
|
n=$(echo ${img}| awk -F'[/.:]' '{printf "gcr.io/%s/%s",$2,$3}')
|
||||||
|
tag=$(echo ${img}| awk -F'[:]' '{printf ":%s",$2}')
|
||||||
|
docker tag $img "${n}${tag}"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
[Changelog](./CHANGES.md)
|
||||||
|
-------
|
||||||
|
|
|
@ -0,0 +1,202 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
SECONDS=0
|
||||||
|
|
||||||
|
source ./process-utils.sh
|
||||||
|
process_init 30
|
||||||
|
|
||||||
|
red='\033[0;31m'
|
||||||
|
green='\033[0;32m'
|
||||||
|
yellow='\033[0;33m'
|
||||||
|
plain='\033[0m'
|
||||||
|
|
||||||
|
[[ -d "gcr.io_mirror" ]] && rm -rf ./gcr.io_mirror
|
||||||
|
|
||||||
|
git clone "https://github.com/${user_name}/gcr.io_mirror.git"
|
||||||
|
|
||||||
|
function init_namespace()
|
||||||
|
{
|
||||||
|
n=$1
|
||||||
|
echo -e "${yellow}init gcr.io/$n's image...${plain}"
|
||||||
|
# get all of the gcr images
|
||||||
|
imgs=$(curl -ks 'https://console.cloud.google.com/m/gcr/entities/list' \
|
||||||
|
-H "Cookie: ${cookie}" \
|
||||||
|
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.7 Safari/537.36' \
|
||||||
|
-H 'Content-Type: application/json;charset=UTF-8' \
|
||||||
|
-H 'Accept: application/json, text/plain, */*' \
|
||||||
|
--data-binary '["'${n}'",null,null,[]]' |
|
||||||
|
grep -P '"' |
|
||||||
|
sed 's/"gcr.ListEntities"//' |
|
||||||
|
cut -d '"' -f2 |
|
||||||
|
sort |
|
||||||
|
uniq)
|
||||||
|
|
||||||
|
for img in ${imgs[@]} ; do
|
||||||
|
process_run "init_imgs $img"
|
||||||
|
done
|
||||||
|
wait ${!}
|
||||||
|
}
|
||||||
|
|
||||||
|
function init_imgs()
|
||||||
|
{
|
||||||
|
img=$1
|
||||||
|
echo -e "${yellow}init gcr.io/$n/${img}'s image...${plain}"
|
||||||
|
# get all tags for this image
|
||||||
|
gcr_content=$(curl -ks -X GET https://gcr.io/v2/${n}/${img}/tags/list)
|
||||||
|
dir=gcr.io_mirror/${n}/${img}/
|
||||||
|
|
||||||
|
# if this image dir not exits
|
||||||
|
[[ ! -d ${dir} ]] && mkdir -p ${dir};
|
||||||
|
|
||||||
|
# create img tmp file,named by tag's name, set access's time,modify's time by this image manifest's timeUploadedMs
|
||||||
|
echo ${gcr_content} | jq -r '.manifest|to_entries[]|select(.value.tag|length>0)|{k: .key,t: .value.tag[0],v: .value.timeUploadedMs} | "tf=${dir}"+.t+".tmp;echo "+.k+">${tf};touch -amd \"$(date \"+%F %T\" -d @" + .v[0:10] +")\" ${tf}"' | while read i; do
|
||||||
|
eval $i
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function compare()
|
||||||
|
{
|
||||||
|
|
||||||
|
echo -e "${yellow}compare image diff ...${plain}"
|
||||||
|
find ./gcr.io_mirror/ -name "*.tmp" | while read t
|
||||||
|
do
|
||||||
|
dir=$(dirname $t)
|
||||||
|
name=$(basename $t .tmp)
|
||||||
|
if [ -e ${dir}/${name}.tag ] && [ $(cat ${dir}/${name}.tag)x = $(cat $t)x ]; then
|
||||||
|
rm -rf $t;
|
||||||
|
else
|
||||||
|
[[ -e ${dir}/${name}.tag ]] && rm -rf ${dir}/${name}.tag
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function pull_push_diff()
|
||||||
|
{
|
||||||
|
n=$1
|
||||||
|
img=$2
|
||||||
|
all_of_imgs=$(find ./gcr.io_mirror -type f \( ! -iname "*.md" \) |wc -l)
|
||||||
|
current_ns_imgs=$(find ./gcr.io_mirror/${n}/ -type f \( ! -iname "*.md" \) |wc -l)
|
||||||
|
tmps=($(find ./gcr.io_mirror/${n}/${img}/ -type f \( -iname "*.tmp" \) -exec basename {} .tmp \; | uniq))
|
||||||
|
|
||||||
|
echo -e "${red}wait for mirror${plain}/${yellow}gcr.io/${n}/* images${plain}/${green}all of images${plain}:${red}${#tmps[@]}${plain}/${yellow}${current_ns_imgs}${plain}/${green}${all_of_imgs}${plain}"
|
||||||
|
|
||||||
|
for tag in ${tmps[@]} ; do
|
||||||
|
echo -e "${yellow}mirror ${n}/${img}/${tag}...${plain}"
|
||||||
|
lock=./gcr.io_mirror/${n}/${img}/${tag}.lck
|
||||||
|
[[ -e $lock ]] && continue;
|
||||||
|
echo "${tag}">$lock
|
||||||
|
|
||||||
|
docker pull gcr.io/${n}/${img}:${tag}
|
||||||
|
docker tag gcr.io/${n}/${img}:${tag} ${user_name}/${n}.${img}:${tag}
|
||||||
|
docker push ${user_name}/${n}.${img}:${tag}
|
||||||
|
|
||||||
|
[[ -e ./commit.lck ]] && break
|
||||||
|
|
||||||
|
mv ./gcr.io_mirror/${n}/${img}/${tag}.tmp ./gcr.io_mirror/${n}/${img}/${tag}.tag
|
||||||
|
|
||||||
|
echo -e "[gcr.io/${n}/${image}:${tag}](https://hub.docker.com/r/${user_name}/${n}.${image}/tags/)\n\n" >> CHANGES.md
|
||||||
|
rm -rf $lock
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function mirror()
|
||||||
|
{
|
||||||
|
num=$(find ./gcr.io_mirror/ -type f \( -iname "*.tmp" \) |wc -l)
|
||||||
|
if [ $num -eq 0 ]; then
|
||||||
|
ns=$(cat ./gcr_namespaces 2>/dev/null || echo google-containers)
|
||||||
|
for n in ${ns[@]} ; do
|
||||||
|
process_run "init_namespace $n"
|
||||||
|
done
|
||||||
|
wait ${!}
|
||||||
|
fi
|
||||||
|
|
||||||
|
compare
|
||||||
|
|
||||||
|
tmps=$(find ./gcr.io_mirror/ -type f \( -iname "*.tmp" \) -exec dirname {} \; | uniq | cut -d'/' -f3-4)
|
||||||
|
|
||||||
|
if [ -z "$tmps" ]; then
|
||||||
|
echo -e "${red} wait for push ${tmps[@]}"
|
||||||
|
for img in ${tmps[@]} ; do
|
||||||
|
n=$(echo ${img}|cut -d'/' -f1)
|
||||||
|
image=$(echo ${img}|cut -d'/' -f2)
|
||||||
|
process_run "pull_push_diff $n $image"
|
||||||
|
done
|
||||||
|
wait ${!}
|
||||||
|
fi
|
||||||
|
|
||||||
|
images=($(find ./gcr.io_mirror/ -type f -name "*.tag" |uniq|sort))
|
||||||
|
|
||||||
|
cp ./gcr.io_mirror/CHANGES.md ./CHANGES1.md 2>/dev/null
|
||||||
|
|
||||||
|
find ./gcr.io_mirror/ -type f -name "*.md" -exec rm -rf {} \;
|
||||||
|
|
||||||
|
for img in ${images[@]} ; do
|
||||||
|
n=$(echo ${img}|cut -d'/' -f3)
|
||||||
|
image=$(echo ${img}|cut -d'/' -f4)
|
||||||
|
tag=$(basename ${img} .tag)
|
||||||
|
mkdir -p ./gcr.io_mirror/${n}/${image}
|
||||||
|
if [ ! -e ./gcr.io_mirror/${n}/${image}/README.md ]; then
|
||||||
|
echo -e "\n[gcr.io/${n}/${image}](https://hub.docker.com/r/${user_name}/${n}.${image}/tags/)\n-----\n\n" >> ./gcr.io_mirror/${n}/${image}/README.md
|
||||||
|
echo -e "\n[gcr.io/${n}/${image}](https://hub.docker.com/r/${user_name}/${n}.${image}/tags/)\n-----\n\n" >> ./gcr.io_mirror/${n}/README.md
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "[gcr.io/${n}/${image}:${tag}](https://hub.docker.com/r/${user_name}/${n}.${image}/tags/)\n\n" >> ./gcr.io_mirror/${n}/${image}/README.md
|
||||||
|
done
|
||||||
|
|
||||||
|
commit
|
||||||
|
}
|
||||||
|
|
||||||
|
function commit()
|
||||||
|
{
|
||||||
|
echo 1 > ./commit.lck
|
||||||
|
ns=($(cat ./gcr_namespaces 2>/dev/null || echo google-containers))
|
||||||
|
readme=./gcr.io_mirror/README.md
|
||||||
|
export current_date=$(date +'%Y-%m-%d %H:%M')
|
||||||
|
envsubst < README.tpl >"${readme}"
|
||||||
|
|
||||||
|
echo -e "Mirror ${#ns[@]} namespaces image from gcr.io\n-----\n\n" >> "${readme}"
|
||||||
|
for n in ${ns[@]} ; do
|
||||||
|
echo -e "[gcr.io/${n}/*](./${n}/README.md)\n\n" >> "${readme}"
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -s CHANGES.md ]; then
|
||||||
|
(echo -e "## $(date +'%Y-%m-%d %H:%M') \n" && cat CHANGES.md && cat CHANGES1.md 2>/dev/null) >> gcr.io_mirror/CHANGES.md
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${red} commit to github master"
|
||||||
|
git -C ./gcr.io_mirror pull
|
||||||
|
git -C ./gcr.io_mirror add -A
|
||||||
|
git -C ./gcr.io_mirror commit -m "sync gcr.io's images at $(date +'%Y-%m-%d %H:%M')"
|
||||||
|
git -C ./gcr.io_mirror push -f "https://${user_name}:${GH_TOKEN}@github.com/${user_name}/gcr.io_mirror.git" master:master
|
||||||
|
|
||||||
|
echo -e "${red} commit to github master:done"
|
||||||
|
echo 1 > ./commit.done
|
||||||
|
}
|
||||||
|
|
||||||
|
mirror &
|
||||||
|
|
||||||
|
while true;
|
||||||
|
do
|
||||||
|
duration=$SECONDS
|
||||||
|
if [[ -e ./commit.done ]] || [[ $duration -ge $sec ]]; then
|
||||||
|
|
||||||
|
[[ $duration -ge $sec ]] && echo -e "${red} more than $(expr $sec / 60) min,abort this build"
|
||||||
|
|
||||||
|
[[ ! -e ./commit.done ]] && commit
|
||||||
|
|
||||||
|
IFS=$'\n'; for i in $(jobs); do echo "$i"; done
|
||||||
|
kill $(jobs -p)
|
||||||
|
IFS=$'\n'; for i in $(jobs); do echo "$i"; done
|
||||||
|
break
|
||||||
|
|
||||||
|
else
|
||||||
|
docker_dir=$(docker info | grep "Docker Root Dir" | cut -d':' -f2)
|
||||||
|
used=$(df -h ${docker_dir}|awk '{if(NR>1)print $5}')
|
||||||
|
echo -e "${red} duration:${duration}s, docker root dir :${docker_dir}:used:${used}"
|
||||||
|
[[ ${used} > '70%' ]] && docker system prune -f -a
|
||||||
|
sleep 30
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
sleep 120
|
||||||
|
echo "${red} bye bye"
|
|
@ -0,0 +1,6 @@
|
||||||
|
google-samples
|
||||||
|
kubernetes-helm
|
||||||
|
k8s-minikube
|
||||||
|
tf-on-k8s-dogfood
|
||||||
|
spinnaker-marketplace
|
||||||
|
google-containers
|
|
@ -0,0 +1,36 @@
|
||||||
|
_PROCESS_PIPE_NAME="/tmp/$(cat /proc/sys/kernel/random/uuid)"
|
||||||
|
_PROCESS_PIPE_ID=10
|
||||||
|
|
||||||
|
function _create_pipe()
|
||||||
|
{
|
||||||
|
|
||||||
|
mkfifo ${_PROCESS_PIPE_NAME}
|
||||||
|
eval exec "${_PROCESS_PIPE_ID}""<>${_PROCESS_PIPE_NAME}"
|
||||||
|
|
||||||
|
for ((i=0; i< $1; i++))
|
||||||
|
do
|
||||||
|
echo >&${_PROCESS_PIPE_ID}
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function process_init()
|
||||||
|
{
|
||||||
|
_create_pipe $1
|
||||||
|
}
|
||||||
|
|
||||||
|
function process_run()
|
||||||
|
{
|
||||||
|
cmd=$1
|
||||||
|
|
||||||
|
if [ -z "$cmd" ]; then
|
||||||
|
echo "please input command to run"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
read -u${_PROCESS_PIPE_ID}
|
||||||
|
{
|
||||||
|
$cmd
|
||||||
|
echo >&${_PROCESS_PIPE_ID}
|
||||||
|
}&
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue