name: 'Code - Create new release' on: workflow_dispatch: inputs: version: description: 'Release "v1.2.3" or "develop"' required: true default: 'develop' schedule: - cron: '0 3 * * MON,THU' jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Switch branch run: | if [[ "develop" == "$version" ]]; then git checkout --track origin/develop git pull else git config user.name github-actions git config user.email 41898282+github-actions[bot]@users.noreply.github.com git checkout --track origin/develop git pull git checkout main git merge develop fi env: version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }} - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.3' extensions: mbstring, intl, zip, bcmath - name: crowdin action uses: crowdin/github-action@v1 with: upload_sources: true download_translations: true push_translations: false push_sources: false env: GITHUB_TOKEN: ${{ github.token }} CROWDIN_PROJECT_NR: ${{ secrets.CROWDIN_PROJECT_NR }} CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }} - name: Cleanup translations id: cleanup-transactions uses: JC5/firefly-iii-dev@v37 with: action: 'ff3:crowdin-warning' output: '' env: FIREFLY_III_ROOT: /github/workspace GH_TOKEN: '' - name: Cleanup changelog id: cleanup-changelog uses: JC5/firefly-iii-dev@v37 with: action: 'ff3:changelog' output: '' env: FIREFLY_III_ROOT: /github/workspace GH_TOKEN: ${{ secrets.CHANGELOG_TOKEN }} - name: Extract changelog id: extract-changelog uses: JC5/firefly-iii-dev@v37 with: action: 'ff3:extract-changelog' output: 'output' env: FIREFLY_III_ROOT: /github/workspace GH_TOKEN: "" - name: Replace version id: replace-version uses: JC5/firefly-iii-dev@v37 with: action: 'ff3:version' output: '' env: FIREFLY_III_ROOT: /github/workspace GH_TOKEN: "" FF_III_VERSION: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }} - name: Generate JSON v1 id: json-v1 uses: JC5/firefly-iii-dev@v37 with: action: 'ff3:json-translations v1' output: '' env: FIREFLY_III_ROOT: /github/workspace GH_TOKEN: '' - name: Generate JSON v2 id: json-v2 uses: JC5/firefly-iii-dev@v37 with: action: 'ff3:json-translations v2' output: '' env: FIREFLY_III_ROOT: /github/workspace GH_TOKEN: '' - name: Code cleanup id: code-cleanup uses: JC5/firefly-iii-dev@v37 with: action: 'ff3:code' output: '' env: FIREFLY_III_ROOT: /github/workspace GH_TOKEN: '' - name: Build JS run: | npm install npm update npm run prod --workspace=v1 npm run build --workspace=v2 - name: Run CI run: | rm -rf vendor composer.lock composer validate --strict composer update --no-dev --no-scripts --no-plugins -q sudo chown -R runner:docker resources/lang .ci/phpcs.sh - name: Release run: | # do some configuration sudo timedatectl set-timezone Europe/Amsterdam git config user.name github-actions git config user.email 41898282+github-actions[bot]@users.noreply.github.com git config advice.addIgnoredFile false # set some variables releaseName=$version originalName=$version zipName=FireflyIII-$version.zip tarName=FireflyIII-$version.tar.gz # update composer (again) composer validate --strict composer update --no-dev --no-scripts --no-plugins composer dump-autoload # if this is a develop build, slightly different variable names. if [[ "develop" == "$version" ]]; then [[ -z $(git status --untracked-files=normal --porcelain) ]] && echo "this branch is clean, no need to push..." && exit 0; releaseName=$version-$(date +'%Y%m%d') originalName=$releaseName zipName=FireflyIII-develop.zip tarName=FireflyIII-develop.tar.gz fi # in both cases, if the release or tag already exists, add ".1" until it no longer exists. tagFound=true tagCount=1 while [ "$tagFound" = true ] do if [ $(git tag -l "$releaseName") ]; then echo "Tag $releaseName exists already." releaseName="$originalName"."$tagCount" echo "Tag for release is now $releaseName" tagCount=$((tagCount+1)) else echo "Tag $releaseName does not exist, can continue" tagFound=false fi done echo "Will use tag and release name $releaseName." # add all content, except output.txt (this contains the changelog and/or the download instructions) echo 'Add all and reset output.txt' git add -A if test -f "output.txt"; then git reset output.txt fi git commit -m "Auto commit for release '$version' on $(date +'%Y-%m-%d')" || true git push # zip and tar everything echo 'Zip and tar...' zip -rq $zipName . -x "*.git*" "*.ci*" "*.github*" "*node_modules*" "*output.txt*" touch $tarName tar --exclude=$tarName --exclude=$zipName --exclude='./.git' --exclude='./.ci' --exclude='./.github' --exclude='./node_modules' --exclude='./output.txt' -czf $tarName . # add sha256 sum echo 'Sha sum ...' sha256sum -b $zipName > $zipName.sha256 sha256sum -b $tarName > $tarName.sha256 # create a development (nightly) release: if [[ "develop" == "$version" ]]; then echo 'Develop release.' # add text to output.txt (instructions) rm output.txt echo "Bi-weekly development release of Firefly III with the latest fixes, translations and features. Docker users can find this release under the \`develop\` tag." >> output.txt echo "" >> output.txt echo "This release was created on **$(date +'%Y-%m-%d')** and may contain unexpected bugs. Data loss is rare but is not impossible." >> output.txt echo "" >> output.txt echo "* Please read the installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt echo "" >> output.txt echo ":warning: Please be careful with this pre-release, as it may not work as expected." >> output.txt # create the release: echo "Create nightly release." git tag -a $releaseName -m "Nightly development release '$version' on $(date +'%Y-%m-%d')" git push origin $releaseName gh release create $releaseName -p --verify-tag \ -t "Development release for $(date +'%Y-%m-%d')" \ -F output.txt # add zip file to release. gh release upload $releaseName $zipName gh release upload $releaseName $tarName # add sha256 sum to release gh release upload $releaseName $zipName.sha256 gh release upload $releaseName $tarName.sha256 # get current HEAD and add as file to the release HEAD=$(git rev-parse HEAD) echo $HEAD > HEAD.txt gh release upload $releaseName HEAD.txt else echo 'MAIN (real) release' sudo chown -R runner:docker output.txt # add text to output.txt (more instructions) echo '' >> output.txt echo '### Instructions' >> output.txt echo '' >> output.txt echo "* Installation instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/installation/docker/), [Portainer](https://docs.firefly-iii.org/how-to/firefly-iii/installation/portainer/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/installation/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/installation/self-managed/)" >> output.txt echo "* Or read the upgrade instructions for [Docker](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/), [Kubernetes](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/kubernetes/) or [self-managed servers](https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/self-managed/)" >> output.txt echo "Create default release." git tag -a $releaseName -m "Here be changelog" git push origin $releaseName gh release create $releaseName -F output.txt -t "$releaseName" --verify-tag # add archive files to release gh release upload $releaseName $zipName gh release upload $releaseName $tarName # add sha256 sums to release gh release upload $releaseName $zipName.sha256 gh release upload $releaseName $tarName.sha256 # get current HEAD and add as file to the release HEAD=$(git rev-parse HEAD) echo $HEAD > HEAD.txt gh release upload $releaseName HEAD.txt # remove all temporary files rm output.txt rm HEAD.txt rm $zipName rm $zipName.sha256 rm $tarName rm $tarName.sha256 # merge main back into develop git checkout develop git merge main git push fi env: GH_TOKEN: ${{ github.token }} version: ${{ github.event_name == 'schedule' && 'develop' || github.event.inputs.version }}