Enhance personal information handling in LaTeX build script and templates. Added support for conditional building of public and private versions based on the presence of a .secrets file. Improved formatting in cv.tex and resume.tex for better layout of personal information. Updated GitHub Actions workflow to cache TeX Live and streamline PDF generation process.

This commit is contained in:
2024-12-10 15:50:44 -05:00
parent 41df83b3ba
commit a7124f6c05
5 changed files with 162 additions and 67 deletions

View File

@@ -16,24 +16,36 @@ jobs:
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Cache TeX Live
uses: actions/cache@v3
with:
path: /tmp/texlive
key: texlive-${{ runner.os }}-${{ hashFiles('**/*.tex') }}
restore-keys: |
texlive-${{ runner.os }}-
- name: Set up TeX Live - name: Set up TeX Live
uses: xu-cheng/latex-action@v3 uses: xu-cheng/latex-action@v3
with: with:
root_file: | root_file: |
resume.tex resume.tex
cv.tex cv.tex
latexmk_use_xelatex: false
- name: Create public info file - name: Create public info file
run: | run: |
cat > personal_info.tex << EOL cat > personal_info.tex << EOL
% Public version of personal information % Public version of personal information
\newcommand{\personalName}{Sean O'Connor} \\newcommand{\\personalName}{Sean O'Connor}
\newcommand{\personalEmail}{Contact for details} \\newcommand{\\personalEmail}{sean@soconnor.dev}
\newcommand{\personalPhone}{} \\newcommand{\\personalPhone}{}
\newcommand{\personalWebsite}{soconnor.dev} \\newcommand{\\personalWebsite}{soconnor.dev}
\newcommand{\personalSchoolEmail}{} \\newcommand{\\personalSchoolEmail}{sso005@bucknell.edu}
\newcommand{\personalHomeAddress}{} \\newcommand{\\personalHomeAddressLineOne}{}
\newcommand{\personalSchoolAddress}{} \\newcommand{\\personalHomeAddressLineTwo}{}
\\newcommand{\\personalSchoolAddressLineOne}{}
\\newcommand{\\personalSchoolAddressLineTwo}{}
\\newcommand{\\personalSchoolAddressLineThree}{}
EOL EOL
- name: Upload Public PDFs as Release - name: Upload Public PDFs as Release
@@ -56,30 +68,45 @@ jobs:
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Cache TeX Live
uses: actions/cache@v3
with:
path: /tmp/texlive
key: texlive-${{ runner.os }}-${{ hashFiles('**/*.tex') }}
restore-keys: |
texlive-${{ runner.os }}-
- name: Set up TeX Live - name: Set up TeX Live
uses: xu-cheng/latex-action@v3 uses: xu-cheng/latex-action@v3
with: with:
root_file: | root_file: |
resume.tex resume.tex
cv.tex cv.tex
latexmk_use_xelatex: false
- name: Create private info file - name: Create private info file
env: env:
PERSONAL_EMAIL: ${{ secrets.PERSONAL_EMAIL }} PERSONAL_EMAIL: ${{ secrets.PERSONAL_EMAIL }}
PERSONAL_PHONE: ${{ secrets.PERSONAL_PHONE }} PERSONAL_PHONE: ${{ secrets.PERSONAL_PHONE }}
PERSONAL_SCHOOL_EMAIL: ${{ secrets.PERSONAL_SCHOOL_EMAIL }} PERSONAL_SCHOOL_EMAIL: ${{ secrets.PERSONAL_SCHOOL_EMAIL }}
PERSONAL_HOME_ADDRESS: ${{ secrets.PERSONAL_HOME_ADDRESS }} PERSONAL_HOME_ADDRESS_LINE1: ${{ secrets.PERSONAL_HOME_ADDRESS_LINE1 }}
PERSONAL_SCHOOL_ADDRESS: ${{ secrets.PERSONAL_SCHOOL_ADDRESS }} PERSONAL_HOME_ADDRESS_LINE2: ${{ secrets.PERSONAL_HOME_ADDRESS_LINE2 }}
PERSONAL_SCHOOL_ADDRESS_LINE1: ${{ secrets.PERSONAL_SCHOOL_ADDRESS_LINE1 }}
PERSONAL_SCHOOL_ADDRESS_LINE2: ${{ secrets.PERSONAL_SCHOOL_ADDRESS_LINE2 }}
PERSONAL_SCHOOL_ADDRESS_LINE3: ${{ secrets.PERSONAL_SCHOOL_ADDRESS_LINE3 }}
run: | run: |
cat > personal_info.tex << 'EOL' cat > personal_info.tex << 'EOL'
% Private version of personal information % Private version of personal information
\newcommand{\personalName}{Sean O'Connor} \\newcommand{\\personalName}{Sean O'Connor}
\newcommand{\personalEmail}{$PERSONAL_EMAIL} \\newcommand{\\personalEmail}{sean@soconnor.dev}
\newcommand{\personalPhone}{$PERSONAL_PHONE} \\newcommand{\\personalPhone}{${PERSONAL_PHONE}}
\newcommand{\personalWebsite}{soconnor.dev} \\newcommand{\\personalWebsite}{soconnor.dev}
\newcommand{\personalSchoolEmail}{$PERSONAL_SCHOOL_EMAIL} \\newcommand{\\personalSchoolEmail}{sso005@bucknell.edu}
\newcommand{\personalHomeAddress}{$PERSONAL_HOME_ADDRESS} \\newcommand{\\personalHomeAddressLineOne}{${PERSONAL_HOME_ADDRESS_LINE1}}
\newcommand{\personalSchoolAddress}{$PERSONAL_SCHOOL_ADDRESS} \\newcommand{\\personalHomeAddressLineTwo}{${PERSONAL_HOME_ADDRESS_LINE2}}
\\newcommand{\\personalSchoolAddressLineOne}{${PERSONAL_SCHOOL_ADDRESS_LINE1}}
\\newcommand{\\personalSchoolAddressLineTwo}{${PERSONAL_SCHOOL_ADDRESS_LINE2}}
\\newcommand{\\personalSchoolAddressLineThree}{${PERSONAL_SCHOOL_ADDRESS_LINE3}}
EOL EOL
envsubst < personal_info.tex > personal_info.tex.tmp envsubst < personal_info.tex > personal_info.tex.tmp
mv personal_info.tex.tmp personal_info.tex mv personal_info.tex.tmp personal_info.tex

