diff --git a/.github/workflows/force.yml b/.github/workflows/force.yml new file mode 100644 index 0000000..0b5cdae --- /dev/null +++ b/.github/workflows/force.yml @@ -0,0 +1,75 @@ +name: build by force + +on: + #push: + # branches: + # - master + # - main + workflow_dispatch: + #repository_dispatch: + # types: webssh + +jobs: + webssh: + runs-on: ubuntu-20.04 + steps: + - name: checkout code + uses: actions/checkout@v2 + - name: docker login + run: docker login -u ${{ secrets.DOCKERUSERNAME }} -p ${{ secrets.DOCKERAPIKEY }} + - name: treehouses webssh + run: | + export DOCKER_CLI_EXPERIMENTAL=enabled + repo="treehouses/webssh" + base="treehouses/alpine" + source .github/workflows/utils.sh + echo "amd64" + baseamd64=$(get_variant_sha "$base" "latest" "amd64") + echo $baseamd64 + # repoamd64=$(get_manifest_sha "$repo:latest" "amd64") + # echo $repoamd64 + echo "arm" + basearm=$(get_tag_sha "$base" "latest") + echo $basearm + # repoarm=$(get_manifest_sha "$repo:latest" "arm") + # echo $repoarm + echo "arm64" + basearm64=$(get_variant_sha "$base" "latest" "arm64") + echo $basearm64 + # repoarm64=$(get_manifest_sha "$repo:latest" "arm64") + # echo $repoarm64 + echo "change" + flag=true #$(compare_sha "$baseamd64" "$repoamd64" "$basearm" "$repoarm" "$basearm64" "$repoarm64") + echo $flag + if [[ $flag == true ]]; then + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + build_image "$base:latest" amd64 $repo + build_image "$base:latest" arm $repo + build_image "$base:latest" arm64 $repo + deploy_image $repo arm + deploy_image $repo amd64 + deploy_image $repo arm64 + sudo npm install -g @treehouses/cli + export gitter_channel="${{ secrets.CHANNEL }}" + echo "tags" + tag="$(date +%Y%m%d%H%M)" + echo $tag + docker manifest create $repo:$tag $repo-tags:amd64 $repo-tags:arm $repo-tags:arm64 + docker manifest annotate $repo:$tag $repo-tags:amd64 --arch amd64 + docker manifest annotate $repo:$tag $repo-tags:arm64 --arch arm64 + docker manifest annotate $repo:$tag $repo-tags:arm --arch arm + docker manifest inspect $repo:$tag + docker manifest push $repo:$tag + tag2="latest" + echo $tag2 + docker manifest create $repo:$tag2 $repo-tags:amd64 $repo-tags:arm $repo-tags:arm64 + docker manifest annotate $repo:$tag2 $repo-tags:amd64 --arch amd64 + docker manifest annotate $repo:$tag2 $repo-tags:arm64 --arch arm64 + docker manifest annotate $repo:$tag2 $repo-tags:arm --arch arm + docker manifest inspect $repo:$tag2 + docker manifest push $repo:$tag2 + echo "https://hub.docker.com/r/treehouses/webssh/tags" + treehouses feedback "new treehouses/webssh check https://hub.docker.com/r/treehouses/webssh/tags" + else + echo "no changes" + fi diff --git a/.github/workflows/utils.sh b/.github/workflows/utils.sh new file mode 100755 index 0000000..eef5302 --- /dev/null +++ b/.github/workflows/utils.sh @@ -0,0 +1,112 @@ +#!/bin/bash + +get_variant_sha(){ + local sha + docker_repo=$1 #alpine or vmnet/alpine + manifest_tag=$2 + docker_image=$docker_repo:$manifest_tag + arch=$3 + variant=$4 + export DOCKER_CLI_EXPERIMENTAL=enabled + + docker pull -q ${docker_image} &>/dev/null + docker manifest inspect ${docker_image} > "$2".txt + + sha="" + i=0 + while [ "$sha" == "" ] && read -r line + do + arch=$(jq .manifests[$i].platform.architecture "$2".txt |sed -e 's/^"//' -e 's/"$//') + if [ "$arch" = "$3" ] && [ "$arch" != "arm" ]; then + sha=$(jq .manifests[$i].digest "$2".txt |sed -e 's/^"//' -e 's/"$//') + echo ${sha} + elif [ "$arch" = "$3" ]; then + variant=$(jq .manifests[$i].platform.variant "$2".txt |sed -e 's/^"//' -e 's/"$//') + if [ "$variant" == "$4" ]; then + sha=$(jq .manifests[$i].digest "$2".txt |sed -e 's/^"//' -e 's/"$//') + echo ${sha} + fi + fi + i=$i+1 + done < "$2".txt +} + +get_manifest_sha (){ + local repo=$1 + local arch=$2 + docker pull -q $1 &>/dev/null + docker manifest inspect $1 > "$2".txt + sha="" + i=0 + while [ "$sha" == "" ] && read -r line + do + archecture=$(jq .manifests[$i].platform.architecture "$2".txt |sed -e 's/^"//' -e 's/"$//') + if [ "$archecture" = "$2" ];then + sha=$(jq .manifests[$i].digest "$2".txt |sed -e 's/^"//' -e 's/"$//') + echo ${sha} + fi + i=$i+1 + done < "$2".txt +} + +get_tag_sha(){ + local repo=$1 + local tag=$2 + docker pull "$repo:$tag" &>/dev/null + sha=$(docker inspect --format='{{index .RepoDigests 0}}' "$repo:$tag" 2>/dev/null | cut -d @ -f 2) + echo $sha +} + +build_image(){ + local repo=$1 # this is the base repo, for example treehouses/alpine + local arch=$2 #arm arm64 amd64 + local tag_repo=$3 # this is the tag repo, for example treehouses/node + if [ $# -le 1 ]; then + echo "missing parameters." + exit 1 + fi + sha=$(get_manifest_sha $@) + echo $sha + base_image="$repo@$sha" + echo $base_image + if [ -n "$sha" ]; then + tag=$tag_repo-tags:$arch + sed "s|{{base_image}}|$base_image|g" Dockerfile.template > Dockerfile.$arch + docker buildx build --platform linux/$arch -t $tag -f Dockerfile.$arch . + fi +} + +deploy_image(){ + local repo=$1 + local arch=$2 #arm arm64 amd64 + tag_arch=$repo-tags:$arch + tag_time=$(date +%Y%m%d%H%M) + tag_arch_time=$repo-tags:$arch-$tag_time + echo $tag_arch_time + docker tag $tag_arch $tag_arch_time + docker push $tag_arch_time + docker tag $tag_arch_time $tag_arch + docker push $tag_arch +} + +compare_sha () { + if [ "$1" != "$2" ] || [ "$3" != "$4" ] || [ "$5" != "$6" ]; then + echo "true" + else + echo "false" + fi +} + +create_manifests(){ + local repo=$1 + local tag=$2 + local x86=$3 + local rpi=$4 + local arm64=$5 + docker manifest create $repo:$tag $x86 $rpi $arm64 + docker manifest create $repo:latest $x86 $rpi $arm64 + docker manifest annotate $repo:latest $rpi --arch arm + docker manifest annotate $repo:$tag $arm64 --arch arm64 + docker manifest annotate $repo:latest $arm64 --arch arm64 + docker manifest annotate $repo:$tag $rpi --arch arm +} diff --git a/.github/workflows/webssh.yml b/.github/workflows/webssh.yml new file mode 100644 index 0000000..74a3f9b --- /dev/null +++ b/.github/workflows/webssh.yml @@ -0,0 +1,75 @@ +name: build on change + +on: + push: + branches: + - master + - main + workflow_dispatch: + repository_dispatch: + types: webssh + +jobs: + webssh: + runs-on: ubuntu-20.04 + steps: + - name: checkout code + uses: actions/checkout@v2 + - name: docker login + run: docker login -u ${{ secrets.DOCKERUSERNAME }} -p ${{ secrets.DOCKERAPIKEY }} + - name: treehouses webssh + run: | + export DOCKER_CLI_EXPERIMENTAL=enabled + repo="treehouses/webssh" + base="treehouses/alpine" + source .github/workflows/utils.sh + echo "amd64" + baseamd64=$(get_variant_sha "$base" "latest" "amd64") + echo $baseamd64 + repoamd64=$(get_manifest_sha "$repo:latest" "amd64") + echo $repoamd64 + echo "arm" + basearm=$(get_tag_sha "$base" "latest") + echo $basearm + repoarm=$(get_manifest_sha "$repo:latest" "arm") + echo $repoarm + echo "arm64" + basearm64=$(get_variant_sha "$base" "latest" "arm64") + echo $basearm64 + repoarm64=$(get_manifest_sha "$repo:latest" "arm64") + echo $repoarm64 + echo "change" + flag=$(compare_sha "$baseamd64" "$repoamd64" "$basearm" "$repoarm" "$basearm64" "$repoarm64") + echo $flag + if [[ $flag == true ]]; then + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + build_image "$base:latest" amd64 $repo + build_image "$base:latest" arm $repo + build_image "$base:latest" arm64 $repo + deploy_image $repo arm + deploy_image $repo amd64 + deploy_image $repo arm64 + sudo npm install -g @treehouses/cli + export gitter_channel="${{ secrets.CHANNEL }}" + echo "tags" + tag="$(date +%Y%m%d%H%M)" + echo $tag + docker manifest create $repo:$tag $repo-tags:amd64 $repo-tags:arm $repo-tags:arm64 + docker manifest annotate $repo:$tag $repo-tags:amd64 --arch amd64 + docker manifest annotate $repo:$tag $repo-tags:arm64 --arch arm64 + docker manifest annotate $repo:$tag $repo-tags:arm --arch arm + docker manifest inspect $repo:$tag + docker manifest push $repo:$tag + tag2="latest" + echo $tag2 + docker manifest create $repo:$tag2 $repo-tags:amd64 $repo-tags:arm $repo-tags:arm64 + docker manifest annotate $repo:$tag2 $repo-tags:amd64 --arch amd64 + docker manifest annotate $repo:$tag2 $repo-tags:arm64 --arch arm64 + docker manifest annotate $repo:$tag2 $repo-tags:arm --arch arm + docker manifest inspect $repo:$tag2 + docker manifest push $repo:$tag2 + echo "https://hub.docker.com/r/treehouses/webssh/tags" + treehouses feedback "new treehouses/webssh check https://hub.docker.com/r/treehouses/webssh/tags" + else + echo "no changes" + fi diff --git a/.travis.yml b/.travis.yml deleted file mode 100755 index c4296ec..0000000 --- a/.travis.yml +++ /dev/null @@ -1,58 +0,0 @@ -sudo: required -dist: bionic -addons: - apt: - update: true - packages: - - docker-ce -services: - - docker -script: - - export DOCKER_CLI_EXPERIMENTAL=enabled - - source utils.sh - - alpine_arm_sha=$(get_manifest_sha "treehouses/alpine:latest" "arm") - - echo $alpine_arm_sha - - alpine_amd64_sha=$(get_manifest_sha "treehouses/alpine:latest" "amd64") - - echo $alpine_amd64_sha - - alpine_arm64_sha=$(get_manifest_sha "treehouses/alpine:latest" "arm64") - - echo $alpine_arm64_sha - - webssh_arm_sha=$(get_manifest_sha "treehouses/webssh:latest" "arm") - - echo $webssh_arm_sha - - webssh_amd64_sha=$(get_manifest_sha "treehouses/webssh" "amd64") - - echo $webssh_amd64_sha - - webssh_arm64_sha=$(get_manifest_sha "treehouses/webssh" "arm64") - - echo $webssh_arm64_sha - - flag_arm=$(is_base "treehouses/alpine@"$alpine_arm_sha "treehouses/webssh@"$webssh_arm_sha ) - - echo $flag_arm - - flag_amd64=$(is_base "treehouses/alpine@"$alpine_amd64_sha "treehouses/webssh@"$webssh_amd64_sha ) - - echo $flag_amd64 - - flag_arm64=$(is_base "treehouses/alpine@"$alpine_arm64_sha "treehouses/webssh@"$webssh_arm64_sha ) - - echo $flag_arm64 - - echo $DOCKERAPIKEY | docker login -u "sevenseas" --password-stdin - - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - - build_image "treehouses/alpine:latest" arm "treehouses/webssh" #base image is arm arch - - build_image "treehouses/alpine:latest" amd64 "treehouses/webssh" #base image is amd64 arch - - build_image "treehouses/alpine:latest" arm64 "treehouses/webssh" #base image is arm64 arch - #- "./docker-build.sh treehouses/alpine:latest arm arm64 amd64" - - flag=$(compare "treehouses/alpine@"$alpine_arm_sha "treehouses/webssh@"$webssh_arm_sha "treehouses/alpine@"$alpine_amd64_sha "treehouses/webssh@"$webssh_amd64_sha "treehouses/alpine@"$alpine_arm64_sha "treehouses/webssh@"$webssh_arm64_sha "treehouses/webssh:latest" "treehouses/webssh-tags:amd64") - - echo $flag -before_deploy: - - deploy_image "treehouses/webssh" arm - - deploy_image "treehouses/webssh" amd64 - - deploy_image "treehouses/webssh" arm64 - - tag_time=$(date +%Y%m%d%H%M) - - echo $tag_time - - tag_latest="latest" - - create_manifest treehouses/webssh $tag_latest $tag_time treehouses/webssh-tags:arm treehouses/webssh-tags:arm64 treehouses/webssh-tags:amd64 - - docker manifest inspect treehouses/webssh:$tag_latest - - docker manifest inspect treehouses/webssh:$tag_time -deploy: - - provider: script - script: docker manifest push treehouses/webssh:$tag_latest; docker manifest push treehouses/webssh:$tag_time - skip_cleanup: true - on: - all_branches: true - condition: "$flag = true" -env: - global: - secure: "BmYuUvrKczoqtSiaxI7ps4LLdzpLNGnPTR9gFM7A6+mcYU9FOIAgzuhDC00tq2NeafpXpebmA+e/i1f+QPHg/z6pIVnYq0UM7IfzHBrP2KBu9QIoOn62KcAwVgMAbvIVpASN1zsykYba8NHuiloQ7ol2CxnqJupdhxUr4+d0nthYCM90at/qLHQRrvplIdBfLY6ilGGEOad9zq1HLZDkmsJPHkhVEm8QVeiEQg2JxBmhZLGD1dT5HATJIhsnwBuzq1GBBzFQ0ELeH0svRnXpUsBLa8MK94+mxVCG+mARbka2Cqp8TfhZv5+Sa+7Bdxwvq9HOtdg/2KF+sxz+lKPQ/agmAvt+UR0VtOEND2hWhQrvUXZpOJY5zq2B+2XnLJHc/pzAlHYLnRVXwszW6fR8ILw27m+0OL5GnRY/s8gBT0BnTH4NAAobc+Jz4RPFfAJT1EWoiBDn3odPcE2U+D7uEnadrZD7Kz+TBMKC0xQ6ba2KPxbt1JWIGKSynedzW40BPXw1mZfZGgw793H1pIzehVrrf83nU1/26h80ujT2gljbP4kwN0kwM8LQtjI/1665spqNhXc/UIzT5RJT74OU5GHKAJrF5nIT/feNncudOk05Qg/riO3T4Ks66BhfAF4LN0V6/7A/k44iROM8fxaZ+j7Amu5uhJPJnDBo3mWIkqI=" diff --git a/utils.sh b/utils.sh deleted file mode 100755 index a365f9d..0000000 --- a/utils.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/bash - -get_manifest_sha() { - local repo=$1 - local arch=$2 - docker pull -q $1 &>/dev/null - docker manifest inspect $1 > "$2".txt - sha="" - i=0 - while [ "$sha" == "" ] && read -r line; do - architecture=$(jq .manifests[$i].platform.architecture "$2".txt |sed -e 's/^"//' -e 's/"$//') - if [ "$architecture" = "$2" ];then - sha=$(jq .manifests[$i].digest "$2".txt |sed -e 's/^"//' -e 's/"$//') - echo ${sha} - fi - i=$i+1 - done < "$2".txt -} - -get_sha() { - repo=$1 - docker pull $1 &>/dev/null - sha=$(docker image inspect $1 | jq --raw-output '.[0].RootFS.Layers|.[]') # [0] means first element of list,[]means all the elments of lists - echo $sha -} - -is_base() { - local base_sha # alpine - local image_sha # new image - local base_repo=$1 - local image_repo=$2 - - base_sha=$(get_sha $base_repo) - image_sha=$(get_sha $image_repo) - - for i in $base_sha; do - local found="false" - for j in $image_sha; do - if [[ $i = $j ]]; then - found="true" - break - fi - done - if [ $found == "false" ]; then - echo "false" - return 0 - fi - done - echo "true" -} - -image_version() { - local version - repo=$1 # nginx repo - version=$(docker run -it $1 /bin/sh -c "nginx -v" |awk '{print$3}') - echo $version -} - -compare() { - result_arm=$(is_base $1 $2) - result_arm64=$(is_base $3 $4) - result_amd64=$(is_base $5 $6) - if [ $result_arm == "false" ] || [ $result_amd64 == "false" ] || [ $result_arm64 == "false" ]; - then - echo "true" - else - echo "false" - fi -} - -create_manifest() { - local repo=$1 - local tag1=$2 - local tag2=$3 - local x86=$4 - local rpi=$5 - local arm64=$6 - docker manifest create $repo:$tag1 $x86 $rpi $arm64 - docker manifest create $repo:$tag2 $x86 $rpi $arm64 - docker manifest annotate $repo:$tag1 $x86 --arch amd64 - docker manifest annotate $repo:$tag1 $rpi --arch arm - docker manifest annotate $repo:$tag1 $arm64 --arch arm64 - docker manifest annotate $repo:$tag2 $x86 --arch amd64 - docker manifest annotate $repo:$tag2 $rpi --arch arm - docker manifest annotate $repo:$tag2 $arm64 --arch arm64 -} - -build_image(){ - local repo=$1 # this is the base repo, for example treehouses/alpine - local arch=$2 #arm arm64 amd64 - local tag_repo=$3 # this is the tag repo, for example treehouses/node - if [ $# -le 1 ]; then - echo "missing parameters." - exit 1 - fi - sha=$(get_manifest_sha $@) - echo $sha - base_image="$repo@$sha" - echo $base_image - if [ -n "$sha" ]; then - tag=$tag_repo-tags:$arch - sed "s|{{base_image}}|$base_image|g" Dockerfile.template > Dockerfile.$arch - docker build -t $tag -f Dockerfile.$arch . - fi -} - -deploy_image(){ - local repo=$1 - local arch=$2 #arm arm64 amd64 - tag_arch=$repo-tags:$arch - tag_time=$(date +%Y%m%d%H%M) - tag_arch_time=$repo-tags:$arch-$tag_time - echo $tag_arch_time - docker tag $tag_arch $tag_arch_time - docker push $tag_arch_time - docker tag $tag_arch_time $tag_arch - docker push $tag_arch -}