Publish to Registry #241
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Publish to Registry | |
on: | |
push: | |
branches: | |
- master | |
paths: | |
- "**/Dockerfile" | |
- "**/entrypoint.sh" | |
- ".github/workflows/deploy.yml" | |
schedule: | |
- cron: "7 4 * * 0" # Weekly on Sundays at 13:07 (JST) | |
workflow_dispatch: | |
env: | |
DOCKER_USERNAME: tiryoh | |
DOCKER_IMAGENAME: ros2-desktop-vnc | |
GIT_CONFIG_USER: Tiryoh@GitHubActions | |
GIT_CONFIG_EMAIL: tiryoh@gmail.com | |
jobs: | |
build-and-deploy: | |
strategy: | |
fail-fast: false | |
matrix: | |
ros-distro: [foxy, humble, iron, rolling] | |
arch: [arm64, amd64] | |
# runs-on: self-hosted | |
runs-on: ubuntu-latest | |
timeout-minutes: 120 | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: docker/setup-qemu-action@v2 | |
- name: Prepare Docker metadata | |
id: meta | |
uses: docker/metadata-action@v4 | |
with: | |
images: | | |
${{ env.DOCKER_USERNAME }}/${{ env.DOCKER_IMAGENAME }} | |
tags: | | |
type=raw,value=${{ matrix.ros-distro }}-${{ matrix.arch }}-{{date 'YYYYMMDDTHHmm'}} | |
type=raw,value=${{ matrix.ros-distro }}-${{ matrix.arch }} | |
flavor: | | |
latest=false | |
prefix= | |
suffix= | |
- name: Parse docker build option | |
id: docker-build-option | |
run: | | |
LABELS=$(cat << EOF | grep -E "=." | sed -e "s/org\./--label org./g" | sed -e "s/--label org\(.*\)=\(.*\)$/--label org\1='\2'/g" | |
${{ steps.meta.outputs.labels }} | |
EOF | |
) | |
echo $LABELS | |
echo "labels=${LABELS}" >> $GITHUB_OUTPUT | |
- name: Build docker image | |
env: | |
DOCKER_TAGNAME: ${{ matrix.ros-distro }}-${{ matrix.arch }} | |
run: | | |
if [[ -d ${DOCKER_TAGNAME%-amd64} ]]; then | |
cd ${DOCKER_TAGNAME%-amd64} && docker buildx build --no-cache --platform=linux/${{ matrix.arch }} --progress=plain ${{ steps.docker-build-option.outputs.labels }} -t $DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME . | |
elif [[ -d ${DOCKER_TAGNAME%-arm64} ]]; then | |
cd ${DOCKER_TAGNAME%-arm64} && docker buildx build --no-cache --platform=linux/${{ matrix.arch }} --progress=plain ${{ steps.docker-build-option.outputs.labels }} -t $DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME . | |
else | |
exit 1 | |
fi | |
- name: Login to ghcr.io | |
uses: docker/login-action@v2 | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Login to docker.io | |
uses: docker/login-action@v2 | |
with: | |
username: ${{ env.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKERHUB_TOKEN }} | |
- name: Publish docker image | |
env: | |
DOCKER_TAGNAME: ${{ matrix.ros-distro }}-${{ matrix.arch }} | |
id: docker | |
run: | | |
TIMESTAMP=$(date '+%Y%m%dT%H%M') | |
# ghcr.io | |
docker tag $DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME ghcr.io/$DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME | |
docker tag $DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME ghcr.io/$DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME-$TIMESTAMP | |
docker tag $DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME ghcr.io/$DOCKER_USERNAME/$DOCKER_IMAGENAME:${DOCKER_TAGNAME%-amd64}-$TIMESTAMP | |
docker push ghcr.io/$DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME | |
docker push ghcr.io/$DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME-$TIMESTAMP | |
docker push ghcr.io/$DOCKER_USERNAME/$DOCKER_IMAGENAME:${DOCKER_TAGNAME%-amd64}-$TIMESTAMP | |
# docker.io | |
docker push $DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME | |
docker tag $DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME $DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME-$TIMESTAMP | |
docker push $DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME-$TIMESTAMP | |
docker tag $DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME $DOCKER_USERNAME/$DOCKER_IMAGENAME:${DOCKER_TAGNAME%-amd64}-$TIMESTAMP | |
docker push $DOCKER_USERNAME/$DOCKER_IMAGENAME:${DOCKER_TAGNAME%-amd64}-$TIMESTAMP | |
echo "timestamp=${TIMESTAMP}" >> $GITHUB_OUTPUT | |
echo "digest=$(docker inspect --format='{{index .RepoDigests 0}}' $DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME-$TIMESTAMP)" >> $GITHUB_OUTPUT | |
- name: Cleanup docker image cache (amd64) | |
if: contains(matrix.arch, 'amd64') == true | |
env: | |
DOCKER_TAGNAME: ${{ matrix.ros-distro }}-${{ matrix.arch }} | |
TIMESTAMP: ${{ steps.docker.outputs.timestamp }} | |
run: | | |
docker rmi ghcr.io/$DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME-$TIMESTAMP | |
docker rmi ghcr.io/$DOCKER_USERNAME/$DOCKER_IMAGENAME:${DOCKER_TAGNAME%-amd64}-$TIMESTAMP | |
docker rmi $DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME-$TIMESTAMP | |
docker rmi $DOCKER_USERNAME/$DOCKER_IMAGENAME:${DOCKER_TAGNAME%-amd64}-$TIMESTAMP | |
- name: Cleanup docker image cache (arm64) | |
if: contains(matrix.arch, 'arm64') == true | |
env: | |
DOCKER_TAGNAME: ${{ matrix.ros-distro }}-${{ matrix.arch }} | |
TIMESTAMP: ${{ steps.docker.outputs.timestamp }} | |
run: | | |
docker rmi ghcr.io/$DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME-$TIMESTAMP | |
docker rmi $DOCKER_USERNAME/$DOCKER_IMAGENAME:$DOCKER_TAGNAME-$TIMESTAMP | |
- name: Get Current Job Log URL | |
id: jobs | |
uses: Tiryoh/gha-jobid-action@v0 | |
with: | |
github_token: ${{ secrets.GITHUB_TOKEN }} | |
job_name: build-and-deploy (${{ matrix.ros-distro }}, ${{ matrix.arch }}) | |
- name: Update GitHub wiki | |
env: | |
DOCKER_TAGNAME: ${{ matrix.ros-distro }}-${{ matrix.arch }} | |
DOCKER_SNAPSHOT: ${{ matrix.ros-distro }}-${{ matrix.arch }}-${{ steps.docker.outputs.timestamp }} | |
DOCKER_DIGEST_RAW: ${{ steps.docker.outputs.digest }} | |
TARGET_MD_NAME: ${{ matrix.ros-distro }}-${{ matrix.arch }} | |
run: | | |
DOCKER_DIGEST=$(echo $DOCKER_DIGEST_RAW | sed -E 's/.*@sha256:(.*)/sha256-\1/g') | |
DOCKER_DIGEST_SHORT=$(echo $DOCKER_DIGEST | sed -E 's/.*([0-9a-z]{12})[0-9a-z]{52}$/\1/g') | |
DOCKER_IMAGE_HISTORY_URL=$(echo https://hub.docker.com/layers/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}/${DOCKER_TAGNAME}/images/${DOCKER_DIGEST}) | |
DOCKER_SNAPSHOT_IMAGE_HISTORY_URL=$(echo https://hub.docker.com/layers/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}/${DOCKER_SNAPSHOT}/images/${DOCKER_DIGEST}) | |
git clone --depth=1 https://${GITHUB_ACTOR}:${{ secrets.GITHUB_TOKEN }}@github.com/${GITHUB_REPOSITORY}.wiki.git wiki | |
cd wiki | |
LINE=$(grep -n "add $DOCKER_TAGNAME msg after this line" ${TARGET_MD_NAME}.md | cut -d ":" -f 1) | |
head -n $LINE ${TARGET_MD_NAME}.md > tmp.md | |
echo "* \`${DOCKER_DIGEST_SHORT}\`" | tee -a tmp.md | |
echo " * uploaded on $(date --iso-8601="minutes")" | tee -a tmp.md | |
echo " * ${{ steps.jobs.outputs.html_url }}" | tee -a tmp.md | |
echo " * snapshot" | tee -a tmp.md | |
echo " * [\`${DOCKER_SNAPSHOT}\`](${DOCKER_SNAPSHOT_IMAGE_HISTORY_URL})" | tee -a tmp.md | |
tail -n +$(( $LINE+1 )) ${TARGET_MD_NAME}.md >> tmp.md | |
mv tmp.md ${TARGET_MD_NAME}.md | |
git config --local user.email "${GIT_CONFIG_EMAIL}" | |
git config --local user.name "${GIT_CONFIG_USER}" | |
git add ${TARGET_MD_NAME}.md | |
git commit -m "Update ${TARGET_MD_NAME}.md" | |
git fetch origin && git merge origin/master --no-edit && git push origin master || \ | |
git fetch origin && git merge origin/master --no-edit && git push origin master | |
# Since the Dockerfile differs between linux/arm64 and linux/amd64, the method editing the manifest directly is used. | |
# Use buildx when the Dockerfile can be merged into one file, like https://github.com/Tiryoh/docker-ros2/blob/master/.github/workflows/deploy.yml | |
upload: | |
needs: [build-and-deploy] | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
ros-distro: [foxy, galactic, humble, rolling] | |
steps: | |
- name: Prepare Docker | |
run: | | |
mkdir -p ~/.docker | |
grep -q '{' ~/.docker/config.json || echo '{}' | tee ~/.docker/config.json > /dev/null | |
jq '. |= .+ {"experimental": "enabled"}' ~/.docker/config.json > ~/docker-config.json && mv ~/docker-config.json ~/.docker/config.json | |
sudo service docker restart | |
- name: Login to ghcr.io | |
uses: docker/login-action@v2 | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Login to docker.io | |
uses: docker/login-action@v2 | |
with: | |
username: ${{ env.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKERHUB_TOKEN }} | |
- name: Prepare Docker Image | |
env: | |
ROS_DISTRO: ${{ matrix.ros-distro }} | |
run: | | |
docker pull ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-amd64 | |
docker pull ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-arm64 | |
docker pull ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-amd64 | |
docker pull ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-arm64 | |
- name: Publish Docker Image | |
env: | |
ROS_DISTRO: ${{ matrix.ros-distro }} | |
run: | | |
docker manifest create --amend ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO} ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-amd64 ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-arm64 | |
docker manifest annotate ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO} ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-arm64 --arch arm64 | |
docker manifest push ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO} | |
docker manifest create --amend ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO} ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-amd64 ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-arm64 | |
docker manifest annotate ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO} ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-arm64 --arch arm64 | |
docker manifest push ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO} | |
- name: Publish Docker Image as latest | |
if: contains(matrix.ros-distro, 'humble') == true | |
env: | |
ROS_DISTRO: ${{ matrix.ros-distro }} | |
run: | | |
docker manifest create --amend ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:latest ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-amd64 ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-arm64 | |
docker manifest annotate ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:latest ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-arm64 --arch arm64 | |
docker manifest push ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:latest | |
docker manifest create --amend ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:latest ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-amd64 ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-arm64 | |
docker manifest annotate ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:latest ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-arm64 --arch arm64 | |
docker manifest push ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:latest | |
- name: Cleanup docker image cache | |
env: | |
ROS_DISTRO: ${{ matrix.ros-distro }} | |
run: | | |
docker rmi ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-amd64 | |
docker rmi ghcr.io/${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-arm64 | |
docker rmi ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-amd64 | |
docker rmi ${DOCKER_USERNAME}/${DOCKER_IMAGENAME}:${ROS_DISTRO}-arm64 |