View File

@@ -1,8 +1,26 @@
#!/bin/bash #!/bin/bash
# Source secrets if the file exists
if [ -f .secrets ]; then
source .secrets
else
echo "Warning: .secrets file not found. Building public version only."
PERSONAL_PHONE=""
PERSONAL_HOME_ADDRESS_LINE1=""
PERSONAL_HOME_ADDRESS_LINE2=""
PERSONAL_SCHOOL_ADDRESS_LINE1=""
PERSONAL_SCHOOL_ADDRESS_LINE2=""
PERSONAL_SCHOOL_ADDRESS_LINE3=""
fi
# Function to cleanup # Function to cleanup
cleanup() { cleanup() {
rm -f personal_info.tex.bak # Clean up LaTeX artifacts
rm -f *.aux *.log *.out *.fls *.fdb_latexmk *.synctex.gz *.bbl *.blg *.pdf
# Only restore backup if it exists
if [ -f personal_info.tex.bak ]; then
mv personal_info.tex.bak personal_info.tex
fi
} }
# Ensure cleanup runs even if script fails # Ensure cleanup runs even if script fails
@@ -11,45 +29,64 @@ trap cleanup EXIT
# Create output directory # Create output directory
mkdir -p output mkdir -p output
# Build public version # Backup current personal_info.tex if it exists
echo "Building public version..." if [ -f personal_info.tex ]; then
docker build --platform linux/arm64 -t resume-builder . cp personal_info.tex personal_info.tex.bak
docker run --platform linux/arm64 --rm -v "$(pwd)/output:/workspace/output" resume-builder bash -c "latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex cv.tex && cp *.pdf output/" fi
# Move files to final names # Build private version (if secrets are available)
mv output/resume.pdf output/resume-public.pdf if [ -n "$PERSONAL_PHONE" ] || [ -n "$PERSONAL_HOME_ADDRESS_LINE1" ] || [ -n "$PERSONAL_SCHOOL_ADDRESS_LINE1" ]; then
mv output/cv.pdf output/cv-public.pdf echo "Building private version..."
cat > personal_info.tex << EOL
# Build private version
echo "Building private version..."
# Backup current personal_info.tex
cp personal_info.tex personal_info.tex.bak
# Create private info file
cat > personal_info.tex << EOL
% Private version of personal information % Private version of personal information
\\newcommand{\\personalName}{Sean O'Connor} \\newcommand{\\personalName}{Sean O'Connor}
\\newcommand{\\personalEmail}{${PERSONAL_EMAIL:-}} \\newcommand{\\personalEmail}{sean@soconnor.dev}
\\newcommand{\\personalPhone}{${PERSONAL_PHONE:-}} \\newcommand{\\personalPhone}{${PERSONAL_PHONE}}
\\newcommand{\\personalWebsite}{soconnor.dev} \\newcommand{\\personalWebsite}{soconnor.dev}
\\newcommand{\\personalSchoolEmail}{${PERSONAL_SCHOOL_EMAIL:-}} \\newcommand{\\personalSchoolEmail}{sso005@bucknell.edu}
\\newcommand{\\personalHomeAddress}{${PERSONAL_HOME_ADDRESS:-}} \\newcommand{\\personalHomeAddressLineOne}{${PERSONAL_HOME_ADDRESS_LINE1}}
\\newcommand{\\personalSchoolAddress}{${PERSONAL_SCHOOL_ADDRESS:-}} \\newcommand{\\personalHomeAddressLineTwo}{${PERSONAL_HOME_ADDRESS_LINE2}}
\\newcommand{\\personalSchoolAddressLineOne}{${PERSONAL_SCHOOL_ADDRESS_LINE1}}
\\newcommand{\\personalSchoolAddressLineTwo}{${PERSONAL_SCHOOL_ADDRESS_LINE2}}
\\newcommand{\\personalSchoolAddressLineThree}{${PERSONAL_SCHOOL_ADDRESS_LINE3}}
EOL EOL
# Build private version using the same image docker build --platform linux/arm64 -t resume-builder .
docker run --platform linux/arm64 --rm -v "$(pwd):/workspace" -v "$(pwd)/output:/workspace/output" resume-builder bash -c "latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex cv.tex && cp *.pdf output/" docker run --platform linux/arm64 --rm \
-v "$(pwd):/workspace" \
-v "$(pwd)/output:/workspace/output" \
resume-builder bash -c "latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex cv.tex && mv *.pdf output/"
# Move files to final names
mv output/resume.pdf output/resume-private.pdf 2>/dev/null || true
mv output/cv.pdf output/cv-private.pdf 2>/dev/null || true
fi
# Build public version
echo "Building public version..."
cat > personal_info.tex << EOL
% Public version of personal information
\\newcommand{\\personalName}{Sean O'Connor}
\\newcommand{\\personalEmail}{sean@soconnor.dev}
\\newcommand{\\personalPhone}{}
\\newcommand{\\personalWebsite}{soconnor.dev}
\\newcommand{\\personalSchoolEmail}{sso005@bucknell.edu}
\\newcommand{\\personalHomeAddressLineOne}{}
\\newcommand{\\personalHomeAddressLineTwo}{}
\\newcommand{\\personalSchoolAddressLineOne}{}
\\newcommand{\\personalSchoolAddressLineTwo}{}
\\newcommand{\\personalSchoolAddressLineThree}{}
EOL
docker run --platform linux/arm64 --rm \
-v "$(pwd):/workspace" \
-v "$(pwd)/output:/workspace/output" \
resume-builder bash -c "latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex cv.tex && mv *.pdf output/"
# Move files to final names # Move files to final names
mv output/resume.pdf output/resume-private.pdf mv output/resume.pdf output/resume-public.pdf 2>/dev/null || true
mv output/cv.pdf output/cv-private.pdf mv output/cv.pdf output/cv-public.pdf 2>/dev/null || true
# Restore original personal_info.tex
mv personal_info.tex.bak personal_info.tex
echo "Build complete!" echo "Build complete!"
echo "Generated files in output/:" echo "Generated files in output/:"
echo "- resume-public.pdf" ls -l output/
echo "- cv-public.pdf"
echo "- resume-private.pdf"
echo "- cv-private.pdf"

37
cv.tex
View File

@@ -39,14 +39,36 @@
{\large \textscbf{\personalName}} {\large \textscbf{\personalName}}
\end{center} \end{center}
\vspace{0.5em}
\noindent \noindent
\begin{minipage}[t]{\textwidth} \begin{minipage}[t]{0.33\textwidth}
\centering \raggedright
\mbox{Personal: \personalEmail}% \ifx\personalSchoolAddressLineOne\empty\else
\ifx\personalSchoolEmail\empty\else \personalSchoolAddressLineOne\\%
\\\mbox{School: \personalSchoolEmail}% \personalSchoolAddressLineTwo\\%
\personalSchoolAddressLineThree%
\fi
\end{minipage}%
\hfill%
\begin{minipage}[t]{0.33\textwidth}
\centering
\href{mailto:\personalEmail}{\personalEmail}%
\ifx\personalSchoolEmail\empty\else
\\\href{mailto:\personalSchoolEmail}{\personalSchoolEmail}%
\fi
\ifx\personalPhone\empty\else
\\\personalPhone%
\fi
\\\href{https://\personalWebsite}{\personalWebsite}%
\end{minipage}%
\hfill%
\begin{minipage}[t]{0.33\textwidth}
\raggedleft
\ifx\personalHomeAddressLineOne\empty\else
\personalHomeAddressLineOne\\%
\personalHomeAddressLineTwo%
\fi \fi
\\\mbox{Website: \href{https://\personalWebsite}{\personalWebsite}}%
\end{minipage} \end{minipage}
\vspace{1em} \vspace{1em}
@@ -54,11 +76,10 @@
% Professional Summary Section % Professional Summary Section
\noindent \noindent
\begin{minipage}{\textwidth} \begin{minipage}{\textwidth}
Computer Science and Engineering student with extensive experience in software development, robotics research, and technical leadership. \textbf{Professional Summary:} Computer Science and Engineering student with extensive experience in software development, robotics research, and technical leadership.
Demonstrated track record of building scalable solutions and leading cross-functional teams. Demonstrated track record of building scalable solutions and leading cross-functional teams.
Published researcher in human-robot interaction with experience in both academic and commercial software development. Published researcher in human-robot interaction with experience in both academic and commercial software development.
\end{minipage} \end{minipage}
%\vspace{1em}
\resumesection{Education} \resumesection{Education}

View File

@@ -10,7 +10,10 @@
% School Information % School Information
\newcommand{\personalSchoolEmail}{your.school@university.edu} \newcommand{\personalSchoolEmail}{your.school@university.edu}
\newcommand{\personalSchoolAddress}{University Name\\Street Address\\City, State ZIP} \newcommand{\personalSchoolAddressLineOne}{University Name}
\newcommand{\personalSchoolAddressLineTwo}{Street Address}
\newcommand{\personalSchoolAddressLineThree}{City, State ZIP}
% Home Information % Home Information
\newcommand{\personalHomeAddress}{Street Address\\City, State ZIP} \newcommand{\personalHomeAddressLineOne}{Street Address}
\newcommand{\personalHomeAddressLineTwo}{City, State ZIP}

View File

@@ -39,33 +39,40 @@
{\large \textscbf{\personalName}} {\large \textscbf{\personalName}}
\end{center} \end{center}
\vspace{0.5em}
\noindent \noindent
\begin{minipage}[t]{0.33\textwidth} \begin{minipage}[t]{0.33\textwidth}
\raggedright \raggedright
Bucknell University \ifx\personalSchoolAddressLineOne\empty\else
\ifx\personalSchoolAddress\empty\else \personalSchoolAddressLineOne\\%
\\\personalSchoolAddress \personalSchoolAddressLineTwo\\%
\personalSchoolAddressLineThree%
\fi \fi
\end{minipage}% \end{minipage}%
\hfill%
\begin{minipage}[t]{0.33\textwidth} \begin{minipage}[t]{0.33\textwidth}
\centering \centering
\mbox{\personalEmail}% \href{mailto:\personalEmail}{\personalEmail}%
\ifx\personalSchoolEmail\empty\else \ifx\personalSchoolEmail\empty\else
\\\mbox{\personalSchoolEmail}% \\\href{mailto:\personalSchoolEmail}{\personalSchoolEmail}%
\fi \fi
\ifx\personalPhone\empty\else \ifx\personalPhone\empty\else
\\\mbox{\personalPhone}% \\\personalPhone%
\fi \fi
\\\href{https://\personalWebsite}{\personalWebsite}% \\\href{https://\personalWebsite}{\personalWebsite}%
\end{minipage}% \end{minipage}%
\hfill%
\begin{minipage}[t]{0.33\textwidth} \begin{minipage}[t]{0.33\textwidth}
\raggedleft \raggedleft
\ifx\personalHomeAddress\empty\else \ifx\personalHomeAddressLineOne\empty\else
Home Address\\ \personalHomeAddressLineOne\\%
\personalHomeAddress \personalHomeAddressLineTwo%
\fi \fi
\end{minipage} \end{minipage}
\vspace{1em}
\resumesection{Education} \resumesection{Education}
\textscbf{Bucknell University} \hfill \textscbf{Lewisburg, PA} \textscbf{Bucknell University} \hfill \textscbf{Lewisburg, PA}