-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathaction.yml
145 lines (135 loc) · 6.04 KB
/
action.yml
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
#
# This local action serves two purposes:
#
# 1. For core workflows like pull.yml and push.yml,
# it is uses to check that the checked in copy of generated code
# matches what the current submodule version of smithy-dafny generates.
# This is important to ensure whenever someone changes the models
# or needs to regenerate to pick up smithy-dafny improvements,
# they don't have to deal with unpleasant surprises.
#
# 2. For workflows that check compatibility with other Dafny versions,
# such as nightly_dafny.yml, it is necessary to regenerate the code
# for that version of Dafny first.
# This is ultimately because some of the code smithy-dafny generates
# is tightly coupled to what code Dafny itself generates.
# A concrete example is that Dafny 4.3 added TypeDescriptors
# as parameters when constructing datatypes like Option and Result.
#
# This is why this is a composite action instead of a reusable workflow:
# the latter executes in a separate runner environment,
# but here we need to actually overwrite the generated code in place
# so that subsequent steps can work correctly.
#
# This action assumes that the given version of Dafny and .NET 6.0.x
# have already been set up, since they are used to format generated code.
#
# Note that recursively generating code doesn't currently work in this repo
# with the version of the mpl pinned by the submodule,
# because the SharedMakefileV2.mk in it doesn't work with newer versions of smithy-dafny.
# Therefore by default we don't recursively regenerate code
# (accomplished by setting the POLYMORPH_DEPENDENCIES environment variable to "").
# If `update-and-regenerate-mpl` is true, we first pull the latest mpl,
# which is necessary both for Makefile compatibility and so we can regenerate mpl code
# for compatibility with newer versions of Dafny.
#
name: "Polymorph code generation"
description: "Regenerates code using smithy-dafny, and optionally checks that the result matches the checked in state"
inputs:
dafny:
description: "The Dafny version to run"
required: true
type: string
library:
description: "Name of the library to regenerate code for"
required: true
type: string
diff-generated-code:
description: "Diff regenerated code against committed state"
required: true
type: boolean
update-and-regenerate-mpl:
description: "Locally update MPL to the tip of master and regenerate its code too"
required: false
default: false
type: boolean
runs:
using: "composite"
steps:
- name: Update MPL submodule locally if requested
if: inputs.update-and-regenerate-mpl == 'true'
working-directory: submodules/MaterialProviders
shell: bash
run: |
git checkout main
git pull
git submodule update --init --recursive
- name: Update top-level project.properties file in MPL
if: inputs.update-and-regenerate-mpl == 'true'
shell: bash
working-directory: submodules/MaterialProviders
run: |
make generate_properties_file
# Update the project.properties file so that we pick up the right runtimes etc.,
# in cases where inputs.dafny is different from the current value in that file.
- name: Generate smithy-dafny-project.properties file
if: inputs.update-and-regenerate-mpl == 'true'
env:
DAFNY_VERSION: ${{ inputs.dafny }}
shell: bash
run: |
make generate_properties_file
- name: Update top-level project.properties file
if: inputs.update-and-regenerate-mpl == 'true'
shell: bash
run: |
awk -F= '!a[$1]++' smithy-dafny-project.properties project.properties > merged.properties
mv merged.properties project.properties
cat project.properties
- name: Don't regenerate dependencies unless requested
id: dependencies
shell: bash
run: |
echo "PROJECT_DEPENDENCIES=${{ inputs.update-and-regenerate-mpl != 'true' && 'PROJECT_DEPENDENCIES=' || '' }}" >> $GITHUB_OUTPUT
- name: Regenerate Dafny code using smithy-dafny
# Unfortunately Dafny codegen doesn't work on Windows:
# https://github.com/smithy-lang/smithy-dafny/issues/317
if: runner.os != 'Windows'
working-directory: ./${{ inputs.library }}
shell: bash
run: |
make polymorph_dafny ${{ steps.dependencies.outputs.PROJECT_DEPENDENCIES }}
- name: Set up prettier in MPL
if: inputs.update-and-regenerate-mpl == 'true'
shell: bash
# Annoyingly, prettier has to be installed in each library individually.
# And this is only necessary or even possible if we've updated the mpl submodule.
run: |
make -C submodules/MaterialProviders/AwsCryptographyPrimitives setup_prettier
make -C submodules/MaterialProviders/AwsCryptographicMaterialProviders setup_prettier
make -C submodules/MaterialProviders/ComAmazonawsKms setup_prettier
make -C submodules/MaterialProviders/ComAmazonawsDynamodb setup_prettier
make -C submodules/MaterialProviders/TestVectorsAwsCryptographicMaterialProviders setup_prettier
- name: Regenerate Java code using smithy-dafny
# npx seems to be unavailable on Windows GHA runners,
# so we don't regenerate Java code on them either.
if: runner.os != 'Windows'
working-directory: ./${{ inputs.library }}
shell: bash
# smithy-dafny also formats generated code itself now,
# so prettier is a necessary dependency.
run: |
make setup_prettier
make polymorph_java ${{ steps.dependencies.outputs.PROJECT_DEPENDENCIES }}
- name: Regenerate .NET code using smithy-dafny
working-directory: ./${{ inputs.library }}
shell: bash
run: |
make polymorph_dotnet ${{ steps.dependencies.outputs.PROJECT_DEPENDENCIES }}
- name: Check regenerated code against commited code
# Composite action inputs seem to not actually support booleans properly for some reason
if: inputs.diff-generated-code == 'true'
working-directory: ./${{ inputs.library }}
shell: bash
run: |
make check_polymorph_diff