|
|
@@ -49,6 +49,7 @@ import EventFocusView from "./activity-feed/events/focus-views/EventFocusView";
|
|
|
import HelmValuesTab from "./HelmValuesTab";
|
|
|
import SettingsTab from "./SettingsTab";
|
|
|
import PorterAppRevisionSection from "./PorterAppRevisionSection";
|
|
|
+import ImageSettingsTab from "./ImageSettingsTab";
|
|
|
|
|
|
type Props = RouteComponentProps & {};
|
|
|
|
|
|
@@ -69,6 +70,7 @@ const validTabs = [
|
|
|
"debug",
|
|
|
"environment",
|
|
|
"build-settings",
|
|
|
+ "image-settings",
|
|
|
"settings",
|
|
|
"helm-values",
|
|
|
"job-history",
|
|
|
@@ -230,8 +232,17 @@ const ExpandedApp: React.FC<Props> = ({ ...props }) => {
|
|
|
setSyncedEnvGroups(filteredEnvGroups || []);
|
|
|
setPorterJson(porterJson);
|
|
|
setAppData(newAppData);
|
|
|
+ const globalImage = resChartData.data.config?.global?.image
|
|
|
+ const hasBuiltImage = globalImage != null &&
|
|
|
+ globalImage.repository != null &&
|
|
|
+ globalImage.tag != null &&
|
|
|
+ !(globalImage.repository === ImageInfo.BASE_IMAGE.repository &&
|
|
|
+ globalImage.tag === ImageInfo.BASE_IMAGE.tag)
|
|
|
// annoying that we have to parse buildpacks like this but alas
|
|
|
const parsedPorterApp = { ...resPorterApp?.data, buildpacks: newAppData.app.buildpacks?.split(",") ?? [] };
|
|
|
+ if (parsedPorterApp.image_repo_uri && hasBuiltImage) {
|
|
|
+ parsedPorterApp.image_info = { repository: globalImage.repository, tag: globalImage.tag };
|
|
|
+ }
|
|
|
setPorterApp(parsedPorterApp);
|
|
|
setTempPorterApp(parsedPorterApp);
|
|
|
setBuildView(!_.isEmpty(parsedPorterApp.dockerfile) ? "docker" : "buildpacks")
|
|
|
@@ -249,12 +260,6 @@ const ExpandedApp: React.FC<Props> = ({ ...props }) => {
|
|
|
);
|
|
|
setPorterYaml(finalPorterYaml);
|
|
|
// Only check GHA status if no built image is set
|
|
|
- const globalImage = resChartData.data.config?.global?.image
|
|
|
- const hasBuiltImage = globalImage != null &&
|
|
|
- globalImage.repository != null &&
|
|
|
- globalImage.tag != null &&
|
|
|
- globalImage.repository !== ImageInfo.BASE_IMAGE.repository &&
|
|
|
- globalImage.tag !== ImageInfo.BASE_IMAGE.tag
|
|
|
if (hasBuiltImage || !resPorterApp.data.repo_name) {
|
|
|
setWorkflowCheckPassed(true);
|
|
|
setHasBuiltImage(true);
|
|
|
@@ -402,7 +407,7 @@ const ExpandedApp: React.FC<Props> = ({ ...props }) => {
|
|
|
);
|
|
|
const yamlString = yaml.dump(finalPorterYaml);
|
|
|
const base64Encoded = btoa(yamlString);
|
|
|
- const updatedPorterApp = {
|
|
|
+ let updatedPorterApp = {
|
|
|
porter_yaml: base64Encoded,
|
|
|
override_release: true,
|
|
|
...PorterApp.empty(),
|
|
|
@@ -423,6 +428,9 @@ const ExpandedApp: React.FC<Props> = ({ ...props }) => {
|
|
|
updatedPorterApp.buildpacks = tempPorterApp.buildpacks.join(",");
|
|
|
updatedPorterApp.dockerfile = "null";
|
|
|
}
|
|
|
+ if (tempPorterApp.image_info?.repository && tempPorterApp.image_info?.tag) {
|
|
|
+ updatedPorterApp = { ...updatedPorterApp, image_info: tempPorterApp.image_info, image_repo_uri: tempPorterApp.image_info.repository }
|
|
|
+ }
|
|
|
|
|
|
await api.createPorterApp(
|
|
|
"<token>",
|
|
|
@@ -678,6 +686,14 @@ const ExpandedApp: React.FC<Props> = ({ ...props }) => {
|
|
|
setBuildView={setBuildView}
|
|
|
/>
|
|
|
);
|
|
|
+ case "image-settings":
|
|
|
+ return (
|
|
|
+ <ImageSettingsTab
|
|
|
+ porterApp={tempPorterApp}
|
|
|
+ setTempPorterApp={(attrs: Partial<PorterApp>) => setTempPorterApp(PorterApp.setAttributes(tempPorterApp, attrs))}
|
|
|
+ updatePorterApp={updatePorterApp}
|
|
|
+ />
|
|
|
+ )
|
|
|
case "settings":
|
|
|
return <SettingsTab
|
|
|
appName={appData.app.name}
|
|
|
@@ -935,6 +951,10 @@ const ExpandedApp: React.FC<Props> = ({ ...props }) => {
|
|
|
label: "Build settings",
|
|
|
value: "build-settings",
|
|
|
},
|
|
|
+ hasBuiltImage && !appData.app.git_repo_id && {
|
|
|
+ label: "Image settings",
|
|
|
+ value: "image-settings",
|
|
|
+ },
|
|
|
{ label: "Settings", value: "settings" },
|
|
|
(user.email.endsWith("porter.run") || currentProject.helm_values_enabled) && { label: "Helm values", value: "helm-values" },
|
|
|
].filter((x) => x)}
|