name: Release (Source) on: workflow_call: outputs: version: value: ${{ jobs.source.outputs.version }} is_tag: value: ${{ jobs.source.outputs.is_tag }} trigger_type: value: ${{ jobs.source.outputs.trigger_type }} folder: value: ${{ jobs.source.outputs.folder }} survey_key: value: ${{ jobs.source.outputs.survey_key }} jobs: source: name: Source runs-on: ubuntu-20.04 outputs: version: ${{ steps.metadata.outputs.version }} is_tag: ${{ steps.metadata.outputs.is_tag }} trigger_type: ${{ steps.metadata.outputs.trigger_type }} folder: ${{ steps.metadata.outputs.folder }} survey_key: ${{ steps.survey_key.outputs.survey_key }} steps: - name: Checkout (Release) if: github.event_name == 'release' uses: actions/checkout@v4 with: # We generate a changelog; for this we need the full git log. fetch-depth: 0 - name: Checkout (Manual) if: github.event_name == 'workflow_dispatch' uses: actions/checkout@v4 with: ref: ${{ github.event.inputs.ref }} # We generate a changelog; for this we need the full git log. fetch-depth: 0 - name: Checkout (Trigger) if: github.event_name == 'repository_dispatch' uses: actions/checkout@v4 with: ref: ${{ github.event.client_payload.ref }} # We generate a changelog; for this we need the full git log. fetch-depth: 0 - name: Check valid branch name run: | if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then REF="${{ github.event.inputs.ref }}" elif [ "${{ github.event_name }}" = "repository_dispatch" ]; then REF="${{ github.event.client_payload.ref }}" else REF="${{ github.ref }}" fi # Check if we are a tag. if [ -n "$(git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || false)" ]; then exit 0 fi # Check if the checkout caused the branch to be named. if [ "$(git rev-parse --abbrev-ref HEAD)" != "HEAD" ]; then exit 0 fi # Check if this was a pull request. if [ -n "$(echo ${REF} | grep '^refs/pull/[0-9]*')" ]; then PULL=$(echo ${REF} | cut -d/ -f3) git checkout -b pr${PULL} fi # Are we still in a detached state? Error out. if [ "$(git rev-parse --abbrev-ref HEAD)" == "HEAD" ]; then echo "The 'ref' given resulted in a checkout of a detached HEAD." echo "We cannot detect the version for these checkout accurate." echo "" echo "If you want to build a Pull Request, make sure you use 'refs/pull/NNN/head'." echo "" echo "Cancelling build, as without a version we cannot store the artifacts." exit 1 fi - name: Generate metadata id: metadata run: | echo "::group::Prepare metadata files" cmake -DGENERATE_OTTDREV=.ottdrev -P cmake/scripts/FindVersion.cmake ./.github/changelog.sh > .changelog TZ='UTC' date +"%Y-%m-%d %H:%M UTC" > .release_date head -1 .ottdrev | cut -f 1 -d$'\t' > .version if [ $(head -1 .ottdrev | cut -f 5 -d$'\t') = '1' ]; then # Assume that all tags are always releases. Why else make a tag? IS_TAG="true" FOLDER="${{ env.FOLDER_RELEASES }}" TRIGGER_TYPE="new-tag" else IS_TAG="false" BRANCH=$(git symbolic-ref -q HEAD | sed 's@.*/@@') if [ -z "${BRANCH}" ]; then echo "Internal error: branch name is empty." echo "An earlier step should have prevented this from happening." echo "Cancelling build, as without a branch name we cannot store the artifacts" exit 1 fi if [ "${BRANCH}" = "${{ env.NIGHTLIES_BRANCH }}" ]; then # The "master" branch is special, and we call a nightly. FOLDER="${{ env.FOLDER_NIGHTLIES }}/$(date +%Y)" TRIGGER_TYPE="new-master" else # All other branches, which can be builds of Pull Requests, are # put in their own folder. FOLDER="${{ env.FOLDER_BRANCHES }}/${BRANCH}" TRIGGER_TYPE="new-branch" fi fi mkdir -p build/bundles cp .changelog build/bundles/changelog.txt cp .release_date build/bundles/released.txt cp README.md build/bundles/README.md echo "::endgroup::" echo "Release Date: $(cat .release_date)" echo "Revision: $(cat .ottdrev-vc)" echo "Version: $(cat .version)" echo "Is tag: ${IS_TAG}" echo "Folder on CDN: ${FOLDER}" echo "Workflow trigger: ${TRIGGER_TYPE}" echo "version=$(cat .version)" >> $GITHUB_OUTPUT echo "is_tag=${IS_TAG}" >> $GITHUB_OUTPUT echo "folder=${FOLDER}" >> $GITHUB_OUTPUT echo "trigger_type=${TRIGGER_TYPE}" >> $GITHUB_OUTPUT env: NIGHTLIES_BRANCH: master FOLDER_RELEASES: openttd-releases FOLDER_NIGHTLIES: openttd-nightlies FOLDER_BRANCHES: openttd-branches - name: Generate survey key id: survey_key run: | if [ -z "${{ vars.SURVEY_TYPE }}" ]; then echo "SURVEY_TYPE variable not found; most likely running in a fork. Skipping step." SURVEY_KEY="" else PAYLOAD='{"version":"${{ steps.metadata.outputs.version }}","type":"${{ vars.SURVEY_TYPE }}"}' echo "${{ secrets.SURVEY_SIGNING_KEY }}" > survey_signing_key.pem SIGNATURE=$(echo -n "${PAYLOAD}" | openssl dgst -sha256 -sign survey_signing_key.pem | base64 -w0) rm -f survey_signing_key.pem SURVEY_KEY=$(curl -f -s -X POST -d "${PAYLOAD}" -H "Content-Type: application/json" -H "X-Signature: ${SIGNATURE}" https://survey-participate.openttd.org/create-survey-key/${{ vars.SURVEY_TYPE }}) fi echo "survey_key=${SURVEY_KEY}" >> $GITHUB_OUTPUT - name: Remove VCS information run: | rm -rf .git - name: Create bundles run: | FOLDER_NAME=openttd-${{ steps.metadata.outputs.version }} # Rename the folder to openttd-NNN mkdir ${FOLDER_NAME} find . -maxdepth 1 -not -name . -not -name build -not -name ${FOLDER_NAME} -exec mv {} ${FOLDER_NAME}/ \; echo "::group::Create tarball (xz) bundle" tar --xz -cvf build/bundles/${FOLDER_NAME}-source.tar.xz ${FOLDER_NAME} echo "::endgroup::" # This tarball is only to be used within this workflow. echo "::group::Create tarball (gz) bundle" tar --gzip -cvf source.tar.gz ${FOLDER_NAME} echo "::endgroup::" echo "::group::Create zip bundle" zip -9 -r build/bundles/${FOLDER_NAME}-source.zip ${FOLDER_NAME} echo "::endgroup::" - name: Store bundles uses: actions/upload-artifact@v4 with: name: openttd-source path: build/bundles/* retention-days: 5 - name: Store source (for other jobs) uses: actions/upload-artifact@v4 with: name: internal-source path: source.tar.gz retention-days: 1