summaryrefslogtreecommitdiff
path: root/.github/workflows/release-please.yml
blob: 9df1e85e2a5cc6cbccde3925be7d88c32540d953 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
name: release-please

on:
  push:
    branches:
      - main

permissions:
  contents: write
  pull-requests: write

jobs:
  release-please:
    runs-on: ubuntu-latest
    outputs:
      release_created: ${{ steps.release.outputs.release_created }}
      tag_name: ${{ steps.release.outputs.tag_name }}
      version: ${{ steps.release.outputs.version }}
      html_url: ${{ steps.release.outputs.html_url }}
    steps:
      - uses: actions/create-github-app-token@v1
        id: app-token
        with:
          app-id: ${{ vars.APP_ID }}
          private-key: ${{ secrets.PRIVATE_KEY }}
      # I can't use the action because it doesn't support the --draft flag,
      # and it doesn't support uploading assets.
      #
      # - uses: googleapis/release-please-action@v4
      #   with:
      #     token: ${{ steps.app-token.outputs.token }}
      #     config-file: release-please-config.json
      - name: Install release-please
        run: npm -g install release-please
      - name: release-please github-release
        id: release
        run: |
          release-please \
            --token ${{ steps.app-token.outputs.token }} \
            --repo-url ${{ github.repository }} \
              github-release \
              --draft | tee rp-out.log

          # parse the js object and store it - this is brittle!
          cat rp-out.log | sed -n '/^\[/,$p' > rp-out.js

          # if it's just "[]" assume no-op
          if [ "$(cat rp-out.js)" = "[]" ]; then
            exit 0
          fi

          # convert js object to json - assumes there's only one release
          # this'll have to be refactored if there are multiple releases
          node -e "console.log(JSON.stringify($(cat rp-out.js)))" | jq '.[0]' > rp-out.json
        
          echo "json output: $(cat rp-out.json)"

          # now set outputs
          echo "release_created=true"                      >> "$GITHUB_OUTPUT"
          echo "id=$(        jq -r '.id'        rp-out.json)" >> "$GITHUB_OUTPUT"
          echo "name=$(      jq -r '.name'      rp-out.json)" >> "$GITHUB_OUTPUT"
          echo "tag_name=$(  jq -r '.tagName'   rp-out.json)" >> "$GITHUB_OUTPUT"
          echo "sha=$(       jq -r '.sha'       rp-out.json)" >> "$GITHUB_OUTPUT"
          echo "notes=$(     jq   '.notes'     rp-out.json)" >> "$GITHUB_OUTPUT"
          echo "html_url=$(  jq -r '.url'       rp-out.json)" >> "$GITHUB_OUTPUT"
          echo "draft=$(     jq -r '.draft'     rp-out.json)" >> "$GITHUB_OUTPUT"
          echo "upload_url=$(jq -r '.uploadUrl' rp-out.json)" >> "$GITHUB_OUTPUT"
          echo "path=$(      jq -r '.path'      rp-out.json)" >> "$GITHUB_OUTPUT"
          echo "version=$(   jq -r '.version'   rp-out.json)" >> "$GITHUB_OUTPUT"
          echo "major=$(     jq -r '.major'     rp-out.json)" >> "$GITHUB_OUTPUT"
          echo "minor=$(     jq -r '.minor'     rp-out.json)" >> "$GITHUB_OUTPUT"
          echo "patch=$(     jq -r '.patch'     rp-out.json)" >> "$GITHUB_OUTPUT"
      - name: release-please release-pr
        id: release-pr
        if: ${{ ! steps.release.outputs.release_created }}
        run: |
          release-please \
            --token ${{ steps.app-token.outputs.token }} \
            --repo-url ${{ github.repository }} \
              release-pr | tee rp-out.log

          # parse the js object and store it - this is brittle!
          cat rp-out.log | sed -n '/^\[/,$p' > rp-out.js

          # if it's just "[]" assume no-op
          if [ "$(cat rp-out.js)" = "[]" ]; then
            exit 0
          fi

          # set outputs
          echo "prs_created=true"                      >> "$GITHUB_OUTPUT"
          node -e "console.log('pr=' +JSON.stringify($(cat rp-out.js)[0]))" >> "$GITHUB_OUTPUT"
          node -e "console.log('prs='+JSON.stringify($(cat rp-out.js)   ))" >> "$GITHUB_OUTPUT"
  create-release:
    runs-on: ubuntu-latest
    needs: release-please
    if: ${{ needs.release-please.outputs.release_created }}
    env:
      VERSION: ${{ needs.release-please.outputs.version }}
      TAG_NAME: ${{ needs.release-please.outputs.tag_name }}
    steps:
      - uses: actions/create-github-app-token@v1
        id: app-token
        with:
          app-id: ${{ vars.APP_ID }}
          private-key: ${{ secrets.PRIVATE_KEY }}
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version-file: go.mod
      - name: Build release assets
        run: |
          export COMMIT=${{ github.sha }}
          make bin/checksums_sha256.txt VERSION=${VERSION}
          make bin/checksums_sha512.txt VERSION=${VERSION}

          # clean up a bit to make the next steps easier
          rm bin/*_checksum*

          mv bin/checksums_sha256.txt bin/checksums-${TAG_NAME}_sha256.txt
          mv bin/checksums_sha512.txt bin/checksums-${TAG_NAME}_sha512.txt

          # zip file for choco package
          make bin/gomplate_windows-amd64.zip VERSION=${VERSION}
      - name: Upload release assets
        run: |
          cd bin
          assets=(checksums-${TAG_NAME}_sha256.txt checksums-${TAG_NAME}_sha512.txt)
          for f in gomplate_*; do
            assets=($assets ${f})
          done

          for f in ${assets[@]}; do
            echo "uploading $f"
            gh release upload ${TAG_NAME} $f
          done
        env:
          GH_TOKEN: ${{ steps.app-token.outputs.token }}
      - name: Publish GitHub Release
        run: |
          gh release edit ${TAG_NAME} --discussion-category "General" --draft=false
        env:
          GH_TOKEN: ${{ steps.app-token.outputs.token }}
      - name: Get archive checksums
        # has to happen post-publish so the URL works
        run: |
          archive=https://github.com/${{ github.repository }}/archive/refs/tags/${TAG_NAME}.tar.gz
          archiveFile=archive.tar.gz
          curl -f -sSL -o $archiveFile $archive

          sha256sum $archiveFile | cut -f1 -d\  > ${TAG_NAME}.sha256
          sha512sum $archiveFile | cut -f1 -d\  > ${TAG_NAME}.sha512
          
          echo "sha256sum=$(cat ${TAG_NAME}.sha256)" >> $GITHUB_OUTPUT
          echo "sha512sum=$(cat ${TAG_NAME}.sha512)" >> $GITHUB_OUTPUT
      - name: Upload archive checksums
        run: |
          gh release upload ${TAG_NAME} ${TAG_NAME}.sha256
          gh release upload ${TAG_NAME} ${TAG_NAME}.sha512
        env:
          GH_TOKEN: ${{ steps.app-token.outputs.token }}