Build & Push GLPI Docker Image #167
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
| name: Sync Last 10 GLPI Images | |
| on: | |
| schedule: | |
| - cron: "0 3 * * *" # Run daily at 3 AM UTC | |
| workflow_dispatch: | |
| push: | |
| branches: [master] | |
| jobs: | |
| fetch-tags: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| tags: ${{ steps.get_tags.outputs.tags }} | |
| steps: | |
| - name: Fetch last 10 GLPI releases (stable + prerelease) | |
| id: get_tags | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| API_URL="https://api.github.com/repos/glpi-project/glpi/releases?per_page=20" | |
| HEADERS=(-H "Accept: application/vnd.github+json" \ | |
| -H "Authorization: Bearer $GH_TOKEN") | |
| RELEASES=$(curl -sL "${HEADERS[@]}" "$API_URL") | |
| # Take the latest 10 tags (includes prereleases) | |
| TAGS=$(echo "$RELEASES" | jq -r '.[0:10] | .[].tag_name') | |
| if [ -z "$TAGS" ]; then | |
| echo "tags=[]" >> $GITHUB_OUTPUT | |
| else | |
| echo "Found GLPI releases (last 10):" | |
| echo "$TAGS" | |
| TAGS_JSON=$(echo "$TAGS" | jq -R . | jq -s . | jq -c .) # compact JSON array | |
| echo "tags=$TAGS_JSON" >> $GITHUB_OUTPUT | |
| fi | |
| build: | |
| needs: fetch-tags | |
| if: needs.fetch-tags.outputs.tags != '[]' | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| tag: ${{ fromJson(needs.fetch-tags.outputs.tags) }} | |
| env: | |
| DOCKER_HUB_USERNAME_SET: ${{ secrets.DOCKER_HUB_USERNAME != '' }} | |
| DOCKER_HUB_ACCESS_TOKEN_SET: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN != '' }} | |
| GHCR_PAT_IS_SET: ${{ secrets.GHCR_PAT != '' }} | |
| steps: | |
| - name: Checkout Repository | |
| uses: actions/checkout@v4 | |
| - name: Get Release Info | |
| id: release_info | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| API_URL="https://api.github.com/repos/glpi-project/glpi/releases/tags/${{ matrix.tag }}" | |
| HEADERS=(-H "Accept: application/vnd.github+json" -H "Authorization: Bearer $GH_TOKEN") | |
| DATA=$(curl -sL "${HEADERS[@]}" "$API_URL") | |
| NOTES=$(echo "$DATA" | jq -r .body) | |
| IS_PRERELEASE=$(echo "$DATA" | jq -r .prerelease) | |
| IMAGE_TAG_VERSION="$(echo "${{ matrix.tag }}" | sed 's/^v//')" # drop leading v | |
| MAJOR_TAG="$(echo "$IMAGE_TAG_VERSION" | cut -d. -f1)" | |
| echo "IMAGE_TAG_VERSION=$IMAGE_TAG_VERSION" >> $GITHUB_ENV | |
| echo "MAJOR_TAG=$MAJOR_TAG" >> $GITHUB_ENV | |
| echo "IS_PRERELEASE=$IS_PRERELEASE" >> $GITHUB_ENV | |
| echo "$NOTES" > release_notes.md | |
| - name: Check if release already exists in this repo | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| if gh release view "${{ matrix.tag }}" >/dev/null 2>&1; then | |
| echo "Release ${{ matrix.tag }} already exists, skipping build." | |
| echo "skip_build=true" >> $GITHUB_ENV | |
| else | |
| echo "skip_build=false" >> $GITHUB_ENV | |
| fi | |
| - name: Create GitHub Release | |
| if: env.skip_build == 'false' | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| if [ "${{ env.IS_PRERELEASE }}" = "true" ]; then | |
| gh release create "${{ matrix.tag }}" \ | |
| --title "GLPI ${{ matrix.tag }}" \ | |
| --notes-file release_notes.md \ | |
| --prerelease | |
| else | |
| gh release create "${{ matrix.tag }}" \ | |
| --title "GLPI ${{ matrix.tag }}" \ | |
| --notes-file release_notes.md | |
| fi | |
| - name: Set up Docker Buildx | |
| if: env.skip_build == 'false' | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Log in to Docker Hub | |
| if: env.skip_build == 'false' && env.DOCKER_HUB_USERNAME_SET == 'true' && env.DOCKER_HUB_ACCESS_TOKEN_SET == 'true' | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKER_HUB_USERNAME }} | |
| password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} | |
| - name: Log in to GitHub Container Registry | |
| if: env.skip_build == 'false' && env.GHCR_PAT_IS_SET == 'true' | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ghcr.io | |
| username: ${{ github.repository_owner }} | |
| password: ${{ secrets.GHCR_PAT }} | |
| - name: Prepare Docker Tags | |
| if: env.skip_build == 'false' | |
| id: prep_tags | |
| run: | | |
| TAG=${{ env.IMAGE_TAG_VERSION }} | |
| MAJOR=${{ env.MAJOR_TAG }} | |
| IMAGE_DH=geniusdynamics/glpi | |
| IMAGE_GH=ghcr.io/${{ github.repository_owner }}/glpi | |
| TAGS="" | |
| if [[ "$TAG" == *"rc"* ]]; then | |
| # Pre-release RC tagging | |
| TAGS="$TAGS,$IMAGE_DH:$TAG,$IMAGE_DH:${MAJOR}-rc,$IMAGE_DH:rc" | |
| TAGS="$TAGS,$IMAGE_GH:$TAG,$IMAGE_GH:${MAJOR}-rc,$IMAGE_GH:rc" | |
| else | |
| # Stable release tagging | |
| TAGS="$TAGS,$IMAGE_DH:$TAG,$IMAGE_DH:$MAJOR,$IMAGE_DH:latest" | |
| TAGS="$TAGS,$IMAGE_GH:$TAG,$IMAGE_GH:$MAJOR,$IMAGE_GH:latest" | |
| fi | |
| TAGS=$(echo "$TAGS" | sed 's/^,//') | |
| echo "FINAL_TAGS=$TAGS" >> $GITHUB_ENV | |
| - name: Build and Push Image | |
| if: env.skip_build == 'false' && env.FINAL_TAGS != '' | |
| uses: docker/build-push-action@v6 | |
| with: | |
| context: . | |
| file: Dockerfile | |
| push: true | |
| tags: ${{ env.FINAL_TAGS }} | |
| platforms: linux/amd64 | |
| - name: Build Summary | |
| if: env.skip_build == 'false' | |
| run: | | |
| echo "✔️ Built GLPI ${{ matrix.tag }}" | |
| echo "Tags: ${{ env.FINAL_TAGS }}" |