Skip to content

Add comment to PR with preview link #19

Add comment to PR with preview link

Add comment to PR with preview link #19

Workflow file for this run

name: "Deploy to Dev"
on:
pull_request
# push:
# branches:
# - uswds-redesign
jobs:
deploy:
runs-on: self-hosted
steps:
# Step 1: Checkout the repo
- name: Checkout
uses: actions/checkout@v4
- name: Install project dependencies
run: |
sudo dnf -y install ruby3.2 ruby3.2-devel openssl-devel amazon-rpm-config gcc-c++
# Step 3: Set up Node.js
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
# node-version: 20 ## Using a .nvmrc file to stay in sync with the repo
# Step 2: Set up Ruby
- name: Set up ruby
run: |
ruby -v
echo 'export GEM_HOME="$HOME/gems"' >> $GITHUB_ENV
echo 'export PATH="$HOME/ec2-user/bin:$HOME/gems/bin:$PATH"' >> $GITHUB_ENV
# Step 4: Install Ruby Gems
- name: Install jekyll and bundler
run: |
sudo chmod -R 777 /usr/share
sudo gem install jekyll bundler
sudo bundle install
# Step 5: Install Node.js Dependencies
- name: Install npm dependencies
run: |
npm ci
# Step 6: Compile Assets
- name: Compile assets with Gulp
run: |
npm run gulp compile
# Step 7: Build Site
- name: Build the site
env:
JEKYLL_ENV: production
run: |
bundle exec jekyll build --baseurl /${{ github.event.number }}
# Step 8: Initialize AWS Connection
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ${{ vars.AWS_REGION }}
role-to-assume: arn:aws:iam::${{ secrets.TEST_ACCOUNT_ID }}:role/delegatedadmin/developer/ab2d-test-github-actions
# Step 9: Deploy to S3
- name: Deploy the site
run: |
aws s3 sync _site/ s3://website-ab2d-east-impl/${{ github.event.number }}/
# Step 10: Invalidate existing cache
# - name: Invalidate Cloudfront cache
# env:
# AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
# AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# AWS_REGION: us-east-1
# run: |
# aws cloudfront create-invalidation \
# --distribution-id ${{ secrets.DISTRIBUTION_ID }} \
# --paths "/*"
update-pr:
needs: deploy
runs-on: self-hosted
steps:
- name: Post or update comment
uses: actions/github-script@v6
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const sha = context.event_name === 'pull_request'
? context.payload.pull_request.head.sha
: context.payload.after;
const commitUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/commit/${sha}`;
const commentIdentifier = '## Deployment Success Message';
const body = `${commentIdentifier}
### URL: dyx9tyg1h7v8p.cloudfront.net/${github.event.number}/
Latest commit: [${sha.substring(0,7)}](${commitUrl})`;
async function findComment(issueNumber) {
if (!issueNumber) return null;
const comments = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
});
return comments.data.find((comment) =>
comment.body.includes(commentIdentifier)
);
}
async function createOrUpdateComment(issueNumber) {
if (!issueNumber) {
console.log('No issue number provided. Cannot post or update comment.');
return;
}
const existingComment = await findComment(issueNumber);
if (existingComment) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: existingComment.id,
body: body,
});
} else {
await github.rest.issues.createComment({
issue_number: issueNumber,
owner: context.repo.owner,
repo: context.repo.repo,
body: body,
});
}
}
if (context.eventName === 'pull_request') {
if (context.issue.number) {
await createOrUpdateComment(context.issue.number);
}
} else if (context.eventName === 'push') {
const pullRequests = await github.rest.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
head: `${context.repo.owner}:${context.ref.replace(
'refs/heads/',
''
)}`,
});
if (pullRequests.data.length > 0) {
await createOrUpdateComment(pullRequests.data[0].number);
} else {
console.log(
'No open pull request found for this push. Logging publish information to console:'
);
}
}