Rebase Demo #204
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Copyright (c) LieberLieber GmbH & Robert Bosch GmbH | |
# This Source Code Form is subject to the terms of the Mozilla Public | |
# License, v. 2.0. If a copy of the MPL was not distributed with this | |
# file, You can obtain one at https://mozilla.org/MPL/2.0/. | |
name: Trigger Rebase by Comments | |
on: | |
issue_comment: | |
types: [created] | |
env: | |
ModelName: DemoModel | |
ModelExtension: eapx | |
GitHubProjectRoot: https://github.com/LieberLieber/LemonTree.Automation.Workflows | |
jobs: | |
build: | |
defaults: | |
run: | |
shell: pwsh | |
runs-on: windows-latest | |
timeout-minutes: 15 | |
if: ${{ github.event.issue.pull_request && github.event.comment.body == '/rebase/'}} | |
steps: | |
- name: Post start message in PR | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
await github.rest.issues.createComment({ | |
issue_number: ${{github.event.issue.number}}, | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
body: 'Starting auto-rebase' | |
}) | |
- name: Retrieve Rull Request details | |
id: pr_details | |
uses: actions/github-script@v6 | |
with: | |
result-encoding: string | |
script: | | |
const response = await github.rest.pulls.list({ | |
owner: context.repo.owner, | |
repo: context.repo.repo | |
}) | |
if (response.status != 200) { | |
console.error("ohnoes") | |
process.exit() | |
} | |
const openPR = response.data | |
const filteredPRs = openPR.filter(pr => pr.number == ${{github.event.issue.number}}) | |
const triggeredPR = filteredPRs[0] | |
console.log(`Number: ${triggeredPR.number}`) | |
console.log(`Head: ${triggeredPR.head.ref}`) | |
console.log(`Base: ${triggeredPR.base.ref}`) | |
core.setOutput('number', triggeredPR.number) | |
core.setOutput('head', triggeredPR.head.ref) | |
core.setOutput('base', triggeredPR.base.ref) | |
- uses: actions/checkout@v4 | |
with: | |
lfs: true | |
fetch-depth: 0 | |
ref: ${{steps.pr_details.outputs.head}} #head instead of base for rebase | |
persist-credentials: false | |
token: ${{secrets.PAT}} #If default token of automation user is used, no workflows for merge commit are triggered | |
- name: Configure merge driver for EA files | |
run: | | |
echo "Setting lemontree merge-driver to 'no action'" | |
git config merge.lemontree.name "lemontree merge driver" | |
git config merge.lemontree.driver "echo Do nothing, manual merge required" | |
# download Lemontree.Automation on a runner and setup the license | |
- uses: LieberLieber/setup-LemonTree.Automation@v5 | |
id: GetLTA | |
with: | |
License: ${{secrets.LTALICENSE}} | |
#ExeLocation &"${{steps.GetLTA.outputs.LemonTreeAutomationExecutable}}" | |
- name: Rebase repository | |
id: Rebase | |
run: | | |
$env:GIT_EDITOR = "true" | |
$lta = '${{steps.GetLTA.outputs.LemonTreeAutomationExecutable}}' | |
$gitcmd = 'C:\Program Files\Git\git-cmd.exe' | |
Write-Output "set user config" | |
git config --global user.name 'LemonTree.Automation' | |
git config --global user.email 'support@lieberlieber.com' | |
Write-Output "setting remote state" | |
git remote set-url origin https://x-access-token:${{secrets.PAT}}@github.com/${{ github.repository }} | |
git status --porcelain --untracked-files=no --ignored=no | |
git rebase origin/main | |
while($LASTEXITCODE -ne 0) { | |
$actual_status = git status -s -uno | |
$expected_status = "UU ${{env.ModelName}}.${{env.ModelExtension}}" | |
if($actual_status -ne $expected_status) { | |
Write-Output "::error::Model is not conflicted please rebase manually." | |
echo "message=:x: Failed to rebase, the Model is not the only conflict." >> $env:GITHUB_OUTPUT | |
exit 666 | |
} | |
$basecommit = git merge-base HEAD REBASE_HEAD | |
$command = 'git cat-file blob {0}:${{env.ModelName}}.${{env.ModelExtension}} | git lfs smudge > ${{env.ModelName}}_base.${{env.ModelExtension}} & exit' -f $basecommit | |
#this is required to get rid of the line feeds in the basecommit string | |
&$gitcmd $command | |
&$gitcmd "git cat-file blob HEAD:${{env.ModelName}}.${{env.ModelExtension}} | git lfs smudge > ${{env.ModelName}}_mine.${{env.ModelExtension}} & exit" | |
&$gitcmd "git cat-file blob REBASE_HEAD:${{env.ModelName}}.${{env.ModelExtension}} | git lfs smudge > ${{env.ModelName}}_theirs.${{env.ModelExtension}} & exit" | |
&$lta merge --Base ${{env.ModelName}}_base.${{env.ModelExtension}} --Theirs ${{env.ModelName}}_theirs.${{env.ModelExtension}} --Mine ${{env.ModelName}}_mine.${{env.ModelExtension}} --out ${{env.ModelName}}.${{env.ModelExtension}} | |
if($LASTEXITCODE -eq 0){ | |
Write-Output "No merge conflicts, setting message" | |
echo "message=:heavy_check_mark: Rebase performed successfully" >> $env:GITHUB_OUTPUT | |
} | |
elseif($LASTEXITCODE -eq 2){ | |
Write-Output "::error::Internal Error when diffing. Please report such errors to support@lieberlieber.com" | |
echo "message=x: Rebase failed, check [action log](${{env.GitHubProjectRoot}}/actions/runs/${{ github.run_id }}) for details" >> $env:GITHUB_OUTPUT | |
exit 2 | |
} | |
elseif($LASTEXITCODE -eq 3){ | |
Write-Output "Merge conflicts present, auto-merge failed" | |
echo "message=:x: Merge conflicts present, auto-rebase failed" >> $env:GITHUB_OUTPUT | |
exit 3 | |
} | |
elseif($LASTEXITCODE -eq 6){ | |
Write-Output "::warning::Licensing issue of LemonTree.Automation" | |
echo "message=:x: Rebase failed, check [action log](${{env.GitHubProjectRoot}}/actions/runs/${{ github.run_id }}) for details" >> $env:GITHUB_OUTPUT | |
exit 6 | |
} | |
else{ | |
Write-Output "::error::Unknown error" | |
echo "message=x: Rebase failed, check [action log](${{env.GitHubProjectRoot}}/actions/runs/${{ github.run_id }}) for details" >> $env:GITHUB_OUTPUT | |
exit 1 | |
} | |
git add ${{env.ModelName}}.${{env.ModelExtension}} | |
Remove-Item -Path ${{env.ModelName}}_base.${{env.ModelExtension}} | |
Remove-Item -Path ${{env.ModelName}}_theirs.${{env.ModelExtension}} | |
Remove-Item -Path ${{env.ModelName}}_mine.${{env.ModelExtension}} | |
git rebase --continue | |
} | |
$env:GIT_EDITOR = "" | |
- name: Cleanup failed rebase | |
if: failure() | |
run: | | |
try{ | |
Remove-Item -Path ${{env.ModelName}}_base.${{env.ModelExtension}} | |
Remove-Item -Path ${{env.ModelName}}_theirs.${{env.ModelExtension}} | |
Remove-Item -Path ${{env.ModelName}}_mine.${{env.ModelExtension}} | |
git rebase --abort | |
} | |
catch{} | |
- name: Create commit | |
if: ${{ steps.mergeEA.outputs.result == 0 }} | |
run: | | |
echo "set user config" | |
git config --global user.name 'LemonTree.Automation' | |
git config --global user.email 'support@lieberlieber.com' | |
echo "setting remote state" | |
git remote set-url origin https://x-access-token:${{secrets.PAT}}@github.com/${{ github.repository }} | |
git status --porcelain --untracked-files=no --ignored=no | |
echo "pushing new commit" | |
git push --force-with-lease | |
- name: Create Finish Message in PR | |
if: always() | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
await github.rest.issues.createComment({ | |
issue_number: ${{steps.pr_details.outputs.number}}, | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
body: '${{steps.Rebase.outputs.message}}' | |
}) | |