diff --git a/.github/workflows/apache.yml b/.github/workflows/apache.yml new file mode 100644 index 0000000..64d1469 --- /dev/null +++ b/.github/workflows/apache.yml @@ -0,0 +1,103 @@ +name: build on change + +on: + push: + branches: + - master + - main + workflow_dispatch: + repository_dispatch: + types: apache + +jobs: + compare: + runs-on: ubuntu-latest + outputs: + flag: ${{ steps.set-flag.outputs.flag }} + strategy: + fail-fast: false + matrix: + arch: [amd64, arm, arm64] + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Log in to the Container registries + run: | + docker login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }} + docker login docker.io -u ${{ secrets.DOCKERUSERNAME }} -p ${{ secrets.DOCKERAPIKEY }} + - name: Compare images for changes + id: set-flag + run: | + export DOCKER_CLI_EXPERIMENTAL=enabled + repo="treehouses/apache-tags:${{ matrix.arch }}" + base="treehouses/debian-tags:${{ matrix.arch }}" + docker pull -q $base &>/dev/null + docker pull -q $repo &>/dev/null + basesha=$(docker image inspect $base | jq --raw-output '.[0].RootFS.Layers|.[]') + reposha=$(docker image inspect $repo | jq --raw-output '.[0].RootFS.Layers|.[]') + echo "base sha:$basesha repo sha:$reposha" + [[ $reposha == *$basesha* ]] && echo "no changes" || echo "::set-output name=flag::true" + images: + needs: compare + runs-on: ubuntu-latest + outputs: + build: ${{ steps.set-build.outputs.build }} + strategy: + fail-fast: false + matrix: + arch: [amd64, arm, arm64] + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Log in to the Container registries + run: | + docker login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }} + docker login docker.io -u ${{ secrets.DOCKERUSERNAME }} -p ${{ secrets.DOCKERAPIKEY }} + + - name: Build docker image + if: ${{ needs.compare.outputs.flag }} + id: set-build + run: | + export DOCKER_CLI_EXPERIMENTAL=enabled + echo "**************0*************" + base="treehouses/debian-tags:${{ matrix.arch }}" + repo="treehouses/apache-tags:${{ matrix.arch }}" + date="$(date +%Y%m%d%H%M)" + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + docker build -t ghcr.io/$repo --build-arg BASE=$base . + docker tag ghcr.io/$repo docker.io/$repo + docker tag ghcr.io/$repo ghcr.io/$repo-$date + docker tag docker.io/$repo docker.io/$repo-$date + docker push ghcr.io/$repo + docker push docker.io/$repo + docker push ghcr.io/$repo-$date + docker push docker.io/$repo-$date + docker images + echo "::set-output name=build::true" + manifests: + needs: images + strategy: + fail-fast: false + matrix: + registry: [docker.io, ghcr.io] + runs-on: ubuntu-latest + steps: + + - name: Log in to the Container registries + run: | + docker login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }} + docker login docker.io -u ${{ secrets.DOCKERUSERNAME }} -p ${{ secrets.DOCKERAPIKEY }} + - name: Deploying manifest to Container Registries + if: ${{ needs.images.outputs.build }} + run: | + repo="${{ matrix.registry }}/treehouses/apache" + date="$(date +%Y%m%d%H%M)" + docker manifest create $repo:latest $repo-tags:amd64 $repo-tags:arm $repo-tags:arm64 + docker manifest create $repo:$date $repo-tags:amd64 $repo-tags:arm $repo-tags:arm64 + docker manifest annotate $repo:latest $repo-tags:arm --os linux --arch arm + docker manifest annotate $repo:$date $repo-tags:arm --os linux --arch arm + docker manifest inspect $repo:latest + docker manifest push $repo:latest + docker manifest push $repo:$date \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8f6f30c..0000000 --- a/.travis.yml +++ /dev/null @@ -1,60 +0,0 @@ -sudo: required -addons: - apt: - update: true - packages: - - docker-ce -services: -- docker -script: -- export DOCKER_CLI_EXPERIMENTAL=enabled -- source utils.sh -- debian_arm_sha=$(get_manifest_sha "treehouses/debian:latest" "arm") -- echo $debian_arm_sha -- apache_arm_sha=$(get_manifest_sha "treehouses/apache:latest" "arm") -- echo $apache_arm_sha -- flag_arm=$(is_base "treehouses/debian@"$debian_arm_sha "treehouses/apache@"$apache_arm_sha) -- echo $flag_arm -- debian_amd64_sha=$(get_manifest_sha "treehouses/debian:latest" "amd64") -- echo $debian_amd64_sha -- apache_amd64_sha=$(get_manifest_sha "treehouses/apache:latest" "amd64") -- echo $apache_amd64_sha -- flag_amd64=$(is_base "treehouses/debian@"$debian_amd64_sha "treehouses/apache@"$apache_amd64_sha) -- echo $flag_amd64 -- debian_arm64_sha=$(get_manifest_sha "treehouses/debian:latest" "arm64") -- echo $debian_arm64_sha -- apache_arm64_sha=$(get_manifest_sha "treehouses/apache:latest" "arm64") -- echo $apache_arm64_sha -- flag_arm64=$(is_base "treehouses/debian@"$debian_arm64_sha "treehouses/apache@"$apache_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/debian:latest" arm "treehouses/apache" -- build_image "treehouses/debian:latest" amd64 "treehouses/apache" -- build_image "treehouses/debian:latest" arm64 "treehouses/apache" -- flag=$(compare "treehouses/debian@"$debian_arm_sha "treehouses/apache@"$apache_arm_sha "treehouses/debian@"$debian_amd64_sha "treehouses/apache@"$apache_amd64_sha "treehouses/debian@"$debian_arm64_sha "treehouses/apache@"$apache_arm64_sha "treehouses/apache:latest" "treehouses/apache-tags:amd64") -- echo $flag -#- flag=false -before_deploy: -- deploy_image "treehouses/apache" arm -- deploy_image "treehouses/apache" amd64 -- deploy_image "treehouses/apache" arm64 -- timetag=$(date +%Y%m%d%H%M) -- echo $timetag -- tag1="latest" -- tag2=$timetag -- echo $tag2 -- create_manifest treehouses/apache $tag1 $tag2 treehouses/apache-tags:amd64 treehouses/apache-tags:arm - treehouses/apache-tags:arm64 -- docker manifest inspect treehouses/apache:$tag1 -- docker manifest inspect treehouses/apache:$tag2 -deploy: -- provider: script - script: docker manifest push treehouses/apache:$tag1; docker manifest push treehouses/apache:$tag2 - skip_cleanup: true - on: - all_branches: true - condition: "$flag = true" -env: - global: - - secure: ho/V9sBvcRIjMBzN/FMJDuCFvfZ1z2tUD7INjOzOfizXOK152Mtog64mDaToXAyuXT7GdXP/oz7Rf73jFurE5Xt46EKT7/HluGWvAgYyn9QqvzX1hdM5urMmO/vesfOb/BivbaJatazoNC7AayRiqecG+sMDr2nsgoAlZ1SXjum82x8J0yC1YGhPhHcx/A+KBIuUs/RQDc7iiTCrZuQ65oOXqeKI6TP5N4Qhp6gMJRA5DDoGU0jjwOK3UvCp0zUU29RVjnlldePks/Dl2dATXyTPR+bvZuS8lFy1S8rtLcjdE7wqF1JWv1nmijULGGv68q5yeWO68vELQT6BC/ziYUF/6xQ1VTVloMgaiuzjQKrpd5T2gMhALsSZpZgegg+/zl8RBFyg5hyPV8NH9GmkD3dhDPnR2r4oVaURur2Vmj+aD4hjm3WNhtxNQJ4vJTasTU1A3KWymenfNG0voV3okJe/GsPnx7OYI1R0Cgn6mgV60CHwofYQdtMBkuF9WiYNhqvoUZnJytW2/MbJNLV8Ff7pmuvAz8EJtFhEnfyEr9kpHY/9cxL7NtJJLwrtFToX9wcBpLpbyGRiMpJWecFG42G6EJ/0M5hk8pZzescLM++JCksIMvJncpqLptD6ihi/ff9tPCipGiCAJEfuutMYzEHR5arWKoDmh9W9IF/ylgc= diff --git a/Dockerfile.template b/Dockerfile similarity index 87% rename from Dockerfile.template rename to Dockerfile index 1a4b0f5..ce2682e 100644 --- a/Dockerfile.template +++ b/Dockerfile @@ -1,4 +1,5 @@ -FROM {{base_image}} +ARG BASE= +FROM ${BASE} RUN apt-get update -y && apt-get install -y apache2 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 -}