From 94b58544efa158c50d6057581ce3328cf24c01fa Mon Sep 17 00:00:00 2001 From: Christoph Knittel Date: Sat, 15 Jun 2024 13:05:06 +0200 Subject: [PATCH] Add CI + test --- .github/workflows/ci.yml | 56 ++++++++++++++++++++++++++++++++++++++++ src/CI.res | 6 +++++ src/CI.resi | 1 + src/Main.res | 8 +++++- src/NewProject.res | 51 ++++++++++++++++++++++++------------ 5 files changed, 104 insertions(+), 18 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 src/CI.res create mode 100644 src/CI.resi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..3145a4c --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,56 @@ +name: CI + +on: + push: + branches: [master] + # See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet + tags: + - "v[0-9]+.[0-9]+.[0-9]+" + - "v[0-9]+.[0-9]+.[0-9]+-*" + + pull_request: + branches: [master] + +concurrency: + group: ci-${{ github.ref }}-1 + # Cancel previous builds for pull requests only. + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + build: + strategy: + fail-fast: false + matrix: + os: [ + macos-13, # x64 + macos-14, # ARM + ubuntu-latest, # x64 + buildjet-2vcpu-ubuntu-2204-arm, # ARM + # windows-latest, # deactivated for now as there is still a Windows issue + ] + + runs-on: ${{matrix.os}} + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: NPM install + run: npm ci + + - name: Build + run: npx rescript + + - name: Test + env: + CI: 1 + shell: bash + run: | + npm pack + npm i -g ./create-rescript-app-*.tgz + npx create-rescript-app diff --git a/src/CI.res b/src/CI.res new file mode 100644 index 0000000..5632632 --- /dev/null +++ b/src/CI.res @@ -0,0 +1,6 @@ +@val @scope("process.env") external ci: string = "CI" + +let isRunningInCI = switch ci { +| "1" | "true" | "TRUE" => true +| _ => false +} diff --git a/src/CI.resi b/src/CI.resi new file mode 100644 index 0000000..52d322f --- /dev/null +++ b/src/CI.resi @@ -0,0 +1 @@ +let isRunningInCI: bool diff --git a/src/Main.res b/src/Main.res index b16adba..6769ffa 100644 --- a/src/Main.res +++ b/src/Main.res @@ -35,7 +35,13 @@ https://rescript-lang.org`, let rescriptJsonPath = Path.join2(Process.cwd(), "rescript.json") let bsconfigJsonPath = Path.join2(Process.cwd(), "bsconfig.json") - if Fs.existsSync(rescriptJsonPath) || Fs.existsSync(bsconfigJsonPath) { + if CI.isRunningInCI { + P.note(~title="CI Mode", ~message="Running in CI, will create a test project") + await handleError(~outro="Project creation failed.", async () => { + await NewProject.createNewProject() + P.outro("CI test completed successfully.") + }) + } else if Fs.existsSync(rescriptJsonPath) || Fs.existsSync(bsconfigJsonPath) { ExistingRescriptProject.showUpgradeHint() P.outro("No changes were made to your project.") } else if Fs.existsSync(packageJsonPath) { diff --git a/src/NewProject.res b/src/NewProject.res index afa30fc..9554980 100644 --- a/src/NewProject.res +++ b/src/NewProject.res @@ -51,27 +51,15 @@ let getTemplateOptions = () => hint: shortDescription, }) -let createNewProject = async () => { - P.note(~title="New Project", ~message=newProjectMessage) - - let projectName = await P.text({ - message: "What is the name of your new ReScript project?", - placeholder: "my-rescript-app", - initialValue: ?Process.argv[2], - validate: validateProjectName, - })->P.resultOrRaise - - let templateName = - await P.select({message: "Select a template", options: getTemplateOptions()})->P.resultOrRaise - - let versions = await RescriptVersions.promptVersions() - +let createProject = async (~templateName, ~projectName, ~versions) => { let templatePath = CraPaths.getTemplatePath(~templateName) let projectPath = Path.join2(Process.cwd(), projectName) let s = P.spinner() - s->P.Spinner.start("Creating project...") + if !CI.isRunningInCI { + s->P.Spinner.start("Creating project...") + } await Fs.Promises.cp(templatePath, projectPath, ~options={recursive: true}) Process.chdir(projectPath) @@ -83,5 +71,34 @@ let createNewProject = async () => { await RescriptVersions.installVersions(versions) let _ = await Promisified.ChildProcess.execFile("git", ["init"]) - s->P.Spinner.stop("Project created.") + if !CI.isRunningInCI { + s->P.Spinner.stop("Project created.") + } +} + +let createNewProject = async () => { + P.note(~title="New Project", ~message=newProjectMessage) + + if CI.isRunningInCI { + // type versions = {rescriptVersion: string, rescriptCoreVersion: string} + await createProject( + ~templateName="rescript-template-basic", + ~projectName="test", + ~versions={rescriptVersion: "11.1.1", rescriptCoreVersion: "1.5.0"}, + ) + } else { + let projectName = await P.text({ + message: "What is the name of your new ReScript project?", + placeholder: "my-rescript-app", + initialValue: ?Process.argv[2], + validate: validateProjectName, + })->P.resultOrRaise + + let templateName = + await P.select({message: "Select a template", options: getTemplateOptions()})->P.resultOrRaise + + let versions = await RescriptVersions.promptVersions() + + await createProject(~templateName, ~projectName, ~versions) + } }