summaryrefslogtreecommitdiff
path: root/.github/workflows/release-please.yml
blob: cd897470be080d0de5a086017dde1d9a756afb38 (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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
name: release-please

on:
  push:
    branches:
      - main

permissions:
  contents: write
  pull-requests: write

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: false

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@v2
        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"
  build-artifacts:
    runs-on: ubuntu-latest
    needs: release-please
    if: needs.release-please.outputs.release_created
    outputs:
      tag_name: ${{ needs.release-please.outputs.tag_name }}
      version: ${{ needs.release-please.outputs.version }}
    env:
      VERSION: ${{ needs.release-please.outputs.version }}
    strategy:
      matrix:
        goos: [linux, darwin]
        goarch: [amd64, arm64]
        include:
          - goos: freebsd
            goarch: amd64
          - goos: linux
            goarch: '386'
          - goos: linux
            goarch: arm
            variant: 'v6'
          - goos: linux
            goarch: arm
            variant: 'v7'
          - goos: linux
            goarch: ppc64le
          - goos: linux
            goarch: s390x
          - goos: solaris
            goarch: amd64
          - goos: windows
            goarch: amd64
            extension: .exe
          - goos: windows
            goarch: '386'
            extension: .exe
    steps:
      - uses: actions/create-github-app-token@v2
        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 Artifacts for ${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.variant }}
        run: |
          export COMMIT=${{ github.sha }}

          make bin/gomplate_${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.variant }}${{ matrix.extension }}_checksum_sha256.txt \
            VERSION=$VERSION
          make bin/gomplate_${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.variant }}${{ matrix.extension }}_checksum_sha512.txt \
            VERSION=$VERSION

          if [ "${{ matrix.goos }}-${{ matrix.goarch }}" = "windows-amd64" ]; then
            make bin/gomplate_windows-amd64.zip VERSION=$VERSION
          fi
      - name: Save Artifacts
        uses: actions/upload-artifact@v4
        with:
          name: build-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.variant }}
          path: bin/*
          retention-days: 1
  create-release:
    runs-on: ubuntu-latest
    needs: build-artifacts
    env:
      VERSION: ${{ needs.build-artifacts.outputs.version }}
      TAG_NAME: ${{ needs.build-artifacts.outputs.tag_name }}
    steps:
      - uses: actions/create-github-app-token@v2
        id: app-token
        with:
          app-id: ${{ vars.APP_ID }}
          private-key: ${{ secrets.PRIVATE_KEY }}
      - uses: actions/download-artifact@v4
      - name: Organize Artifacts
        run: |
          mv build*/* .
          rm -rf build*
      - name: Aggregate Checksums
        run: |
          # duplicate the make bin/checksums_sha(256|512).txt targets without
          # invoking make
          cat gomplate_*_checksum_sha256.txt > checksums-${TAG_NAME}_sha256.txt
          cat gomplate_*_checksum_sha512.txt > checksums-${TAG_NAME}_sha512.txt

          # clean up a bit to make the upload simpler
          rm *_checksum*.txt
      - name: Upload Release Assets
        run: |
          ls -alh

          assets="checksums-${TAG_NAME}_sha256.txt checksums-${TAG_NAME}_sha512.txt"
          for f in gomplate_*; do
            assets="$assets ${f}"
          done

          echo "uploading assets: $assets"
          gh release upload ${TAG_NAME} $assets \
            --clobber --repo ${{ github.repository }}
        env:
          GH_TOKEN: ${{ steps.app-token.outputs.token }}
      - name: Publish Release
        run: |
          gh release edit ${TAG_NAME} \
            --discussion-category "General" \
            --repo ${{ github.repository }} \
            --draft=false
        env:
          GH_TOKEN: ${{ steps.app-token.outputs.token }}
      - name: Upload archive checksums
        id: 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

          gh release upload ${TAG_NAME} ${TAG_NAME}.sha256 ${TAG_NAME}.sha512 \
            --repo ${{ github.repository }}
        env:
          GH_TOKEN: ${{ steps.app-token.outputs.token }}