diff --git a/.github/workflows/create-tag.yml b/.github/workflows/create-tag.yml new file mode 100644 index 00000000..0787918f --- /dev/null +++ b/.github/workflows/create-tag.yml @@ -0,0 +1,135 @@ +name: "Create a tag" + +on: + workflow_dispatch: + inputs: + branch: + description: "Branch to be tagged" + required: true + default: main + tag: + description: "Tag for new version (v1.23.4)" + required: true + create_release: + description: "Create release" + type: boolean + default: true + base_tag: + description: "Base tag to generate commit list for release notes" + required: false + +jobs: + create-tag: + name: "Create a tag" + runs-on: ubuntu-latest + + defaults: + run: + shell: bash + + steps: + - name: Generate token + id: generate_token + uses: actions/create-github-app-token@v1 + with: + app-id: ${{ secrets.TEMPORAL_CICD_APP_ID }} + private-key: ${{ secrets.TEMPORAL_CICD_PRIVATE_KEY }} + + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.branch }} + token: ${{ steps.generate_token.outputs.token }} + persist-credentials: true + fetch-depth: 0 + fetch-tags: true + submodules: true + + - name: Set up Github credentials + run: | + git config --local user.name 'Temporal Data' + git config --local user.email 'commander-data@temporal.io' + + - name: Prepare new version string + id: new_version + env: + TAG: ${{ github.event.inputs.tag }} + run: | + if [[ "${TAG}" =~ ^v.* ]]; then + echo "tag=${TAG}" >> "$GITHUB_OUTPUT" + else + echo "tag=v${TAG}" >> "$GITHUB_OUTPUT" + fi + + - name: Validate input + env: + BRANCH: ${{ github.event.inputs.branch }} + TAG: ${{ steps.new_version.outputs.tag }} + CREATE_RELEASE: ${{ github.event.inputs.create_release }} + BASE_TAG: ${{ github.event.inputs.base_tag }} + run: | + if [[ -n "$(git tag -l "$TAG")" && "$(git rev-parse "$TAG")" != "$(git rev-parse HEAD)" ]]; then + echo "::error::Tag already exists and it doesn't reference current HEAD of branch $BRANCH" + exit 1 + fi + + if [[ "$CREATE_RELEASE" == "true" ]]; then + if [[ -z "$BASE_TAG" || -z "$(git tag -l "$BASE_TAG")" ]]; then + echo "::error::Base tag not specified or does not exist" + exit 1 + fi + fi + + - name: Create and push tag + env: + BRANCH: ${{ github.event.inputs.branch }} + TAG: ${{ steps.new_version.outputs.tag }} + run: | + if [ -z "$(git tag -l "$TAG")" ]; then + git tag "$TAG" + git push origin "$TAG" + fi + + - name: Create release + if: ${{ github.event.inputs.create_release == 'true' }} + env: + GH_TOKEN: ${{ steps.generate_token.outputs.token }} + TAG: ${{ steps.new_version.outputs.tag }} + BASE_TAG: ${{ github.event.inputs.base_tag }} + run: | + TEMPFILE=$(mktemp) + cat > "$TEMPFILE" <<- EOF + **Full Changelog**: https://github.com/temporalio/api-go/compare/${BASE_TAG}...${TAG} + EOF + + gh repo set-default ${{ github.repository }} + gh release create "$TAG" --verify-tag --title "$TAG" -F "$TEMPFILE" + + update-consumer-deps: + name: Update consumers dependency on api-go + if: ${{ github.event.inputs.create_release == 'true' }} + needs: create-tag + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + repo: + - sdk + - temporal + - bench-go + - canary-go + - samples-go + - ui + + steps: + - name: Update api-go in ${{ matrix.repo }} + id: update-repo-deps + uses: ./.github/workflows/update-repo-deps.yml + with: + repo: "temporalio/${{ matrix.repo }}" + tag: ${{ steps.new_version.outputs.tag }} + secrets: + token: ${{ steps.generate_token.outputs.token }} + + - run: | + echo "PR ${{ matrix.repo }}: ${{ steps.update-repo-deps.outputs.pr_link }}" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/update-repo-deps.yml b/.github/workflows/update-repo-deps.yml new file mode 100644 index 00000000..e810b6b6 --- /dev/null +++ b/.github/workflows/update-repo-deps.yml @@ -0,0 +1,53 @@ +name: "Update repository dependency on api-go" + +on: + workflow_call: + inputs: + repo: + description: "Repository to be udpated" + required: true + tag: + description: "Tag to be used" + required: true + secrets: + token: + required: true + +jobs: + update-repo-deps: + name: Update repo deps + runs-on: ubuntu-latest + + defaults: + run: + shell: bash + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + repository: ${{ github.event.inputs.repo }} + token: ${{ secrets.token }} + persist-credentials: true + + - name: Update go.mod + env: + TAG: ${{ github.events.input.tag }} + run: | + for gomod in $(find . -name "go.mod"); do + cd $(dirname $gomod) + if [[ $(cat go.mod | grep -c "go\.temporal\.io/api v.*$") -gt 0 ]]; then + go get go.temporal.io/api@${TAG} + go mod tidy + fi + cd - + done + + BRANCH="temporal-data/update-api-go-${TAG}-$(git rev-parse --short HEAD)" + git checkout -b $BRANCH + git add . + git commit -m "Bump api-go to $TAG" + git push origin $BRANCH + pr_link=$(gh pr create --fill --reviewer ${{ github.actor }},${{ github.triggering_actor }}) + echo "PR link for ${{ github.events.input.repo }}: $pr_link" + echo "pr_link=$pr_link" >> $GITHUB_OUTPUT