Docker Build #142
This file contains hidden or 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
| # This is a basic workflow to help you get started with Actions | |
| name: Docker Build | |
| # Controls when the action will run. | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| version: | |
| required: true | |
| type: string | |
| description: "Version" | |
| release: | |
| types: [published] | |
| # A workflow run is made up of one or more jobs that can run sequentially or in parallel | |
| jobs: | |
| # This workflow contains a 2 jobs called "alpine" and "debian" | |
| alpine: | |
| env: | |
| # Setting the defaults up front | |
| LATEST_NODE: 20 | |
| DEFAULT_IMAGE: nodered/node-red | |
| GH_IMAGE: ghcr.io/node-red/node-red | |
| DEV_IMAGE: nodered/node-red-dev | |
| GH_DEV_IMAGE: ghcr.io/node-red/node-red-dev | |
| runs-on: ubuntu-latest | |
| strategy: | |
| max-parallel: 2 | |
| matrix: | |
| node: [24] | |
| suffix: ["", "-minimal"] | |
| # Steps represent a sequence of tasks that will be executed as part of the job | |
| steps: | |
| - | |
| name: Checkout | |
| uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 | |
| - name: Show Env | |
| run: env | |
| - | |
| name: Docker Metadata | |
| id: meta | |
| uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0 | |
| with: | |
| flavor: | | |
| latest=false | |
| suffix=-${{matrix.node}}${{matrix.suffix}} | |
| images: | | |
| ${{ env.DEFAULT_IMAGE }} | |
| ${{ env.GH_IMAGE }} | |
| tags: | | |
| type=ref,event=branch | |
| type=semver,pattern={{version}} | |
| - | |
| name: Setup QEMU | |
| uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0 | |
| with: | |
| platforms: arm64 | |
| - | |
| name: Set up SSH key pi5 | |
| uses: MrSquaare/ssh-setup-action@2d028b70b5e397cf8314c6eaea229a6c3e34977a # v3.1.0 | |
| with: | |
| host: ${{ secrets.SSH_REMOTE_HOST}} | |
| private-key: ${{ secrets.SSH_PRIVATE_KEY }} | |
| private-key-name: remote | |
| port: 2022 | |
| - | |
| name: Set up SSH key pi4 | |
| uses: MrSquaare/ssh-setup-action@2d028b70b5e397cf8314c6eaea229a6c3e34977a # v3.1.0 | |
| with: | |
| host: ${{ secrets.SSH_REMOTE_HOST}} | |
| private-key: ${{ secrets.SSH_PRIVATE_KEY }} | |
| private-key-name: remote | |
| port: 2023 | |
| - | |
| name: Setup Docker buildx | |
| uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 | |
| with: | |
| append: | | |
| - endpoint: ssh://nr@${{ secrets.SSH_REMOTE_HOST }}:2023 | |
| platforms: linux/arm/v6,linux/arm/v7 | |
| - endpoint: ssh://nr@${{ secrets.SSH_REMOTE_HOST }}:2022 | |
| platforms: linux/arm64 | |
| - name: Get Date | |
| id: date | |
| # run: echo "::set-output name=date::$(date +'%Y-%m-%dT%H:%M:%SZ')" | |
| run: echo "date=$(date +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT | |
| - name: Get Node-RED Version | |
| id: nrVersion | |
| run: | | |
| TAGS="" | |
| while IFS= read -r TAG;do | |
| if [ -z "$TAGS" ]; then | |
| TAGS=$TAG | |
| else | |
| TAGS="$TAGS,$TAG" | |
| fi | |
| done <<< "${{ steps.meta.outputs.tags }}" | |
| echo "Start Tags = $TAGS" | |
| echo "GITHUB_REF = $GITHUB_REF" | |
| echo "version = ${{ github.event.inputs.version }}" | |
| if [[ ! -z "${{ github.event.inputs.version }}" ]]; then | |
| TEMP=${{ github.event.inputs.version }} | |
| TEMP=${TEMP:1} | |
| TEMP2=$(echo $GITHUB_REF | awk -F '/' '{ print $3}') | |
| echo "$GITHUB_REF - $TEMP" | |
| TAGS=$(echo $TAGS | sed "s/$TEMP2/$TEMP/g") | |
| TRAVIS_TAG=${{ github.event.inputs.version }} | |
| else | |
| TRAVIS_TAG=$(echo $GITHUB_REF | awk -F '/' '{ print $3}') | |
| fi | |
| echo "TRAVIS_TAG = $TRAVIS_TAG" | |
| if [[ "$TRAVIS_TAG" =~ ^v[0-9\.-]*$ ]]; then | |
| IMAGE=${{ env.DEFAULT_IMAGE }} | |
| GH_IMAGE=${{ env.GH_IMAGE}} | |
| PUSH=true | |
| VERSION=${TRAVIS_TAG:1} | |
| STABLE_VERSION=`echo ${VERSION} | sed -r 's/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)$/\1.\2/'` | |
| if [[ "${{ matrix.node }}" == "${{ env.LATEST_NODE }}" && "${{ matrix.suffix }}" == "" ]]; then | |
| TAGS="$TAGS,$IMAGE:$VERSION,$IMAGE:$STABLE_VERSION,$IMAGE:latest,$GH_IMAGE:$VERSION,$GH_IMAGE:$STABLE_VERSION,$GH_IMAGE:latest" | |
| elif [[ "${{ matrix.node }}" == "${{ env.LATEST_NODE }}" && "${{ matrix.suffix }}" == "-minimal" ]]; then | |
| TAGS="$TAGS,$IMAGE:$VERSION-minimal,$IMAGE:latest-minimal,$GH_IMAGE:$VERSION-minimal,$GH_IMAGE:latest-minimal" | |
| fi | |
| TAGS="$TAGS,$IMAGE:latest-${{ matrix.node }}${{ matrix.suffix }},$GH_IMAGE:latest-${{ matrix.node }}${{ matrix.suffix }}" | |
| else | |
| IMAGE=${{ env.DEV_IMAGE }} | |
| GH_IMAGE=${{ env.GH_DEV_IMAGE}} | |
| if [[ "$TRAVIS_TAG" == *"dev"* || "$TRAVIS_TAG" == *"beta"* ]]; then | |
| PUSH=true | |
| else | |
| PUSH=false | |
| fi | |
| VERSION=${TRAVIS_TAG} | |
| if [[ "$VERSION" =~ ^v ]]; then | |
| VERSION=${TRAVIS_TAG:1} | |
| fi | |
| TAGS=$(echo $TAGS | sed 's!${{ env.DEFAULT_IMAGE}}!${{ env.DEV_IMAGE }}!') | |
| TAGS=$(echo $TAGS | sed 's!${{ env.GH_IMAGE}}!${{ env.GH_DEV_IMAGE }}!') | |
| if [ "${{ matrix.node }}" == "${{ env.LATEST_NODE }}" ] && [ "${{ matrix.suffix}}" == "" ]; then | |
| TAGS="$TAGS,$IMAGE:$VERSION,$GH_IMAGE:$VERSION" | |
| fi | |
| fi | |
| # if [[ "${{ matrix.node }}" == "18"]]; then | |
| # echo "platforms=linux/amd64,linux/arm/v7,linux/arm64" >> $GITHUB_OUTPUT | |
| # else | |
| # echo "platforms=linux/amd64,linux/arm64" >> $GITHUB_OUTPUT | |
| # fi | |
| # if [[ "${{ matrix.suffix }}" == "-minimal" ]]; then | |
| # echo "platforms=linux/amd64,linux/arm64" >> $GITHUB_OUTPUT | |
| # else | |
| # echo "platforms=linux/amd64,linux/arm/v7,linux/arm64" >> $GITHUB_OUTPUT | |
| # fi | |
| echo "platforms=linux/amd64,linux/arm/v7,linux/arm64" >> $GITHUB_OUTPUT | |
| echo $TAGS | |
| echo "tags=$TAGS" >> $GITHUB_OUTPUT | |
| echo "push=$PUSH" >> $GITHUB_OUTPUT | |
| echo "version=$TRAVIS_TAG" >> $GITHUB_OUTPUT | |
| echo "buildVersion=$VERSION" >> $GITHUB_OUTPUT | |
| cat $GITHUB_OUTPUT | |
| # echo "::set-output name=tags::$TAGS" | |
| # echo "::set-output name=push::$PUSH" | |
| # echo "::set-output name=version::$TRAVIS_TAG" | |
| # echo "::set-output name=buildVersion::$VERSION" | |
| - | |
| name: Login to DockerHub | |
| uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - | |
| name: Login to GitHub Container Registry | |
| uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 | |
| with: | |
| registry: ghcr.io | |
| username: ${{ github.repository_owner }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - | |
| name: Build and push | |
| id: build-push | |
| uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 | |
| with: | |
| context: . | |
| platforms: ${{ steps.nrVersion.outputs.platforms }} | |
| push: ${{ steps.nrVersion.outputs.push }} | |
| file: .docker/Dockerfile.alpine | |
| build-args: | | |
| NODE_VERSION=${{ matrix.node }} | |
| BUILD_DATE=${{ steps.date.outputs.date }} | |
| BUILD_VERSION=${{ steps.nrVersion.outputs.buildVersion }} | |
| BUILD_REF=${{ env.GITHUB_SHA }} | |
| NODE_RED_VERSION=${{ steps.nrVersion.outputs.version }} | |
| TAG_SUFFIX=${{ matrix.suffix }} | |
| tags: ${{ steps.nrVersion.outputs.tags }} | |
| debian: | |
| env: | |
| # Setting the defaults up front | |
| LATEST_NODE: 20 | |
| DEFAULT_IMAGE: nodered/node-red | |
| GH_IMAGE: ghcr.io/node-red/node-red | |
| DEV_IMAGE: nodered/node-red-dev | |
| GH_DEV_IMAGE: ghcr.io/node-red/node-red-dev | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 | |
| - name: Setup QEMU | |
| uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0 | |
| with: | |
| image: tonistiigi/binfmt:qemu-v7.0.0-28 | |
| - name: Setup Docker buildx | |
| uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 | |
| - name: Login to DockerHub | |
| uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Login to GitHub Container Registry | |
| uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 | |
| with: | |
| registry: ghcr.io | |
| username: ${{ github.repository_owner }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Get Date | |
| id: date | |
| # run: echo "::set-output name=date::$(date +'%Y-%m-%dT%H:%M:%SZ')" | |
| run : echo "date=$(date +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT | |
| - name: Docker Metadata | |
| id: meta | |
| uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0 | |
| with: | |
| flavor: | | |
| latest=false | |
| images: | | |
| ${{ env.DEFAULT_IMAGE }} | |
| ${{ env.GH_IMAGE }} | |
| tags: | | |
| type=ref,event=branch | |
| type=semver,pattern={{version}} | |
| - name: Get Node-RED Version | |
| id: nrVersion | |
| run: | | |
| TAGS="" | |
| while IFS= read -r TAG;do | |
| if [ -z "$TAGS" ]; then | |
| TAGS=$TAG | |
| else | |
| TAGS="$TAGS,$TAG" | |
| fi | |
| done <<< "${{ steps.meta.outputs.tags }}" | |
| echo "Original tags $TAGS" | |
| if [[ ! -z "${{ github.event.inputs.version }}" ]]; then | |
| TRAVIS_TAG=${{ github.event.inputs.version }} | |
| else | |
| TRAVIS_TAG=$(echo $GITHUB_REF | awk -F '/' '{ print $3}') | |
| fi | |
| if [[ "$TRAVIS_TAG" =~ ^v[0-9\.-]*$ ]]; then | |
| # release build | |
| IMAGE=${{ env.DEFAULT_IMAGE }} | |
| GH_IMAGE=${{ env.GH_IMAGE }} | |
| PUSH=true | |
| VERSION=${TRAVIS_TAG:1} | |
| STABLE_VERSION=`echo ${VERSION} | sed -r 's/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)$/\1.\2/'` | |
| TAGS="$IMAGE:latest-debian,$IMAGE:$VERSION-debian,$IMAGE:$STABLE_VERSION-debian,$GH_IMAGE:latest-debian,$GH_IMAGE:$VERSION-debian,$GH_IMAGE:$STABLE_VERSION-debian" | |
| else | |
| IMAGE=${{ env.DEV_IMAGE }} | |
| GH_IMAGE=${{ env.GH_DEV_IMAGE}} | |
| if [[ "$TRAVIS_TAG" == *"dev"* || "$TRAVIS_TAG" == *"beta"* ]]; then | |
| # beta build | |
| PUSH=true | |
| else | |
| PUSH=false | |
| fi | |
| VERSION=${TRAVIS_TAG} | |
| if [[ "$VERSION" =~ ^v ]]; then | |
| VERSION=${TRAVIS_TAG:1} | |
| fi | |
| TAGS="$IMAGE:$VERSION-debian,$GH_DEV_IMAGE:$VERSION-debian" | |
| fi | |
| echo $TAGS | |
| echo "tags=$TAGS" >> $GITHUB_OUTPUT | |
| echo "push=$PUSH" >> $GITHUB_OUTPUT | |
| echo "version=$TRAVIS_TAG" >> $GITHUB_OUTPUT | |
| echo "buildVersion=$VERSION" >> $GITHUB_OUTPUT | |
| cat $GITHUB_OUTPUT | |
| - name: Build and push | |
| id: build-push | |
| uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 | |
| with: | |
| context: . | |
| platforms: linux/amd64, linux/arm64, linux/arm/v7 | |
| file: .docker/Dockerfile.debian | |
| push: ${{ steps.nrVersion.outputs.push }} | |
| build-args: | | |
| NODE_VERSION=${{ env.LATEST_NODE }} | |
| BUILD_DATE=${{ steps.date.outputs.date }} | |
| BUILD_REF=${{ env.GITHUB.SHA }} | |
| TAG_SUFFIX=-debian | |
| NODE_RED_VERSION=${{ steps.nrVersion.outputs.version }} | |
| BUILD_VERSION=${{ steps.nrVersion.outputs.buildVersion }} | |
| tags: ${{ steps.nrVersion.outputs.tags }} | |