Skip to content

Commit

Permalink
multiarch support (#3)
Browse files Browse the repository at this point in the history
  • Loading branch information
rjpadilla authored Jul 10, 2021
1 parent f154720 commit 59e1a2a
Show file tree
Hide file tree
Showing 4 changed files with 266 additions and 6 deletions.
78 changes: 78 additions & 0 deletions .github/workflows/force.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: build by force

on:
# push:
# branches:
# - master
# - main
workflow_dispatch:
# repository_dispatch:
# types: pm2

jobs:
pm2:
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v2
- name: login to docker
run: docker login -u ${{ secrets.DOCKERUSERNAME }} -p ${{ secrets.DOCKERAPIKEY }}
- name: treehouses pm2
run: |
export DOCKER_CLI_EXPERIMENTAL=enabled
repo="treehouses/pm2"
base="treehouses/node"
source .github/workflows/utils.sh
echo "amd64"
baseamd64=$(get_manifest_sha "$base:latest" "amd64")
echo $baseamd64
# repoamd64=$(get_manifest_sha "$repo:latest" "amd64")
# echo $repoamd64
# echo "flag amd64"
# flag_amd64=$(is_base "$base@"$baseamd64 "$repo@"$repoamd64)
# echo $flag_amd64
echo "arm"
basearm=$(get_manifest_sha "$base:latest" "arm")
echo $basearm
# repoarm=$(get_manifest_sha "$repo:latest" "arm")
# echo $repoarm
# flagarm=$(is_base "$base@"$basearm "$repo@"$repoarm)
# echo "flag arm"
# echo $flagarm
echo "arm64"
basearm64=$(get_manifest_sha "$base:latest" "arm64")
echo $basearm64
# repoarm64=$(get_manifest_sha "$repo:latest" "arm64")
# echo $repoarm64
# echo "flag arm64"
# flagarm64=$(is_base "$base@"$basearm64 "$repo@"$repoarm64)
# echo $flagarm64
version2=$(image_version $repo:latest)
echo "repo version is $version2"
flag=true #$(compare "$base@"$basearm "$repo@"$repoarm "$base@"$baseamd64 "$repo@"$repoamd64 "$base@"$basearm64 "$repo@"$repoarm64 "$repo" "$repo-tags:amd64")
echo $flag
if [[ $flag == true ]]; then
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
build_image "$base:latest" arm "$repo"
build_image "$base:latest" amd64 "$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)
tag2="latest"
echo $tag
create_manifest $repo $tag $tag2 $repo-tags:amd64 $repo-tags:arm $repo-tags:arm64
docker manifest inspect $repo:$tag
docker manifest inspect $repo:$tag2
docker manifest push $repo:$tag; docker manifest push $repo:$tag2
echo "https://hub.docker.com/r/treehouses/pm2/tags"
treehouses feedback "new treehouses/pm2 check https://hub.docker.com/r/treehouses/pm2/tags"
else
echo "no changes"
fi
71 changes: 66 additions & 5 deletions .github/workflows/pm2.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
name: pm2
name: build on change

on: [push]
on:
push:
branches:
- master
- main
workflow_dispatch:
repository_dispatch:
types: pm2

jobs:
pm2:
Expand All @@ -10,8 +17,62 @@ jobs:
uses: actions/checkout@v2
- name: login to docker
run: docker login -u ${{ secrets.DOCKERUSERNAME }} -p ${{ secrets.DOCKERAPIKEY }}
- name: building pm2 and deploying to docker
- name: treehouses pm2
run: |
export DOCKER_CLI_EXPERIMENTAL=enabled
docker build -t treehouses/pm2 .
docker push treehouses/pm2
repo="treehouses/pm2"
base="treehouses/node"
source .github/workflows/utils.sh
echo "amd64"
baseamd64=$(get_manifest_sha "$base:latest" "amd64")
echo $baseamd64
repoamd64=$(get_manifest_sha "$repo:latest" "amd64")
echo $repoamd64
echo "flag amd64"
flag_amd64=$(is_base "$base@"$baseamd64 "$repo@"$repoamd64)
echo $flag_amd64
echo "arm"
basearm=$(get_manifest_sha "$base:latest" "arm")
echo $basearm
repoarm=$(get_manifest_sha "$repo:latest" "arm")
echo $repoarm
flagarm=$(is_base "$base@"$basearm "$repo@"$repoarm)
echo "flag arm"
echo $flagarm
echo "arm64"
basearm64=$(get_manifest_sha "$base:latest" "arm64")
echo $basearm64
repoarm64=$(get_manifest_sha "$repo:latest" "arm64")
echo $repoarm64
echo "flag arm64"
flagarm64=$(is_base "$base@"$basearm64 "$repo@"$repoarm64)
echo $flagarm64
version2=$(image_version $repo:latest)
echo "repo version is $version2"
flag=$(compare "$base@"$basearm "$repo@"$repoarm "$base@"$baseamd64 "$repo@"$repoamd64 "$base@"$basearm64 "$repo@"$repoarm64 "$repo" "$repo-tags:amd64")
echo $flag
if [[ $flag == true ]]; then
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
build_image "$base:latest" arm "$repo"
build_image "$base:latest" amd64 "$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)
tag2="latest"
echo $tag
create_manifest $repo $tag $tag2 $repo-tags:amd64 $repo-tags:arm $repo-tags:arm64
docker manifest inspect $repo:$tag
docker manifest inspect $repo:$tag2
docker manifest push $repo:$tag; docker manifest push $repo:$tag2
echo "https://hub.docker.com/r/treehouses/pm2/tags"
treehouses feedback "new treehouses/pm2 check https://hub.docker.com/r/treehouses/pm2/tags"
else
echo "no changes"
fi
121 changes: 121 additions & 0 deletions .github/workflows/utils.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
#!/bin/bash

# Echos out sha function from saved .txt file
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
}

# Echos out sha function
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
}

# Check if base is part of an image
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 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
}
2 changes: 1 addition & 1 deletion Dockerfile → Dockerfile.template
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM treehouses/node
FROM {{base_image}}

# Install pm2
RUN npm install pm2 -g
Expand Down

0 comments on commit 59e1a2a

Please sign in to comment.