UNPKG

action-docker-image-publish

Version:
2 lines (1 loc) 5.31 kB
"use strict";var e=require("@actions/core"),t=require("@actions/github"),i=require("node:child_process"),r=require("md5"),n=require("path"),s=require("node:path"),o=require("semver");function a(t,r){let n="";return new Promise((s,o)=>{i.exec(`docker ${t}`,{env:process.env,...r||{}},(t,i,r)=>{t?e.error(t):(i&&i.length>0&&(e.info(i),n+=i),r&&r.length>0&&e.error(r))}).on("close",e=>{0===e?s(n):o(new Error(`Docker command ${t} execution failed.`))})})}async function g(t){e.notice(`Pushing image: ${t}`),await a(`push ${t}`),e.notice("Pushed image")}async function u(t){e.info(`Removing image ${t}.`),await a(`image rm --force ${t}`),e.info("Removed image.")}async function c(t,i){e.notice(`Tagging image ${t} with ${i}`),await a(`tag ${t} ${i}`),e.notice("Tagged image")}function l(e,t){let i;"string"==typeof e?i=e:(i=`${e.host}/${e.owner}/${e.name}`,t=e.tag);const r=i.split("/").pop();return-1!==r.indexOf(":")||-1!==r.indexOf("@")?r:t?i+(t.startsWith("sha")?`@${t}`:`:${t}`):r}function f(e){if("boolean"==typeof e)return e;if("string"==typeof e){if("true"===(e=e.toLowerCase())||"t"===e)return!0;if("false"===e||"f"===e)return!1}}function d(e){return-1!==e.indexOf("://")?e.split("://").map(e=>d(e)).join("://"):e.replace(/\/+/g,"/")}const p={"!":"%21","#":"%23",$:"%24","&":"%26","'":"%27","(":"%28",")":"%29","*":"%2A","+":"%2B",",":"%2C","/":"%2F",":":"%3A",";":"%3B","=":"%3D","?":"%3F","@":"%40","[":"%5B","]":"%5D"};function h(e){const r=["git","clone"];"branch"===e.ref.type&&r.push(`--branch ${e.ref.value}`),r.push(`https://${e.user}:${function(e){let t="";for(let i=0;i<e.length;i++)t+=p[e[i]]||e[i];return t}(e.password)}@github.com/${t.context.repo.owner}/${t.context.repo.repo}`),r.push(e.directory),i.execSync(r.join(" "),{cwd:e.root})}Promise.resolve().then(async function(){e.info("Booting...");const p=function(){const t=f(e.getInput("cleanup"))??!0,i=e.getInput("dockerFileName")||"Dockerfile",r=e.getInput("dockerFilePath")||"",n=e.getInput("token",{required:!0}),s=f(e.getInput("gitTag"))??!0,o=e.getInput("gitTagPrefix"),a=e.getInput("gitUser",{required:!0}),g=e.getInput("gitPassword",{required:!0}),u=e.getInput("registryHost",{trimWhitespace:!0}),c=e.getInput("registryUser",{trimWhitespace:!0}),l=e.getInput("registryPassword",{trimWhitespace:!0}),d=e.getInput("registryRepository",{trimWhitespace:!0}),p=e.getInput("registryTag").split("\n").map(e=>e.trim()).filter(e=>""!==e);return 0===p.length&&p.push("latest"),{cleanup:t,dockerFileName:i,dockerFilePath:r,gitTag:s,gitTagPrefix:o,gitUser:a,gitPassword:g,registryHost:u,registryUser:c,registryPassword:l,registryRepository:d,registryTags:p,token:n,buildArgs:e.getInput("buildArgs").split(/\r?\n/).filter(Boolean)}}(),y=function(e){const t=e.split("/");if(!(t.length<3||"refs"!==t[0]))switch(t[1]){case"heads":return{type:"branch",value:t.slice(2).join("/")};case"pulls":return{type:"pull",value:t[2]};case"tags":return{type:"tag",value:t.slice(2).join("/")}}}(t.context.ref);if(!y)return void e.error("The git ref could not be parsed.");const m=process.cwd(),b=".output";e.info("Cloning github repository..."),h({ref:y,directory:b,root:m,user:p.gitUser,password:p.gitPassword});const $=r(t.context.ref),w=await async function(e){return(await a(`images -q ${e}`)).length>0}($);if(i.execSync(`echo "${p.registryPassword}" | docker login ${p.registryHost} -u ${p.registryUser} --password-stdin`),!w){let i=n.join(m,b);p.dockerFilePath.length>0&&(i=n.join(i,p.dockerFilePath)),e.info("Image does not exist."),await async function(t){e.notice(`Building image: ${t.imageId}`);let i="build .";const r=[["file",t.fileName],["tag",t.imageId]];if(t.labels){const e=Object.keys(t.labels);for(let i=0;i<e.length;i++)r.push(["label",`"${e[i]}=${t.labels[e[i]]}"`])}if(t.buildArgs)if(Array.isArray(t.buildArgs))for(let e=0;e<t.buildArgs.length;e++)r.push(["build-arg",`${t.buildArgs[e]}`]);else{const e=Object.keys(t.buildArgs);for(let i=0;i<e.length;i++)r.push(["build-arg",`${e[i]}=${t.buildArgs[e[i]]}`])}const n=[];for(let e=0;e<r.length;e++){const[t,i]=r[e];n.push(`--${t} ${i}`)}n.length>0&&(i+=` ${n.join(" ")}`);let o=t.cwd||process.cwd();s.isAbsolute(o)||(o=s.join(process.cwd(),o)),await a(i,{cwd:o}),e.notice("Built image")}({fileName:p.dockerFileName,cwd:i,imageId:$,labels:{runId:`${t.context.runId}`,runNumber:`${t.context.runNumber}`},buildArgs:p.buildArgs})}const x=d(`${p.registryHost}/${p.registryRepository}`).toLowerCase();let I;if(p.gitTag&&"tag"===y.type&&(e.info("Creating tags..."),(0===p.gitTagPrefix.length||y.value.startsWith(p.gitTagPrefix))&&(I=l(x,function(e,t){if(t&&e.startsWith(t)){if("@"===(e=e.substring(t.length))[0]&&o.valid(e.substring(1)))return e.substring(1);if("@"===e[0]&&"v"===e[1]&&o.valid(e.substring(2)))return e.substring(2)}return"v"===e[0]&&o.valid(e.substring(1))&&(e=e.substring(1)),e}(y.value,p.gitTagPrefix)),await c($,I),await g(I),await u(I)),e.info("Created tags.")),"tag"!==y.type||!p.gitTag||p.registryTags.length>0){e.info("Creating tags...");for(let e=0;e<p.registryTags.length;e++)I=l(x,p.registryTags[e]),await c($,I),await g(I),await u(I);e.info("Created tags.")}p.cleanup&&(e.info("Deleting built image..."),await u($),e.info("Deleted built image.")),i.execSync(`docker logout ${p.registryHost}`),e.info("Finished.")}).catch(t=>{t instanceof Error&&e.setFailed(t.message)});