Skip to content

📦 Project Build #1292 #1292

📦 Project Build #1292

📦 Project Build #1292 #1292

Workflow file for this run

name: Project Build
run-name: "📦 Project Build #${{ github.run_number }}"
on:
push:
branches:
- dev
- main
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
DEV_ENVIRONMENT: ${{ github.ref_name != 'main' }}
jobs:
info:
name: 🖥️ Project Info
runs-on: ubuntu-latest
if: ${{ github.repository_owner == 'TerraFirmaGreg-Team' }}
outputs:
project_version: ${{ steps.check.outputs.project_version }}
project_name: ${{ steps.check.outputs.project_name }}
project_full_name: ${{ steps.check.outputs.project_name }}-${{ steps.check.outputs.project_version }}
changelog: ${{ steps.changelog.outputs.description }}
mc_version: ${{ steps.check.outputs.minecraft_version }}
release_type: ${{ steps.check.outputs.release_type }}
diff: ${{ steps.read_diff.outputs.diff }}
exists: ${{ steps.check.outputs.exists }}
make_release: ${{ steps.check.outputs.make_release }}
make_pr: ${{ steps.check.outputs.make_pr }}
steps:
- name: 📦 Checkout
uses: actions/checkout@v5.0.0
with:
fetch-depth: 0
- name: 🔍 Check pakku-lock.json
id: check_pakku_lock
shell: bash
run: |
if [ ! -f pakku-lock.json ]; then
echo "❌ Could not find pakku-lock.json" && exit 1
else
echo "✔️ pakku-lock.json"
fi
- name: 🔍 Check pakku.json
id: check_pakku
shell: bash
run: |
if [ ! -f pakku.json ]; then
echo "❌ Could not find pakku.json" && exit 1
else
echo "✔️ pakku.json"
fi
- name: 📈 Get latest tag
id: latest_tag
shell: bash
run: |
tag=$(git describe --tags --abbrev=0 origin/main)
if [ -z "$tag" ]; then
echo "❌ Latest tag not found" && exit 1
else
echo "✔️ Latest tag found: $tag"
echo "tag=$tag" >> $GITHUB_OUTPUT
fi
- name: 🔍 Check pakku-lock.json in previous tag
id: check_pakku_lock_prev
shell: bash
run: |
if git cat-file -e ${{ steps.latest_tag.outputs.tag }}:./pakku-lock.json 2>/dev/null; then
echo "✔️ File pakku-lock.json found in previous tag"
echo "file_found=true" >> $GITHUB_OUTPUT
else
echo "❌ File pakku-lock.json not found in previous tag"
echo "file_found=false" >> $GITHUB_OUTPUT
fi
- name: 📁 Check and copy pakku-lock.json from previous tag
id: check_copy_lock
if: steps.check_pakku_lock_prev.outputs.file_found
shell: bash
run: |
git show tags/${{ steps.latest_tag.outputs.tag }}:./pakku-lock.json > ./pakku-lock-prev.json
if [ -s ./pakku-lock-prev.json ]; then
echo "✔️ File pakku-lock-prev.json created"
else
echo "❌ Error: File pakku-lock-prev.json is empty or not created" && exit 1
fi
- name: 📦 Download pakku.jar
id: download_pakku
if: steps.check_pakku_lock_prev.outputs.file_found
shell: bash
run: |
curl https://github.com/juraj-hrivnak/pakku/releases/latest/download/pakku.jar -o pakku.jar -L -J
echo "✔️ Downloaded pakku.jar "
- name: 🔄 Run pakku diff
id: pakku_diff
if: steps.check_pakku_lock_prev.outputs.file_found
shell: bash
run: |
java -jar pakku.jar diff -v --markdown PROJECTS_DIFF.md ./pakku-lock-prev.json ./pakku-lock.json
if [ -f PROJECTS_DIFF.md ]; then
echo "✔️ Comparison completed"
else
echo "❌ Error: File PROJECTS_DIFF.md not created" && exit 1
fi
- name: 📝 Read PROJECTS_DIFF.md to variable
id: read_diff
if: steps.check_pakku_lock_prev.outputs.file_found
shell: bash
run: |
echo "📝 Reading PROJECTS_DIFF.md to variable..."
{
echo 'diff<<EOF'
cat -v PROJECTS_DIFF.md
echo EOF
} >> "$GITHUB_OUTPUT"
echo "✔️ Diff content read to variable"
- name: 📊 Get Pakku Info
id: pakku_info
uses: ActionsTools/read-json-action@v1.0.5
with:
file_path: "pakku.json"
- name: 📊 Get Pakku-lock Info
id: pakku_lock_info
uses: ActionsTools/read-json-action@v1.0.5
with:
file_path: "pakku-lock.json"
- name: 📄 Changelog Dev Parser
id: changelog_dev
if: ${{ env.DEV_ENVIRONMENT == 'true' }}
uses: coditory/changelog-parser@v1.0.2
with:
path: CHANGELOG.md
version: "unreleased"
continue-on-error: true
- name: 📄 Changelog Parser
id: changelog
uses: coditory/changelog-parser@v1.0.2
with:
path: CHANGELOG.md
continue-on-error: true
- name: 🔍 Check if tag exists
uses: mukunku/tag-exists-action@v1.6.0
id: check_tag
with:
tag: ${{ steps.changelog.outputs.version }}
- name: 🔍 Check
id: check
shell: bash
run: |
echo "project_name=${{ steps.pakku_info.outputs.name }}" >> $GITHUB_OUTPUT
MC_VERSIONS_JSON='${{ steps.pakku_lock_info.outputs.mc_versions }}'
MINECRAFT_VERSION=$(echo "$MC_VERSIONS_JSON" | jq -r '.[0]' | tr -d '[]"')
echo "minecraft_version=$MINECRAFT_VERSION" >> $GITHUB_OUTPUT
if ${{ env.DEV_ENVIRONMENT == 'true' }}; then
echo "project_version=build_#${{ github.run_number }}" >> $GITHUB_OUTPUT
else
echo "project_version=${{ steps.changelog.outputs.version }}" >> $GITHUB_OUTPUT
fi
echo "release_type=${{ steps.pakku_info.outputs.release_type }}" >> $GITHUB_OUTPUT
echo "exists=${{ steps.check_tag.outputs.exists }}" >> $GITHUB_OUTPUT
echo "make_release=${{ steps.check_tag.outputs.exists == 'false' && env.DEV_ENVIRONMENT == 'false' }}" >> $GITHUB_OUTPUT
echo "make_pr=${{ steps.check_tag.outputs.exists == 'false' && env.DEV_ENVIRONMENT == 'true' }}" >> $GITHUB_OUTPUT
- name: 📄 Format diff
id: format_diff
if: ${{ steps.read_diff.outputs.diff != '' }}
uses: roamingowl/template-output-with-eta@v1.13.0
with:
template: |
```markdown
${{ steps.read_diff.outputs.diff }}
```
- name: 📝 Generate Github Summary
uses: WcAServices/markdown-template-action@v1.1.1
with:
template: |
📃 **Name**: ${{ steps.check.outputs.project_name }}
📃 **Release**: `${{ steps.check.outputs.project_version }}`
📃 **Release Type**: `${{ steps.check.outputs.release_type }}`
📃 **Game Version**: `${{ steps.check.outputs.minecraft_version }}`
📃 **Dev Environment**: `${{ env.DEV_ENVIRONMENT }}`
📃 **Tag Exists**: `${{ steps.check.outputs.exists }}`
📃 **Make Pull Request**: `${{ steps.check.outputs.make_pr }}`
📃 **Make Release**: `${{ steps.check.outputs.make_release }}`
${{ steps.changelog_dev.outputs.description }}
${{ steps.format_diff.outputs.text }}
create-pr:
name: 🤝 Create Release PR
needs: [info]
if: ${{ needs.info.outputs.make_pr == 'true' }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5.0.0
with:
fetch-depth: 0
- name: 📄 Changelog Parser
id: changelog
uses: coditory/changelog-parser@v1.0.2
with:
path: CHANGELOG.md
continue-on-error: true
- name: 🔍 Check existing PRs
id: check_existing_pr
uses: actions/github-script@v7.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
result-encoding: string
script: |
try {
const { data: prs } = await github.rest.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
head: `${context.repo.owner}:dev`,
base: 'main'
});
core.setOutput('exists', prs.length > 0);
console.log(`ℹ️ PR exists: ${prs.length > 0}`);
} catch (error) {
core.setFailed(`❌ PR check failed: ${error}`);
core.setOutput('exists', true);
}
- name: 🔍 Create Pull Request if tag not found
if: ${{ steps.check_existing_pr.outputs.exists == 'false' }}
uses: devops-infra/action-pull-request@v0.6.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
source_branch: dev
target_branch: main
milestone: ${{ steps.changelog.outputs.version }}
ignore_users: "dependabot"
draft: true
title: 'Release: ${{ steps.changelog.outputs.version }}'
body: |
**This is an automated Pull Request from the dev branch.**
📃 **Name**: ${{ needs.info.outputs.project_name }}
📃 **Release**: `${{ steps.changelog.outputs.version }}`
📃 **Release Type**: `${{ needs.info.outputs.release_type }}`
${{ needs.info.outputs.changelog }}
build-modpack:
name: 📦 Build Modpack
needs: [info]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5.0.0
- name: 🔄 Replace strings
shell: bash
run: |
set +e
VERSION=${{ needs.info.outputs.project_version }}
sed -i -e "s/DEV/${VERSION}/g" pakku.json
sed -i -e "s/DEV/${VERSION}/g" config/fancymenu/customization/gui_main_menu.txt
- name: 📝 Cache pakku
uses: actions/cache@v4.2.4
id: cache
with:
path: build/.cache
key: pakku-cache-${{ hashFiles('pakku-lock.json') }}
restore-keys: pakku-cache-
- name: 📦 Export modpack
run: |
curl https://github.com/juraj-hrivnak/pakku/releases/latest/download/pakku.jar -o pakku.jar -L -J
java -jar pakku.jar export
- name: 📁 Rename artifact curseforge
run: |
cd ./build/curseforge/
mv *.zip $(basename -s .zip *.zip)-curseforge.zip
- name: 🚀 Upload artifact CurseForge
uses: actions/upload-artifact@v4.6.2
with:
name: ${{ needs.info.outputs.project_full_name }}-curseforge
path: ./build/curseforge/${{ needs.info.outputs.project_full_name }}-curseforge.zip
if-no-files-found: error
- name: 📁 Rename artifact modrinth
run: |
cd ./build/modrinth/
mv *.mrpack $(basename -s .mrpack *.mrpack)-modrinth.mrpack
- name: 🚀 Upload artifact modrinth
uses: actions/upload-artifact@v4.6.2
with:
name: ${{ needs.info.outputs.project_full_name }}-modrinth
path: ./build/modrinth/${{ needs.info.outputs.project_full_name }}-modrinth.mrpack
if-no-files-found: warn
- name: 📁 Rename artifact server
run: |
cd ./build/serverpack/
mv *.zip $(basename -s .zip *.zip)-serverpack.zip
- name: 🚀 Upload artifact server
uses: actions/upload-artifact@v4.6.2
with:
name: ${{ needs.info.outputs.project_full_name }}-serverpack
path: ./build/serverpack/${{ needs.info.outputs.project_full_name }}-serverpack.zip
if-no-files-found: error
build-multimc:
name: 📦 Build MultiMC
needs: [info]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5.0.0
- name: 🔄 Replace strings
shell: bash
run: |
set +e
VERSION=${{ needs.info.outputs.project_version }}
sed -i -e "s/\"version\": \"[0-9.]*\"/\"version\": \"${VERSION}\"/g" pakku.json
sed -i -e "s/DEV/${VERSION}/g" config/fancymenu/customization/gui_main_menu.txt
sed -i -e "s/DEV/${VERSION}/g" .pakku/multimc-overrides/instance.cfg
- name: 📝 Cache pakku
uses: actions/cache@v4.2.4
id: cache
with:
path: build/.cache
key: pakku-cache-${{ hashFiles('pakku-lock.json') }}
restore-keys: pakku-cache-
- name: 📦 Export
run: |
curl https://github.com/juraj-hrivnak/pakku/releases/latest/download/pakku.jar -o pakku.jar -L -J
java -jar pakku.jar --debug fetch
java -jar pakku.jar --debug export
- name: 📁 Move files
run: |
ls
mkdir -p .pakku/multimc-overrides/flame
mkdir -p .pakku/multimc-overrides/mods
mv -vf ./build/.cache/curseforge/manifest.json .pakku/multimc-overrides/flame/manifest.json
mv -vf ./build/.cache/curseforge/overrides .pakku/multimc-overrides/.minecraft
mv -vf ./mods .pakku/multimc-overrides/.minecraft/mods
cd .pakku/multimc-overrides/
zip -r ${{ needs.info.outputs.project_full_name }}-multimc.zip icon.png mmc-pack.json instance.cfg .minecraft/ flame/
- name: 🚀 Upload zip multimc
uses: actions/upload-artifact@v4.6.2
with:
name: ${{ needs.info.outputs.project_full_name }}-multimc
path: .pakku/multimc-overrides/${{ needs.info.outputs.project_full_name }}-multimc.zip
if-no-files-found: error
release-github:
name: 🚀 Release to GitHub
needs: [info, build-modpack, build-multimc]
runs-on: ubuntu-latest
if: ${{ needs.info.outputs.make_release == 'true' }}
outputs:
url: ${{ steps.release.outputs.url }}
steps:
- name: 📦 Checkout
uses: actions/checkout@v5.0.0
- name: 📦 Download artifact
uses: actions/download-artifact@v5.0.0
with:
merge-multiple: true
- name: 🔍 Check if artifact exist
id: check_artifact
shell: bash
run: |
if [ ! -f ${{ needs.info.outputs.project_full_name }}-curseforge.zip ]; then
echo '::error::No value found for artifact `curseforge.zip`.' && exit 1
fi
# if [ ! -f ${{ needs.info.outputs.project_full_name }}-modrinth.mrpack ]; then
# echo '::error::No value found for artifact `modrinth.mrpack`.' && exit 1
# fi
if [ ! -f ${{ needs.info.outputs.project_full_name }}-serverpack.zip ]; then
echo '::error::No value found for artifact `serverpack.zip`.' && exit 1
fi
if [ ! -f ${{ needs.info.outputs.project_full_name }}-multimc.zip ]; then
echo '::error::No value found for artifact `multimc.zip`.' && exit 1
fi
echo "✔️ All artifacts found"
# - name: 🚫 Сlose label "Done"
# uses: Xikaro/close-issues-based-on-label@master
# env:
# LABEL: "Status: Done"
# COMMENT: In ${{ needs.info.outputs.project_version }}
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: 📄 Format diff
id: format_diff
if: ${{ needs.info.outputs.diff != '' }}
uses: roamingowl/template-output-with-eta@v1.13.0
with:
template: |
```markdown
${{ needs.info.outputs.diff }}
```
- name: 🚀 Create release
id: release
uses: softprops/action-gh-release@v2.3.2
with:
name: ${{ needs.info.outputs.project_version }}
tag_name: ${{ needs.info.outputs.project_version }}
target_commitish: ${{ github.ref_name }}
body: |
${{ needs.info.outputs.changelog }}
${{ steps.format_diff.outputs.text }}
files: |
${{ needs.info.outputs.project_full_name }}-curseforge.zip
${{ needs.info.outputs.project_full_name }}-serverpack.zip
${{ needs.info.outputs.project_full_name }}-multimc.zip
prerelease: ${{ needs.info.outputs.release_type != 'release' }}
generate_release_notes: true
token: ${{ secrets.GITHUB_TOKEN }}
release-curseforge:
name: 🚀 Release to CurseForge
needs: [info, build-modpack, release-github]
runs-on: ubuntu-latest
if: ${{ needs.info.outputs.make_release == 'true' }}
outputs:
id: ${{ steps.release.outputs.id }}
steps:
- name: 🔒 Check if CURSEFORGE_TOKEN exist
shell: bash
run: |
if [ "${{ secrets.CURSEFORGE_TOKEN }}" == '' ]; then
echo '::error::No value found for secret key `CURSEFORGE_TOKEN`. See https://docs.github.com/en/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-a-repository' && exit 1
fi
- name: 📦 Download artifact
uses: actions/download-artifact@v5.0.0
with:
merge-multiple: true
- name: 🔍 Check if artifact exist
id: check_artifact
shell: bash
run: |
if [ ! -f ${{ needs.info.outputs.project_full_name }}-curseforge.zip ]; then
echo '::error::No value found for artifact `curseforge.zip`.' && exit 1
fi
if [ ! -f ${{ needs.info.outputs.project_full_name }}-serverpack.zip ]; then
echo '::error::No value found for artifact `serverpack.zip`.' && exit 1
fi
echo "✔️ All artifacts found"
- name: 🚀 Upload Curseforge
id: release
uses: Xikaro/upload-curseforge-modpack-action@1.1.1
with:
api-token: ${{ secrets.CURSEFORGE_TOKEN }}
project-id: ${{ vars.CURSEFORGE_ID }}
display-name: ${{ needs.info.outputs.project_full_name }}
modpack-path: ${{ needs.info.outputs.project_full_name }}-curseforge.zip
server-display-name: ${{ needs.info.outputs.project_full_name }}-serverpack
modpack-server-path: ${{ needs.info.outputs.project_full_name }}-serverpack.zip
changelog: |
${{ needs.info.outputs.changelog }}
${{ needs.info.outputs.diff }}
changelog-format: markdown
game-version: ${{ needs.info.outputs.mc_version }}
release-type: ${{ needs.info.outputs.release_type }}
release-modrinth:
name: 🚀 Release to Modrinth
needs: [info, build-modpack, release-github]
runs-on: ubuntu-latest
if: false
outputs:
id: ${{ steps.release.outputs.id }}
steps:
- name: 🔒 Check if MODRINTH_API_TOKEN exist
shell: bash
run: |
if [ "${{ secrets.MODRINTH_TOKEN }}" == '' ]; then
echo '::error::No value found for secret key `MODRINTH_TOKEN`. See https://docs.github.com/en/ actionssecurity-guides/ encrypted-secrets#creating-encrypted-secrets-for-a-repository' && exit 1
fi
- name: 📦 Download artifact
uses: actions/download-artifact@v5.0.0
with:
merge-multiple: true
- name: 🔍 Check if artifact exist
id: check_artifact
shell: bash
run: |
if [ ! -f ${{ needs.info.outputs.project_full_name }}-modrinth.mrpack ]; then
echo '::error::No value found for artifact `modrinth.mrpack`.' && exit 1
fi
if [ ! -f ${{ needs.info.outputs.project_full_name }}-serverpack.zip ]; then
echo '::error::No value found for artifact `serverpack.zip`.' && exit 1
fi
echo "✔️ All artifacts found"
- name: 🚀 Upload Modrinth
id: release
uses: Xikaro/upload-curseforge-modpack-action@1.1.1
with:
api-token: ${{ secrets.MODRINTH_TOKEN }}
project-id: ${{ vars.MODRINTH_ID }}
modpack-path: ${{ needs.info.outputs.project_full_name }}-modrinth.mrpack
modpack-server-path: ${{ needs.info.outputs.project_full_name }}-serverpack.zip
changelog: ${{ needs.info.outputs.changelog }}
changelog-format: markdown
game-version: ${{ needs.info.outputs.mc_version }}
display-name: ${{ needs.info.outputs.project_full_name }}
server-display-name: ${{ needs.info.outputs.project_full_name }}-serverpack
release-type: ${{ needs.info.outputs.release_type }}
discord-message:
name: 📱 Discord Message
needs: [info, release-curseforge, release-github]
runs-on: ubuntu-latest
steps:
- name: ✂️ Truncate Changelog
id: truncated
uses: cisox/read-more-action@v1.0.2
with:
text: '${{ needs.info.outputs.changelog }}'
max_chars: '1450'
- name: 📨 Send Discord message
uses: hugoalh/send-discord-webhook-ghaction@v7.0.5
with:
key: ${{ secrets.DISCORD_RELEASES }}
username: "TerraFirmaGreg"
avatar_url: "https://raw.githubusercontent.com/TerraFirmaGreg-Team/.github/main/branding/logo.png"
content_links_no_embed: .+
content: |
**Release**: `${{ needs.info.outputs.project_version }}`
**Release Type**: `${{ needs.info.outputs.release_type }}`
**Game Version**: `${{ needs.info.outputs.mc_version }}`
[CurseForge](https://www.curseforge.com/minecraft/modpacks/terrafirmagreg-modern/files/${{ needs.release-curseforge.outputs.id }}) • [GitHub](${{ needs.release-github.outputs.url }}) • [Issues](https://github.com/${{ github.repository }}/issues)
```markdown
${{ steps.truncated.outputs.text }}
- ...```
** [Read more...](${{ needs.release-github.outputs.url }}) **